C#中的引用傳遞和值傳遞。


最近在寫項目中有同事碰到這樣的傳值問題,可能很多對這個參數的傳遞還有點疑惑,自己也是對這個基礎知識做一個回顧和鞏固。

首先什么是值類型和引用類型可以去園里看一下相關的資料,都有介紹。

常用值類型包括:int ,long ,bool,decimal,char,float 等

常用的引用類型包括:string,arry,delegate, interface,class 等

一。傳遞值類型參數

   向方法傳遞值類型變量意味着向方法傳遞變量的一個副本。方法內發生的對參數的更改對該變量中存儲的原始數據無任何影響。如果希望所調用的方法更改參數的值,必須使用 ref 或 out 關鍵字通過引用傳遞該參數。

   static void SquareInt(int x)
    {
        x *= x;
        System.Console.WriteLine("步驟二: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("步驟一: {0}", n);

        SquareInt(n);  
        System.Console.WriteLine("步驟三: {0}", n);
    }

以上通過值傳遞值類型,輸出:步驟一:5  步驟二:25  步驟三:5

    
        static void SquareInt(ref int x)
        {
            x *= x;
            System.Console.WriteLine("步驟二: {0}", x);
        }  

       static void Main()
        {
            int n = 5;
            System.Console.WriteLine("步驟一: {0}", n);

            SquareInt(ref n);
            System.Console.WriteLine("步驟三: {0}", n);
        }

以上通過引用傳遞值類型,輸出:步驟一:5  步驟二:25  步驟三:25

二。傳遞引用類型參數

引用類型的變量不直接包含其數據;它包含的是對其數據的引用。當通過值傳遞引用類型的參數時,有可能更改引用所指向的數據,如某類成員的值。但是無法更改引用本身的值;也就是說,不能使用相同的引用為新類分配內存並使之在塊外保持。若要這樣做,應使用 ref 或 out 關鍵字傳遞參數。

        public class People
        {
            public string name { get; set; }

            public int age { get; set; }
        }

       static void Main()
        {
            People model = new People();
            model.name = "張三";
            model.age = 18;
            System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age);
            Change(model);
            System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age);
        }

        private void Change(People model)
        {
            model.name = "李四";
            model = new People() { name = "王五", age = 20 };
            System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age);
        }

以上通過值傳遞引用類型,輸出:姓名:張三,年齡:18         姓名:王五,年齡:20        姓名:李四,年齡:18

        public class People
        {
            public string name { get; set; }

            public int age { get; set; }
        }

       static void Main()
        {
            People model = new People();
            model.name = "張三";
            model.age = 18;
            System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age);
            Change(ref model);
            System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age);
        }

        private void Change(ref People model)
        {
            model.name = "李四";
            model = new People() { name = "王五", age = 20 };
            System.Console.WriteLine("姓名:{0},年齡:{1}", model.name, model.age);
        }

以上通過引用傳遞引用類型,輸出:姓名:張三,年齡:18         姓名:王五,年齡:20        姓名:王五,年齡:20

二。傳遞特殊的引用類型參數string

string是引用類型,沒錯,但它的很多操作是與值類型看齊的,下面直接代碼演示

        static void Main()
        {
            string str1 = "張三";
            StringBuilder str2 = new StringBuilder();
            str2.Append("李四");
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());

            SwapStrings(str1, str2);
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
        }

        private void SwapStrings(string s1,StringBuilder s2)
        {
            s1 = "張三瘋";
            s2.Append("李四瘋");
            s2 = new StringBuilder();
            s2.Append("王五");
            System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
        }

以上通過值傳遞引用類型string,輸出:str1是張三str2是李四               str1是張三瘋str2是王五            str1是張三str2是李四李四瘋      

        static void Main()
        {
            string str1 = "張三";
            StringBuilder str2 = new StringBuilder();
            str2.Append("李四");
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());

            SwapStrings(ref str1, ref str2);
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
        }

        private void SwapStrings(ref string s1,ref StringBuilder s2)
        {
            s1 = "張三瘋";
            s2.Append("李四瘋");
            s2 = new StringBuilder();
            s2.Append("王五");
            System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
        }

以上通過引用傳遞引用類型string,輸出:str1是張三str2是李四               str1是張三瘋str2是王五           str1是張三瘋str2是王五    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM