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();
}
}