将对象作为参数传递

时间:2013-05-23 23:37:01

标签: c#

应用程序正在打印24但是当我们知道没有ref关键字时,只传递一个对象副本并且不对原始对象进行任何更改时,不应该打印18。 我创建了一个名为myclass的类和一个对象。 age是myclass类中的公共变量。 我已将me.age设置为18,并通过方法显示我已将其更改为24。

class Program
{        
    static void Main(string[] args)
    {
        myclass me = new myclass();
        me.age = 18;
        show(me);
        Console.WriteLine(me.age);
        Console.ReadLine();
    }

    public static void show( myclass you)
    {
        you.age = 24;        
    }
}

class myclass
{
    public int age;
}

5 个答案:

答案 0 :(得分:2)

正在印刷正确的东西。

myclass是一个对象,默认行为是在C#中传递对象的引用,所以当你没有指定任何东西时,你传递引用。

如果你声明struct myclass,你将拥有你想要的行为,因为默认情况下结构不是引用。

答案 1 :(得分:2)

不要混淆变量和变量指向的内容。

当你有:

MyClass myVar = new MyClass();
MyClass myVar2 = myVar;

这将只创建一个对象的实例,但是指向它的2个变量。

您的参数也发生了同样的事情:you是变量me的副本,但都指向同一个对象。因此,当您修改you.age时,您还要修改me.age

在你的功能中,如果你做了

you = new myClass();

只有这样,meyou才能引用不同的对象。如果您这样做,me仍将指向原始对象。

如果您将ref添加到参数you,那么如果您执行了

you = new myClass();

然后变量me将更新为指向同一个对象。

对于对象,您需要将变量与变量指向的变量分开。

答案 2 :(得分:2)

你可能会把它与C ++类混淆。在C#中,类是引用类型,这意味着只要有类的变量类,该变量不保存对象本身,它只包含引用它(你可以把它想象成一个指针)。因此,当您将对象传递给方法时,实际上会传递对该对象的引用。这意味着您正在观察的行为是正确的。

C#还支持使用struct而不是class创建的值类型(与Java不同)。如果您将myclass更改为srtuct,您将获得预期的行为。

答案 3 :(得分:1)

您会混淆值类型和引用类型。

public void addTwo(int a)
{
    a += 2;
}

...

int a = 5;
addTwo(a);
Console.WriteLine(a); // will give "5";

public void addTwo(ref int a)
{
    a += 2;
}

...

int a = 5;
addTwo(ref a);
Console.WriteLine(a); // will give "7";

对于引用类型(定义为class而不是struct的任何内容),您传递的是对对象的引用,而不是副本。所以您实际上是在更改对象。

答案 4 :(得分:0)

您正在向您的函数发送对象

不是原子类型或结构,因此它是通过引用发送的(这是C#的工作方式),在函数中此对象中更改的任何内容也将在原始对象中更改,因为它是相同的。

有关传递参数的更多信息:http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx