1. 程式人生 > 其它 >值型別·引用型別

值型別·引用型別

技術標籤:c#

值型別和引用型別

今天樓樓在學習的時候,遇到了之前學習中一直有些迷糊的問題,咱們可以看看下面的程式碼

   public class Conputer
    {
        public void Sum(int sum1, int sum2)
        {
            int tump = sum1;
            sum1 = sum2;
            sum2 = tump;
        }
    }
    //
            public static void Main(string[] args)
        {
Conputer conp = new Conputer(); int sum1 = 13; int sum2 = 12; conp.Sum(sum1, sum2); Console.WriteLine("sum1的值是{0},sum2的值是{1}",sum1,sum2); }

之前樓樓因為分的不是很清,經常會錯,但是現在開始瞭解值型別和引用型別後,基本就很少錯了,這個時候我們說到了,值型別和引用型別,那麼什麼是值型別,什麼是引用型別呢。

值型別,我們說通俗易懂一些,就是會把不同的變數分配到不同的空間,每個變數都會開闢單獨空間,我們修改後互不影響。
由此我們可以得出,我們上面的程式碼的最後的執行結果,sum1是13,sum2是12,為什麼呢?其實這就是一個陷阱,故意把變數名寫的一樣,但是實際上是開闢了四個新的空間,我們呼叫的方法其實是沒有使用到的。
在這裡插入圖片描述
那麼,引用傳遞又是什麼呢?
引用型別,其實和值傳遞剛好是相對的,就是把原來物件引用傳遞給別的物件,用的還是同一塊儲存空間。引用型別的資料,如果直接賦值給其他物件,那等同於將原物件傳遞給另外一個物件,實際操作的還是同一個儲存空間
如果我們要實現引用型別要怎麼實現呢?在我們原來的程式碼基礎上,進行一些稍微的修改就可以了。

 public class Conputer
    {
        public void Sum(ref int sum1, ref int sum2)
        {
            int tump = sum1;
            sum1 = sum2;
            sum2 = tump;
        }
    }
    //
            public static void Main(string[] args)
        {
            Conputer conp = new Conputer();
            int sum1 = 13;
            int sum2 = 12;
            conp.Sum(ref sum1, ref sum2);
            Console.WriteLine("sum1的值是{0},sum2的值是{1}",sum1,sum2);
        }

我們可以看到,在原來變數的宣告前面加入了ref,而他的作用就是將我們的值型別轉化為引用型別。這個轉換和我們資料型別之間的轉換是同理的。
讓我們來看看最後的執行結果。
在這裡插入圖片描述
我們可以看到,在加入了ref後,我們的值交換的方法也成功運行了。
最後再小結一下,值型別,我們在進行變數的更改的時候,他最後的輸出結果是不會受到影響的,因為他每個都要屬於自己的空間,我們在第一個空間進行的更改是不會影響到第二個空間的。
但是引用型別他不同,相當與我把我的東西和別人共享了,別人在東西上面就行修改,我這邊也會同步修改,他不會變成別人的東西 ,實際操作的還是我的東西。
我們熟知的基本資料型別都是值型別,但是陣列介面這一類的,就是引用資料型別。
這是樓樓經過今天學習後的一些心得,他可能帶有錯誤,希望大家包涵,歡迎指正。