结构与类的区别

来源:http://mcdelfino.blog.51cto.com/2058744/661072

 不能为结构声明默认构造函数(一个无参数的构造函数).因为编译器始终会帮我们生成一个.在类中只有在没有自己写一个构造函数的前提下,编译器才 会帮我们生成一个默认构造函数.在编译器为结构生成的默认构造函数中,总是将字段设为0,false或者null,这和类是一样的.然而,在自己写的一个 构造函数中(再次提醒,这必须是一个非默认的构造函数),必须自己负责初始化所有字段,编译器不会再帮我们初始化它.这意味着必须在结构的所有非默认构造 函数中显式地初始化所有字段,否则会造成编译时错误.例如,假定把Time换成一个类,那么下面的例子是能通过编译的,而且seconds会被悄悄地初始 化为0.但是,由于Time是一个结构,所以它无法通过编译:

  1. struct Time 
  2.             { 
  3.                 public Time(int hh, int mm) 
  4.                 { 
  5.                     hours = hh; 
  6.                     minutes = mm; 
  7.                     //seconds = 0; 
  8.                 } 
  9.                 public int hours, minutes, seconds; 
  10.  
  11.             } 

修改:

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace ConsoleApplication1 
  7.     class Program 
  8.     { 
  9.         static void Main(string[] args) 
  10.         { 
  11.             try 
  12.             { 
  13.                 Time time0 = new Time(); 
  14.                 Console.WriteLine("{0}:{1}:{2}", time0.hours, time0.minutes, time0.seconds); 
  15.                 Time time1 = new Time(6, 25); 
  16.                 Console.WriteLine("{0}:{1}:{2}", time1.hours, time1.minutes, time1.seconds); 
  17.             } 
  18.             catch (Exception ex) 
  19.             { 
  20.                 Console.WriteLine(ex.Message); 
  21.             } 
  22.         } 
  23.  
  24.  
  25.  
  26.             struct Time 
  27.             { 
  28.                 public Time(int hh, int mm) 
  29.                 { 
  30.                     hours = hh; 
  31.                     minutes = mm; 
  32.                     seconds = 0; 
  33.                 } 
  34.                 public int hours, minutes, seconds; 
  35.  
  36.             } 
  37.      } 

 若是将Time声明为一个类,则可以不用将全部字段初始化,但是不会默认有无参数的构造函数,因此要自己写一个无参数的构造函数.

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace ConsoleApplication1 
  7.     class Program 
  8.     { 
  9.         static void Main(string[] args) 
  10.         { 
  11.             try 
  12.             { 
  13.                 Time time0 = new Time(); 
  14.                 Console.WriteLine("{0}:{1}:{2}", time0.hours, time0.minutes, time0.seconds); 
  15.                 Time time1 = new Time(6, 25); 
  16.                 Console.WriteLine("{0}:{1}:{2}", time1.hours, time1.minutes, time1.seconds); 
  17.             } 
  18.             catch (Exception ex) 
  19.             { 
  20.                 Console.WriteLine(ex.Message); 
  21.             } 
  22.         }            
  23.     } 
  24.     class Time 
  25.     { 
  26.         public Time() 
  27.         { 
  28.         }               //要定义无参数的构造函数,不会默认生成 
  29.         public Time(int hh, int mm) 
  30.         { 
  31.             hours = hh; 
  32.             minutes = mm;      
  33.         }               //可以不必将所有字段都初始化,会默认初始化为0 
  34.         public int hours, minutes, seconds; 
  35.     } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值