C#-函数参数的值传递与引用传递

这里讨论下引用参数传递的一些tips

关于参数传递的具体解析,参考传递参数(C# 编程指南)

 

  • 传递一个引用的时候,改变参数的引用地址
    static void Foo(object o)
        {
            o = null;
            Console.WriteLine(o == null ? "NULL" : "NOT NULL");
        }

        object o = new object();
        Foo(o);
        Console.WriteLine(o == null ? "NULL" : "NOT NULL");
 
输出结果:

NULL
NOT NULL

     按引用传递的是参数得到的是一个引用的副本。在函数体内,参数的地址被改变(被设置成为NULL), 主函数中的对象O与函数参数中的O都指向同一个对象new object(),这里仅仅是将函数中参数的引用改变,所以对主函数中的对象O没有任何影响。同样的对一任何自定义类也是一样。

 

  1. 传递一个引用的时候,改变引用中string的值
    MyClass me = new MyClass();
    ChangeStringInClass(me);
    Console.WriteLine(me.myString);
  
    class MyClass
    {
        public string myString = "String in class";
    }

     static void ChangeStringInClass(MyClass my)
     {
         my.myString = "Changed string in class";
         Console.WriteLine(my.myString);
     }

   

     输出结果:

Changed string in class
Changed string in class

函数中的引用并没有改变,对于任何对对象的操作都在原对象上进行 
 
  1. 值传递的时候,改变值对象中string的值 
    struct MyStruct
    {
        public string myString;

        public MyStruct(string me)
        {
            myString = me;
        }

    }

     static void ChangeStringInStruct(MyStruct me)
     {
            me.myString = "String in struct changed.";
            Console.WriteLine(me.myString);
     }

    MyStruct ms = new MyStruct("String in struct.");
    ChangeStringInStruct(ms);
    Console.WriteLine(ms.myString);
 
输出结果 

String in struct changed.
String in struct.

结构体传递的时候是值传递,所以传递的是一个值的副本,对于副本的任何改变都不会影响原对象。 
 
 
 
posted @ 2012-08-18 16:48  refeiner  阅读(2326)  评论(0编辑  收藏  举报