1. 程式人生 > >C#引數值傳遞與引用傳遞問題(我們需要時刻溫習基礎知識)

C#引數值傳遞與引用傳遞問題(我們需要時刻溫習基礎知識)

C#引數值傳遞與引用傳遞問題,太久沒有關注這些基礎的C#知識,導致很多東西都忘了,幸好有公司小培訓幫助補充了這些。

本次例子以傳遞類物件引數,對類物件的屬性值進行寫操作。(接著昨天寫序列化的程式碼來寫的)

    class Program
    {
        public static void Main(string[] args)
        {
            TestRefObject1();
            Console.Read();
        }


        public static void TestRefObject1()
        {
            TestSerializationObject obj1 = new TestSerializationObject();
            obj1.Attr3 = 0;
            AddAttr3_1(obj1);
            Console.WriteLine("1:"+obj1.Attr3);


            TestSerializationObject obj2 = new TestSerializationObject();
            obj2.Attr3 = 0;
            AddAttr3_2(ref obj2);
            Console.WriteLine("2:" + obj2.Attr3);


            TestSerializationObject obj3 = new TestSerializationObject();
            obj3.Attr3 = 0;
            AddAttr3_3(obj3);
            Console.WriteLine("3:" + obj3.Attr3);


            TestSerializationObject obj4 = new TestSerializationObject();
            obj4.Attr3 = 0;
            AddAttr3_4(ref obj4);
            Console.WriteLine("4:" + obj4.Attr3);


            string str1 = "nihao,";
            ChangeStr(str1);
            Console.WriteLine(str1);


            string str2 = "nihao,";
            ChangeStr(ref str2);
            Console.WriteLine(str2);


            int a1 = 0;
            ChangeInt(a1);
            Console.WriteLine(a1);


            int a2 = 0;
            ChangeInt(ref a2);
            Console.WriteLine(a2);
        }


        public static void ChangeInt(int a)
        {
            a++;
        }


        public static void ChangeInt(ref int a)
        {
            a++;
        }


        public static void ChangeStr(string str)
        {
            str = str + "haha";
        }


        public static void ChangeStr(ref string str)
        {
            str = str + "haha";
        }


        public static void AddAttr3_1(TestSerializationObject obj)
        {
            obj.Attr3++;
        }


        public static void AddAttr3_2(ref TestSerializationObject obj)
        {
            obj.Attr3++;
        }


        public static void AddAttr3_3(TestSerializationObject obj)
        {
            obj=new TestSerializationObject();
            obj.Attr3 = 5;
            obj.Attr3++;
        }


        public static void AddAttr3_4(ref TestSerializationObject obj)
        {
            obj = new TestSerializationObject();
            obj.Attr3 = 5;
            obj.Attr3++;
        }
    }
public class TestSerializationObject
    {
        public string Attr1
        {
            get;
            set;
        }


        public string Attr2
        {
            get;
            set;
        }


       public int Attr3
       {
           get;
           set;
       }
    }

先想想上面的程式碼的答案是什麼?








恩,答案是


這裡說明:由於類物件屬於引用型別,在進行引數傳遞時,會傳入棧中物件的地址。

對於引用型別:

1、在修改變數本身時,結果類似於值傳遞,即不會改變傳遞前的變數的值(本例中的string)
2、在修改變數的屬性或欄位時,才是引用傳遞,會影響到傳遞前的變數的值(本例中的類)
3、引數使用了ref後,才是真正的引用傳遞,不管修改變數本身還是修改變數的屬性或欄位,都會影響到傳遞前的變數的值

而值傳遞,只是傳遞了物件的值拷貝。

注意將例子中的TestSerializationObject類改為Struct,會出現什麼情況呢?

注意struct型別為值型別。

結果顯示為:


這樣子就對上了!

附上C#方法、類等預設訪問修飾符,這個部落格介紹的比較全:
http://blog.csdn.net/andrew_wx/article/details/6843426

想 想 想 想