堆、棧、引用類型、值類型 記憶體分為堆和棧(PS:還有一種是靜態存儲區域 [記憶體分為這三種]),值類型的數據存儲在棧中,引用類型的數據存儲在堆中。 堆、棧: 堆和棧的區別: 棧是編譯期間就分配好的記憶體空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變數、值類型參數等都在棧記憶體中。 堆是程式運 ...
堆、棧、引用類型、值類型
記憶體分為堆和棧(PS:還有一種是靜態存儲區域 [記憶體分為這三種]),值類型的數據存儲在棧中,引用類型的數據存儲在堆中。
堆、棧:
堆和棧的區別:
- 棧是編譯期間就分配好的記憶體空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變數、值類型參數等都在棧記憶體中。
- 堆是程式運行期間動態分配的記憶體空間,你可以根據程式的運行情況確定要分配的堆記憶體的大小。
引用類型、值類型
- 1.將一個值類型變數賦給另一個值類型變數時,將複製包含的值。引用類型變數的賦值只複製對對象的引用,而不複製對象本身。
- 2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現介面。
- 3.值類型不可能包含 null 值:
- 4.每種值類型均有一個隱式的預設構造函數來初始化該類型的預設值。
- 5.
擴展:
裝箱:值類型轉換成引用類型
拆箱:引用類型轉換為值類型
實例:
.NET中哪些是值類型?哪些是引用類型?
案例展示:
class Program
{
static void Main(string[] args)
{
Person yaohongbo = new Person() { Name = "姚巨集波", Age = 29 };
Person lilei = new Person() { Name = "李雷", Age = 22 };
int age = yaohongbo.Age;
yaohongbo.Age = 27;
Person zhangsan = lilei;
lilei.Name = "李磊";
Console.WriteLine("yaohongbo的age:"+yaohongbo.Age);
Console.WriteLine("age:" + age);
Console.WriteLine("lilei的name:" + lilei.Name);
Console.WriteLine("zhangsan的name:" + zhangsan.Name);
Console.ReadKey();
}
}
class Person
{
public string Name { get; set; }//引用類型
public int Age { get; set; }//值類型
}
運行結果:
代碼說明:yaohongbo.Age是int類型,為值類型,所以代碼int age=yaohongbo.Age,是將yaohongbo.Age變數存儲的值複製了一份,然後讓變數age存儲這份拷貝,此拷貝和yaohongbo.Age無任何關係,所以我們才可以看到上面的輸出結果。
再看代碼:
Person zhangsan = lilei;
lilei.Name = "李磊";
Person為自定義類,為引用類型,而引用類型穿的是引用,變數zhangsan指向的數據和變數lilei是同一個記憶體地址,即同一個對象,而不是像值類型那樣,拷貝了一份變數lilei指向的數據給變數zhangsan。所以才會出現無論更改zhangsan韓式lilei的屬性值,其他一個都會改變的情況。
本篇就到這裡了,最後打個小廣告:QQ群: .NET 一步步一幕幕 群號:590170361 (加群備註:博客園看到的)