代码改变世界

C# 方法参数传递之值传递和引用传递

2011-08-15 17:34  DylanChan  阅读(717)  评论(1编辑  收藏  举报
1、大部分情况下,使用C#预定义的类型时,都是按照值传递使用的,比较复杂的情况是按照引用传递各种类型(值类型和引用类型),其实实质上的不同时对变量的操作方式上的不同
2、在c#内置基本类型当中,除了object和string外,都是值类型。同时,自己定义的类,也都是引用类型。因为自定义类全部继承自System.Object

3、 C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更改。若要通过引用传递参数,请使用refout关键字。out与ref类似,唯一的不同是ref修饰变量时,变量需要初始化,而out修饰变量时则不需要。

即:值传递操作变量副本,引用传递操作变量本身

(1)值传递值类型:

    class ValClass
    {
        static void AddValue(int x)
        {
            x++;
        }
        static void Main()
        {
            int i = 22;
            AddValue(i);
            Console.WriteLine(i);
            //输出结果:22
        }
    }
(2)引用传递值类型:
    class ReferenceClass
    {
        static void AddValue(ref int x)
        {
            x++;
        }
        static void Main()
        {
            int i = 22;
            AddValue(ref i);
            Console.WriteLine(i);
            //输出结果:23
        }
    }
(3)值传递引用类型:
    class ValClass
    {
        string str = "Definition Str In ValClass";
        static void ChangeVal(string str)
        {
            str = str + "was changed!";
        }
        static void Main()
        {
            string str = "Definition Str In Main";
            ChangeVal(str);//值传递
            Console.WriteLine(str);
            //输出结果:Definition Str In Main
        }
    }
(4)引用传递引用类型:
    class ValClass
    {
        string str = "ValClass.str";
        static void ChangeVal(ref string str)
        {
            str = "Str Was Changed In ValClass";
        }
        static void ChangeObj(ValClass vc)
        {
            vc.str = "Definition Str Again In ValClass";
        }
        static void Main()
        {
            string str = "Definition Str In Main";
            ChangeVal(ref str);//引用传递
            Console.WriteLine(str);
            //输出:Str Was Changed In ValClass
            Console.WriteLine("-------------------------");
            ValClass vc = new ValClass();
            Console.WriteLine(vc.str);
            //输出:ValClass.str
            ChangeObj(vc);//引用传递
            Console.WriteLine(vc.str);
            //输出:Definition Str Again In ValClass
        }
    }