C#學習第五天
阿新 • • 發佈:2019-02-10
C#中的 is 和 as:
is 可用於任何型別。
例如
int a = 10;
a is Object ==true;
Object o = 10;
o is int ==true;
o = person;
o is int == false;
as 右側型別必須為引用型別或可空型別。
as操作如果失敗,不丟擲異常,而是返回null;
結構(struct)棧變數:
結構有如下與類不一樣的地方:
1、結構struct不能宣告預設構造方法(即無引數構造方法)。
struct Time
{
Time()//錯誤!結構不能宣告預設構造方法
{
}
}
2、在結構自定義構造方法內,所有例項欄位必須初始化。靜態欄位具有預設值並且靜態欄位可以賦予初始值。
3、編譯器為結構提供的預設構造方法被系統自動呼叫後,會初始化所有例項欄位,初始值為他們的預設值。即 0 null false等。
4、結構中所有的例項欄位不能包含初始化值。例如 private int id=0;//錯誤。例項初始化必須放到構造方法中(預設構造方法由系統呼叫,自定義構造方法由使用者呼叫)。個人認為,之所以結構這樣規定,是因為結構是類似於int,boolean、char等的簡單型別,防止使用未初始化的變數,如果結構允許存在別初始化的例項欄位,將導致使用了未初始化結構變數的錯誤。
struct Time { // public int ID=100; 結構中不能存在例項欄位初始值 public const String name = "Time";//常量正常存在,且不能修改 public static int stId ;//結構中static欄位可以存在初始值,預設為0 false null private int hour; public int miniute; /* * 結構不能包含顯示的預設構造方法(無引數構造方法) * 如果不提供結構自定義構造方法,那麼編譯器自動新增預設構造方法並初始化所有例項欄位,這也是結構不能存在例項初始化欄位的原因 public Time() { }*/ /* * 在結構自定義構造方法中,所有欄位必須初始化(無論欄位訪問級別如何) */ public Time(int hour) { this.hour = hour; miniute=10; //ID = 001; } }
使用結構:
//使用結構 public static void test() { Time time = new Time();//初始化 Console.WriteLine(time.miniute);//打印出0 Time time2;//未初始化 //因為是棧變數,所以宣告方式可以和其他棧型別int,boolean等一樣 // Console.WriteLine(time2.miniute);//Error。欄位未初始化 time2.miniute = 50; Console.WriteLine(time2.miniute);//ok。欄位已賦值 //上面兩種結構變數宣告方式所產生的值均在棧上。 int a = new int();//初始化 Console.WriteLine(a);//0 int b;//未初始化 // Console.WriteLine(b);error:使用了未賦值的變數 b = 10; Console.WriteLine(b);//OK }
結構複製:值
time.miniute = 38;
Time tm = time;//複製值。注意time必須使用構造方法的方式宣告
time.miniute = 28;//不會改變tm中棧變數的值
Console.WriteLine(tm.miniute);//列印38.