關於 值類型 和 引用類型

不理解引用類型和值類型區別 的程序員將會給代碼引入 詭異的bug和性能問題(也就是咱們編程過程當中所說的「靈異事件」)
---某大神如是說程序員

廢話很少說,先上代碼:編程

Program類

class Program
    {
        static void Main(string[] args)
        {
            //這裏是引用Human類的屬性 不論他們是什麼類型 在這裏都是引用類型
            Human man1 = new Human(); //實例化man1並給屬性賦值
            man1.name = "Michael";
            man1.age = 24;

            Human man2 = man1; //本質上是把man2的地址指向man1地址指向的堆裏的內容  這裏man2 name 爲michael age爲24  

            man1.name = "Qiao"; //man1地址堆裏的內容改變了 也就意味着man2所指向的內容也改變了
            man1.age = 18;
            Console.WriteLine("man1:{0}/t{1}",man1.name,man1.age);
            Console.WriteLine("man2:{0}/t{1}",man2.name,man2.age);


            //這裏是類中本身的變量
            //string是一種特殊的引用類型 改變的是棧中的引用 堆中的數據並未改變
            string name = "siki";
            string name2 = "taikr";
            name2=name; 
            name = "google"; //在這裏至關於 name2=new name2(); 從新又定義了一個字符串  而不是改變原有的堆中的值

            //值類型 改變的是實際數值
            int age = 24;            
            int age2 = age;            
            age2 = 25;
            age = 20;

            Console.WriteLine("name={0},name2={1}",name,name2);
            Console.WriteLine("age={0},age2={1}", age, age2);
            Console.ReadKey();
        }
    }

Human類

class Human
    {
        public string name = "Michael";
        public int age = 20;
    }

輸出結果

man1:Qiao/t18
man2:Qiao/t18
name=google,name2=siki
age=20,age2=25

概念

  • 值類型

    值類型(value type):直接將內存存儲在棧內,由系統自動釋放資源的數據類型.基本數據類型賦值都屬於值傳遞,值傳遞傳遞的是實實在在的變量值,是傳遞原參數的拷貝,值傳遞後,實參傳遞給形參的值,形參發生改變而不影響實參。
    值類型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱爲值類型。值類型變量聲明後,無論是否已經賦值,編譯器爲其分配內存。
  • 引用類型

    引用類型(reference type): 引用類型之間賦值屬於引用傳遞。引用傳遞傳遞的是對象的引用地址,也就是它的自己(本身最通俗的理解)。引用傳遞:傳的是地址,就是將實參的地址傳遞給形參,形參改變了,實參固然被改變了,由於他們指向相同的地址。
    引用類型和C語言的指針很相像,當聲明一個類時,只在棧中分配一小片內存用於容納一個地址,而此時並無爲其分配堆上的內存空間。當使用 new 建立一個類的實例時,分配堆上的空間,並把堆上空間的地址保存到棧上分配的小片空間中。

區別

  • 1.它們存儲的位置不同,值類型通常儲存在棧中,引用類型的指針在棧空間,值在堆空間
  • 2.引用類型變量的賦值只複製對對象的引用,而不復制對象自己。引用類型的多個對象指向同一個地方時,修改某一個的時候,其它對象的值會發生改變。而將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。
相關文章
相關標籤/搜索