1. 程式人生 > >C#基礎知識(十)——物件引用

C#基礎知識(十)——物件引用

一、物件的引用:

1、結構和類的區別:

值型別的值存在棧上,引用型別的棧上存的是地址,值是在堆上。

類:類是引用型別。類當中預設有一個無引數的建構函式,當在類中寫一個有引數的建構函式時,預設無引數的建構函式被幹掉了。類中寫建構函式引數列表中引數個數可以不確定。

結構:結構是值型別。在結構中預設的也有一個無引數的建構函式。在結構中寫一個有引數的建構函式,預設的無引數的建構函式還有,沒被幹掉。在結構中寫建構函式,要把所有的欄位都要完全賦值。

例子:

static void Main(string[] args)
{
    Person p1 = new Person();
    p1.Age = 20;
    p1.Gender = '男';

    Person p2 = new Person();
    p2 = p1;
    p2.Age = 100;
    p2.Gender = '女';
    Console.WriteLine(p1.Age);
    Console.WriteLine(p1.Gender);
    Console.WriteLine(p2.Age);
    Console.WriteLine(p2.Gender);
    Console.ReadKey();
}
public struct Person    //<span style="font-family: Arial, Helvetica, sans-serif;">public class Person是類,顯示結果為100女,100女;public struct Person是結構,顯示結果是20男,100女。</span>

{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    private char _gender;
    public char Gender
    {
        get { return _gender; }
        set { _gender = value; }
    }
    private int _age;
    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
    public void Show()
    {
        Console.WriteLine("{0}歲的{1}是傳智播客最可愛的{2}老師",_age,_name,_gender);
    }

}

2、堆和棧的區別:

棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義;區域性值型別變數、值型別引數等都在棧的記憶體中。

堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體大小。

3、值型別和引用型別的區別:

(1)將一個值型別變數賦值給另一個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不復制物件本身。

(2)值型別不可能派生出新的型別:所有的值型別均隱式派生自System.ValueType。但與引用型別相同的是,結構也可以實現介面。

(3)值型別不可能包含null值。

(4)每種值型別均有一個隱式的預設建構函式來初始化該型別的預設值。


4、繼承:型別轉換的四種情況

Student stu = new Student();
Person p = stu;
p.Show();
Console.ReadKey();

Person p = new Teacher();//如果new的是子類,轉換的時候,轉的是另一個子類,報異常。
Student stu = (student)p;
stu.SayHello();
Console.ReadKey();

Person p = new Teacher();//如果new的時候,new的是子類,那麼再轉換這個子類的時候,可以
Teacher t = (Teacher)p;
t.SayHi();

Person p = new Person();
Student stu = (Student)p;//父類物件不能直接轉換成子類,異常
stu.SayHello();
二、ArrayList和HashTable:

ArrayList,動態陣列,集合。可以將集合看作為“長度可變的,具有很多方法的陣列”。

使用時需要引用 System.Collections名稱空間

用法:

ArrayList arrayList = new ArrayList();
arrayList.Clear();//清空
arrayList.Contains(1);//判斷這個集合中是否包含這個元素
int num = arrayList.Count;//集合中元素的個數
int number = arrayList.IndexOf(2);//找某一元素對應的索引
int[] nums = { 1, 2, 3 };
arrayList.InsertRange(4, nums);//往某一個索引位置插入一個數組
arrayList.Remove(1);//移除第一個括號內的元素
arrayList.RemoveAt(1);//移除索引對應的值
arrayList.RemoveRange(3, 100);//從指定索引處開始移除,移除多少個,如果超出索引報異常
for (int i = 0; i < 100; i++)
{
    arrayList.Add(i);
}
arrayList.Reverse();//反轉
arrayList.Sort();//排序
HashTable,雜湊表,以鍵值對的形式儲存,鍵值對均是object型別。新增資料都是“鍵值對”的形式。表示鍵/值對的集合,這些鍵/值對根據鍵的雜湊程式碼進行組織。。