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.