考虑这个代码片段,并试着猜测什么y1
和y2
评估为为什么这两个函数不会返回相同的值?
static class Extensions
{
public static Func<T> AsDelegate<T>(this T value)
{
return() => value;
}
}
class Program
{
static void Main(string[] args)
{
new Program();
}
Program()
{
double x = Math.PI;
Func<double> ff = x.AsDelegate();
Func<double> fg =() => x;
x = -Math.PI;
double y1 = ff(); // y1 = 3.141..
double y2 = fg(); // y2 = -3.141..
}
}
你可能会说-Aha-双是一个值类型,因此通过扩展方法的返回值是的一个副本主要是x
。但是当你将上面的代码改为类的代表时,结果仍然不同。例如:
class Foo
{
public double x;
}
Program()
{
Foo foo = new Foo() { x=1.0 };
Func<Foo> ff = foo.AsDelegate();
Func<Foo> fg =() => foo;
foo = new Foo() { x = -1.0 };
double y1 = ff().x; // y1 = 1.0
double y2 = fg().x; // y2 = -1.0
}
所以这两个函数必须返回同一个类的两个不同实例。有趣的是,考虑到ff()
带有对局部变量foo
的引用,但fg()
没有,并且它依赖于当前范围内的内容。
那么当这两个代表被传递到代码的其他部分时,如果foo
实例不具有可见性,会发生什么情况?不管怎样,当扩展方法与代表组合时,谁拥有什么信息(数据)变得越来越不明确。
点击此答案,因为简洁+清晰度+格式。 – ja72 2010-11-09 18:21:04
咩...这一个:不绑定到一个*值*的东西(除了编译器生成捕获类的实例),和b:不严格绑定到“X” *都* - 更清晰的是,但由于这种简单性,我认为可能有点误导。 (虽然简单很好) – 2010-11-09 18:39:56
@Marc - 这是一个折腾。我想着重于用户看起来的方式,而不是深入实施。授予 – Bevan 2010-11-09 20:28:02