zoukankan      html  css  js  c++  java
  • 07参数的传递

      值类型参数按值传递

        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; 
               
            } 
        }

    结果:
    1

    可见,值类型参数在被方法调用的时候,是对本身实例的拷贝和操作,在方法调用前后参数值不变。

     

      引用类型参数按值传递

    当引用类型参数传递时,是对托管堆上对象实例内容的操作。
    也就是引用类型按值传递,传递的是引用变量的指针,指向托管堆上的对象实例。

        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; 
        }
     

    结果
    2
    可见,引用类型参数在被方法调用的时候,是针对变量的引用的操作,一旦引用对象内容发生改变,原来变量的值也随着改变。

     

      按引用传递 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"; 
            } 
        }
     

    5

    可见,不管是值类型,还是引用类型,加入关键字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"; 
            } 
        }

    结果:
    3


    4

    可见,虽然string是引用类型,但按值传递的表现和值类型按值传递的表现一样。

     

      总结

    ● 引用类型按值传递,改变的是引用变量指向的托管堆上对象实例的内容。
    ● 引用类型按引用传递,改变的是引用变量指向的托管堆上对象实例的地址。

     

    参考资料
    《你必须知道的.NET》--王涛worktile创始人,感谢!  

  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/darrenji/p/3600388.html
Copyright © 2011-2022 走看看