C#學習筆記

1、構造方法
構造方法可以爲對象的屬性賦值,如果自己不定義構造方法,則會提供一個默認的無參數的構造方法。自己可以在類中定義構造方法,構造方法名字和類名相同,寫法基本和函數相同,只是不寫返回值類型,也無需返回值。構造方法通常爲public。調用構造方法只能使用new關鍵字進行調用。構造方法也支持重載。例:

public class Child
{
    int age;
    string name;
    public Child()
    {
        age = 12;
        name = "HelloWorld";
    }
    //根據參數實例化對象
    public Child(int ageTemp,string nameTemp)
    {
        age = ageTemp;
        name = nameTemp;
    }
}

Child xiaoming = new Child();//調用自己寫的無參構造方法
Child xiaohua = new Child(15,"xiaohua");//調用自己重載的有參構造方法

2、對象初始化器
在對象初始化時,可以使用對象初始化器來簡化寫法。使用初始化器時可以省略類名後面的圓括號。例:

public class Child
{
    int age;
    string name;
    public Child(int age,string name)
    {
        this.age = age;//通過this關鍵字訪問到類的age,並將形參age的值賦給類裏的age
        this.name = name;
    }
}
//使用無參的構造方法,然後依次賦值,這種寫法稍微麻煩點
Child xiaohua = new Child();
xiaohua.age = 12;
xiaohua.name = "xiaohua";

Child xiaoming = new Child{age = 23,name = "xiaoming"};//使用對象初始化器初始化,簡潔一些,類似於C語言的結構體的賦值
Child xiaohua= new Child(){age = 23,name = "xiaohua"};

3、C#值類型與引用類型。
值類型:int、bool、char、float、double… 引用類型:類(string也是類)、數組、接口。
值類型變量存儲的是值,在賦值的時候會創建值的副本,當自身修改時並不會影響前面被賦值的變量。
引用類型變量存儲的是對象的內存地址,賦值的時候會創建地址的副本,當自身修改時前面被賦值的變量還是指向了自身,故值也會被改變。(參照C語言指針操作)

Child c1 = new Child();
c1.age = 12;
Child c2 = c1;
c2.age = 10;
//此時c1和c2的年齡都是10,因爲類是引用類型

4、C#結構體。
結構體與類的操作基本相同,不同的是:結構是值類型,而類是引用類型;結構中不允許爲字段賦初值;結構中不允許定義無參的構造方法,且有參的構造方法需要在內部爲所有字段賦值;結構類型的變量可以不實例化。

5、ref與out關鍵字的使用
ref關鍵字可以讓值類型的變量在方法參數傳遞時按照引用類型傳遞。即在方法裏面修改值,方法外的那個實參也會被修改。需要注意的是,在調用方法的時候需要在變量名前面加上ref關鍵字說明一下,在定義方法時,也需要在形參的數據類型前面加上ref關鍵字;同時要注意的是,使用ref傳遞的參數必須有初值才行。
out關鍵字也可以讓值類型的數據在傳遞的時候按照引用類型傳遞,不同於ref的是,out關鍵字主要是用來獲取一個結果,ref是爲了傳參。當我們的方法需要返回多個返回值時,我們可以使用out關鍵字用來獲取想要返回的結果,然後在方法內部對其進行賦值。在調用的時候同樣需要加上out關鍵字標明,在調用前對值沒有要求。
ref使用案例:

public class Child

       {

              public int age = 9;

       }

       class Program

       {

              static void Main(string[] args)

              {

                     int age = 3;

                     Child xiaoming = new Child();

                     Console.WriteLine("我今年{0}歲了!",age);

                     Console.WriteLine("小明今年{0}歲了!",xiaoming.age);

                     Add(ref age);

                     Add(ref xiaoming.age);//參數爲類的字段也可以

                     Console.WriteLine("我今年{0}歲了!",age);

                     Console.WriteLine("小明今年{0}歲了!",xiaoming.age);

                     Console.ReadKey();

              }

              static public void Add(ref int age)

              {

                     age++;

                     Console.WriteLine("長大一歲了!");

              }

       }


out使用案例:

class Program

       {

              static void Main(string[] args)

              {

                     //使用out關鍵字可以讓方法返回多個值

                     int td, yd = 9;

                     GetData(out td,out yd);

                     Console.WriteLine("昨天是{0}號,今天是{1}號。",yd,td);

                     Console.ReadKey();

              }

              static public void GetData(out int td,out int yd)

              {

                     //方法內部必須爲其賦值

                     td = 13;

                     yd = 12;

              }

       }


6、泛型類
泛型類可以根據傳入的參數類型來生成該類型的類,其類似於C語言中的typedef,在編寫泛型類時僅需使用一個非關鍵字的東西佔位即可,而具體使用時再傳入參數,就可以得到一個將佔位的東西全部修改爲對應類型的類了。寫法:普通類名。這裏的T可以換成其他的名字
定義一個狗的類和貓的類,再定義一個泛型的籠子類,這樣傳入貓類則得到了一個貓的籠子,而傳入狗的類則得到了一個狗的類。例:

public class Dog

       {

              public string name;

              public int age = 0;

              public Dog(string name)

              {

                     this.name = name;

              }

       }



       public class Cat

       {

              private string name;

              public int age = 0;

              public Cat(string name)

              {

                     this.name = name;

              }

              public string Name

              {

                     set { name = value; }

                     get { return name; }

              }

       }



       public class Cage<T>

       {

              T[] array;

              readonly int SIZE;

              public int num;

              public Cage(int n)

              {

                     SIZE = n;

                     num = 0;

                     array = new T[SIZE];//實例化數組

              }

              //放入一個動物

              public void Push(T t)

              {

                     if (num < SIZE)

                     {

                           array[num++] = t;

                     }

                     else

                     {

                           Console.WriteLine("Cage is full");

                     }

              }



              public T Pop()

              {

                     if (num > 0)//如果還有動物

                     {

                           return array[--num];

                     }

                     else

                     {

                           Console.WriteLine("The Cage is Empty!");

                           return default(T);//返回一個默認的T

                     }

              }

       }

       class Program

       {

              static void Main(string[] args)

              {

                     var dogCage = new Cage<Dog>(1);

                     dogCage.Push(new Dog("A"));

                     dogCage.Push(new Dog("B"));

                     var dog = dogCage.Pop();

                     Console.WriteLine("name is :"+dog.name);

                     dog = dogCage.Pop();



                     var catCage = new Cage<Cat>(3);

                     catCage.Push(new Cat("A"));

                     catCage.Push(new Cat("B"));

                     for (int i = 0; i <= catCage.num; i++)

                     {

                           var cat = catCage.Pop();

                           Console.WriteLine("Cat name is "+cat.Name);

                     }

                     Console.ReadKey();

              }

       }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章