日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#中參數的傳遞方式詳解_C#教程

作者:Darren?Ji ? 更新時間: 2022-09-24 編程語言

值類型參數按值傳遞

    class Program 
    { 
        static void Main(string[] args) 
        { 
            int a = 10; 
            Add(a); 
            Console.WriteLine("傳遞之后的值為:" + a); 
            Console.ReadKey(); 
        }
 
        private static void Add(int i) 
        { 
            Console.WriteLine("傳遞之前的值為:" + i); 
            i = i + 10; 
           
        } 
    }

結果:

可見,值類型參數在被方法調用的時候,是對本身實例的拷貝和操作,在方法調用前后參數值不變。

引用類型參數按值傳遞

當引用類型參數傳遞時,是對托管堆上對象實例內容的操作。
也就是引用類型按值傳遞,傳遞的是引用變量的指針,指向托管堆上的對象實例。

    class Program 
    { 
        static void Main(string[] args) 
        { 
            Student student = new Student(); 
            Add(student); 
            Console.WriteLine("參數傳遞之后的值為:" +student._score); 
            Console.ReadKey(); 
        }
 
 
        private static void Add(Student s) 
        { 
           Console.WriteLine("參數傳遞之前的值為:" + s._score); 
            s._score = 90; 
        } 
    }
 
    public class Student 
    { 
        public int _score = 80; 
    }

結果

可見,引用類型參數在被方法調用的時候,是針對變量的引用的操作,一旦引用對象內容發生改變,原來變量的值也隨著改變。

按引用傳遞 ref和out

引用類型參數按值傳遞和按引用傳遞的不同之處:

  • 按值傳遞,傳遞的是參數本身的值,即引用指針。
  • 按引用傳遞,傳遞的是參數的地址,也就是實例指針。

另外,值類型也有按引用傳遞,這時候,傳遞的是值類型的地址。

   class Program 
    { 
        static void Main(string[] args) 
        { 
            int i = 100; 
            string str = "one"; 
            ChangeByValue(ref  i); 
            ChangeByRef(ref str); 
            Console.WriteLine(i); 
            Console.WriteLine(str);
 
            Console.ReadKey(); 
        }
 
        private static void ChangeByValue(ref int iValue) 
        { 
            iValue = 200; 
        }
 
        private static void ChangeByRef(ref string sValue) 
        { 
            sValue = "One more"; 
        } 
    }

可見,不管是值類型,還是引用類型,加入關鍵字ref作為參數,就意味著是對參數地址的操作,即托管堆上實例地址的改變。

另外:

  • 如果需要按引用傳遞,方法的定義和方法的調用,都要顯式地使用ref和out。
  • 如果一個方法的參數除了ref和out關鍵字不同,還有其他參數不同,這才構成方法的2個重載。如果僅僅ref和out關鍵字不同,會報錯"...不能僅在ref和out上有差別的重載方法"。

ref和out使用時的不同點:

out告訴編譯器,參數會在方法內部初始化,而在方法之前不需要初始化。

int x;
Foo(out x);

ref告訴編譯器,參數在方法之前必須初始化。

int y = 0;
Foo(ref y);

特殊引用類型string的傳遞

    class Program 
    { 
        static void Main(string[] args) 
        { 
            string str = "Old String"; 
            Console.WriteLine("傳遞之前的值為:" + str); 
            ChangeStr(str); 
            Console.WriteLine("傳遞之后的值為:"+str); 
            Console.ReadKey(); 
        }
 
        private static void ChangeStr(string astr) 
        { 
            astr = "Change String"; 
        } 
    }

結果:

可見,雖然string是引用類型,但按值傳遞的表現和值類型按值傳遞的表現一樣。

總結

  • 引用類型按值傳遞,改變的是引用變量指向的托管堆上對象實例的內容。
  • 引用類型按引用傳遞,改變的是引用變量指向的托管堆上對象實例的地址。

原文鏈接:https://www.cnblogs.com/darrenji/p/3600388.html

欄目分類
最近更新