.NET 基礎 一步步 一幕幕[面向對象之堆、棧、引用類型、值類型]

堆、棧、引用類型、值類型函數

內存分爲堆和棧(PS:還有一種是靜態存儲區域 [內存分爲這三種])spa

堆、棧:對象

堆和棧的區別:blog

  • 棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。
  • 堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。

 

引用類型、值類型接口

  • 1.將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。引用類型變量的賦值只複製對對象的引用,而不復制對象自己。
  • 2.值類型不可能派生出新的類型:全部的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也能夠實現接口。
  • 3.值類型不可能包含 null 值:
  • 4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
  • 5.

擴展:內存

  裝箱:值類型轉換成引用類型get

  拆箱:引用類型轉換爲值類型博客

實例:string

.NET中哪些是值類型?哪些是引用類型?it

案例展現:

 

    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 (加羣備註:博客園看到的)

相關文章
相關標籤/搜索