C#面試基礎知識點:值類型和引用類型(1)(填坑文)


時間:2019年08月19日


前言

今天去面試,技術主管問我值類型和引用類型有什么區別,面對如此基礎的知識只能怪自己沒有好好准備以及只顧寫代碼對一些基礎知識其然不知所以然,於是我含含糊糊回答了一番:

  • 值類型
  • 數據類型 int float double datetime等數據類型為值類型。
  • 引用類型
  • 類型 String,Array,List,Dictionary ,queue等都是引用類型,我們也可以自己用class定義引用類型。
  • 而這些類型最終都繼承Object類型。

技術主管:

  1. 值類型與引用類型都可以用Equals來比較嗎?
  2. 如何將一個數組a的值賦予數組b然后對b做修改而不影響原來的數組?

以上問題也就是技術主管平時遇到的坑吧。上述的我就不獻丑了,所以也是含糊其辭直接回答。所以在面試完了以后我專門針對性的上網查了資料,以下是我的總結,若有錯誤望博友多多指正_

C#值類型和引用類型

  • 類型
  • 值類型
  • 引用類型

基類(共同點)

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 坑!
總結:原來數組為引用類型,直接賦值等於是將每個元素的地址復制

  1. 如果是引用傳遞,可以直接將數組變量通過'='賦值
  2. 如果是值傳遞的話,那么可以使用 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};
 }

符合預期。

總結一些東西:

  1. 值類型與引用類型最終都繼承最終都繼承System.Object但值類型中間繼承System.ValueType。
    2。 對於引用類型以及值類型一定要分清,不然編程過程中容易出bug

更新

20190819 21:46 刪除了裝箱值類型 (現在還不清楚裝箱值類型是怎么寫上去的)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM