不能爲結構聲明默認構造函數(一個無參數的構造函數).因爲編譯器始終會幫我們生成一個.在類中只有在沒有自己寫一個構造函數的前提下,編譯器纔會幫我們生成一個默認構造函數.在編譯器爲結構生成的默認構造函數中,總是將字段設爲0,false或者null,這和類是一樣的.然而,在自己寫的一個構造函數中(再次提醒,這必須是一個非默認的構造函數),必須自己負責初始化所有字段,編譯器不會再幫我們初始化它.這意味着必須在結構的所有非默認構造函數中顯式地初始化所有字段,否則會造成編譯時錯誤.例如,假定把Time換成一個類,那麼下面的例子是能通過編譯的,而且seconds會被悄悄地初始化爲0.但是,由於Time是一個結構,所以它無法通過編譯:
- struct Time
- {
- public Time(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- //seconds = 0;
- }
- public int hours, minutes, seconds;
- }
修改:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- Time time0 = new Time();
- Console.WriteLine("{0}:{1}:{2}", time0.hours, time0.minutes, time0.seconds);
- Time time1 = new Time(6, 25);
- Console.WriteLine("{0}:{1}:{2}", time1.hours, time1.minutes, time1.seconds);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- struct Time
- {
- public Time(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- seconds = 0;
- }
- public int hours, minutes, seconds;
- }
- }
- }
若是將Time聲明爲一個類,則可以不用將全部字段初始化,但是不會默認有無參數的構造函數,因此要自己寫一個無參數的構造函數.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- Time time0 = new Time();
- Console.WriteLine("{0}:{1}:{2}", time0.hours, time0.minutes, time0.seconds);
- Time time1 = new Time(6, 25);
- Console.WriteLine("{0}:{1}:{2}", time1.hours, time1.minutes, time1.seconds);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- }
- class Time
- {
- public Time()
- {
- } //要定義無參數的構造函數,不會默認生成
- public Time(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- } //可以不必將所有字段都初始化,會默認初始化爲0
- public int hours, minutes, seconds;
- }
- }