【发布时间】:2014-04-16 02:50:14
【问题描述】:
好的,所以我知道 C# 中值类型和引用类型之间的区别(我认为)。但是,下面的代码并不像我所期望的那样运行,因为我知道我对值类型和引用类型的了解。
delegate void SomeHandler();
static Action GetSomeHandler()
{
int x = 1;
SomeHandler a = delegate { Console.WriteLine(x); };
x = 2;
return a;
}
static void Main(string[] args)
{
SomeHandler a = GetSomeHandler();
a();
}
我很困惑,因为在我的 GetSomeHandler 方法中声明了一个局部变量“x”并将其初始化为 1。然后,声明 SomeHandler 类型的新委托“a”并将其分配给将“x”写入控制台的匿名方法。 然后将“x”分配给 2。最后,调用“a”并将“x”的值打印到控制台。
我希望输出为 1,因为“x”是一个 int(值类型),并且我假设当 2 分配给“x”时,它不会影响我在委托中使用的内容,因为该值会被复制而不是指向内存中的相同位置,但实际输出为 2!为什么!?
【问题讨论】:
-
代表不同。您实际上指的是委托内部和外部的同一个变量
x。这会导致很多与for循环的混淆:blogs.msdn.com/b/ericlippert/archive/2009/11/12/… -
@EdS。你能详细说明一下吗?
-
@Blorgbeard 为什么代表会有所不同?
-
@Jason 的回答很好地解释了这一点。您没有将
x传递 给委托人——委托人只是引用变量x,就像x = 2;一样。由于委托代码是在x设置为 2 之后执行的,所以这就是您看到的值。
标签: c# delegates closures pass-by-reference value-type