• 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创始人,感谢!  

  • 相关阅读:
    打开百度要用几步
    web渗透总结
    mysql之基本数据类型
    网络编程
    垃圾回收机制
    常用模块-hashlib,hmac,configparser,subprocess,xlrd,xlwt,xml,re
    常用模块-random,shutil,shevle,logging
    文件操作
    元组、字典、集合数据类型
    基本数据类型之列表类型
  • 原文地址:https://www.cnblogs.com/darrenji/p/3600388.html
Copyright © 2020-2023  润新知