[TOC] 時間:2019年08月19日 前言 今天去面試,技術主管問我值類型和引用類型有什麼區別,面對如此基礎的知識只能怪自己沒有好好準備以及只顧寫代碼對一些基礎知識其然不知所以然,於是我含含糊糊回答了一番: 值類型 數據類型 int float double datetime等數據類型為值類型。 ...
目錄
時間:2019年08月19日
前言
今天去面試,技術主管問我值類型和引用類型有什麼區別,面對如此基礎的知識只能怪自己沒有好好準備以及只顧寫代碼對一些基礎知識其然不知所以然,於是我含含糊糊回答了一番:
- 值類型
- 數據類型 int float double datetime等數據類型為值類型。
- 引用類型
- 類型 String,Array,List,Dictionary ,queue等都是引用類型,我們也可以自己用class定義引用類型。
- 而這些類型最終都繼承Object類型。
技術主管:
- 值類型與引用類型都可以用Equals來比較嗎?
- 如何將一個數組a的值賦予數組b然後對b做修改而不影響原來的數組?
以上問題也就是技術主管平時遇到的坑吧。上述的我就不獻醜了,所以也是含糊其辭直接回答。所以在面試完了以後我專門針對性的上網查了資料,以下是我的總結,若有錯誤望博友多多指正^_^。
C#值類型和引用類型
- 類型
- 值類型
- 內置類型:(內置類型表)
- 用戶自定義類型:(struct)
- 枚舉:(enum)
- 引用類型
- 內置引用類型:(內置引用類型)
- 類(class)
- 委托
- 數組
- 介面類型(interface)
- void
- var
基類(共同點)
C#所有類型均繼承System.Object
值類型繼承基類(不同點)
值類型->ValueType->Object
應用類型繼承
引用類型不會繼承ValueType。引用類型可以繼承其他類型
技術經理的問題
值類型與引用類型都可以用Equals來比較嗎?
在Object中Equal的方法,可以辨別兩個對象是否是一個對象的方法。
**註意,上面這句話很關鍵 必須是一個對象並且值一樣**
引用類型以及值類型使用Obejct進行數據比較
public class test1
{
public string name { get; set;}
public int age { get; set; }
}
static void Main(string[] args)
{
test1 ts1 = new test1();
ts1.name = "lele";
ts1.age = 10;
test1 ts2 = new test1();
ts2.name = "lele";
ts2.age = 10;
bool isZLX= ts1.name.Equals(ts2.name);//值類型比較返回 true
bool isYYLX = ts1.Equals(ts2); //引用返回 false
}
通過以上的代碼測試得出結論值類型是比較兩個對象是否是相同記憶體地址
如何將一個數組a的值賦予數組b然後對b做修改而不影響原來的數組?
剛開始回答比較簡單粗暴上代碼:
static void Main(string[] args)
{
int[] a = { 1, 2 };
int[] b = a; \\輸出: a={1,2} , b={1,2};
b[0] = 2; \\這時我做了修改 輸出: a={2,2} ,b={2,2}
}
總結
以上可以看到不是我期望的那樣不影響原數組a 坑!
總結:原來數組為引用類型,直接賦值等於是將每個元素的地址複製
- 如果是引用傳遞,可以直接將數組變數通過'='賦值
- 如果是值傳遞的話,那麼可以使用 Array.Copy() 方法或者是Buffer.BlockCopy(),也可以通過數組變數.Clone()或者是Copy()方法
static void Main(string[] args)
{
int[] i = { 1, 2 };
int[] b = (int[])i.Clone();\\輸出: a={1,2} , b={1,2};
b[0] = 2;\\輸出: a={1,2} , b={2,2};
}
符合預期。
總結一些東西:
- 值類型與引用類型最終都繼承最終都繼承System.Object但值類型中間繼承System.ValueType。
2。 對於引用類型以及值類型一定要分清,不然編程過程中容易出bug
更新
20190819 21:46 刪除了裝箱值類型 (現在還不清楚裝箱值類型是怎麼寫上去的)。