以下代码的输出使我感到惊讶。我认为“ a”应包含对新创建对象的引用。有人可以解释为什么结果不是2吗?
class Program
{
static void Main(string[] args)
{
aclass a = new aclass();
Process(a);
Console.WriteLine(a.number);
Console.ReadLine();
}
static void Process(aclass a)
{
aclass temp = new aclass();
temp.number++;
//Console.WriteLine(temp.number);
a = temp;
a.number++;
//Console.WriteLine(a.number);
}
}
class aclass
{
public int number = 0;
}
编辑:这是一个面试问题。我只是意识到我很长时间以来一直误解了这个概念。尽管参数a引用了相同的地址,但它们与原始参数a有所不同。
您并没有更改实际的原始引用,只是更改了包含在参数中的引用,这些引用有些微不同,更改不会持久化回调用方。您可以使用out
或更改此行为ref
。
在这种情况下,您特别想使用ref
它,同时还要传递一个引用。
尝试:
class Program
{
static void Main(string[] args)
{
aclass a = new aclass();
Process(ref a);
Console.WriteLine(a.number);
Console.ReadLine();
}
static void Process(ref aclass a)
{
aclass temp = new aclass();
temp.number++;
//Console.WriteLine(temp.number);
a = temp;
a.number++;
//Console.WriteLine(a.number);
}
}
请记住,您正在使用分配一个全新的参考a = temp
。如果您只想更新最初传入的现有类,则可以执行以下操作:
a.number = temp.number;
a.number++;
这将消除对的需求ref
。
您可以在MSDN上阅读更多信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句