1. 程式人生 > >C#學習第五天

C#學習第五天

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.