应用程序正在打印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;
}
答案 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();
只有这样,me
和you
才能引用不同的对象。如果您这样做,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