C#基礎知識(十)——物件引用
阿新 • • 發佈:2019-01-26
一、物件的引用:
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、繼承:型別轉換的四種情況
二、ArrayList和HashTable: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,動態陣列,集合。可以將集合看作為“長度可變的,具有很多方法的陣列”。
使用時需要引用 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型別。新增資料都是“鍵值對”的形式。表示鍵/值對的集合,這些鍵/值對根據鍵的雜湊程式碼進行組織。。