var a = "test";
var @delegate = () => a;
Assert.AreEqual(@delegate(),"test"); //true
a = "12345678"
Assert.AreEqual(@delegate(),"test"); //still true, due to closure.
但是,如果变量a是类级别属性,那么第二个断言将返回什么 - 是真还是假?
例如,如果a代替
string _a;
string a {get {return _a;} set{_a = value;}}
如果a是方法而不是属性,我知道第二个断言将是假的。
答案 0 :(得分:4)
闭包捕获变量,而不是值。第二个断言是错误的。
此外,值得注意的是属性是方法。这个属性的get
set
对访问者
private string _a;
public string a
{
get { return _a; }
set { _a = value; }
}
实际上会生成这样的代码
private string _a;
public string get_a()
{
return _a;
}
public void set_a(string value)
{
_a = value;
}
变量等属性的使用只是语法糖
答案 1 :(得分:2)
他们的行为完全相同。
public void ClosureOverVariable()
{
var a = "x";
Func<string> d = () => a;
Console.WriteLine(d()); // print "x"
a = "y";
Console.WriteLine(d()); // print "y"
}
class Foo
{
public string X { get; set; }
}
public void ClosureOverProperty()
{
var a = new Foo
{
X = "a"
};
Func<string> d = () => a.X;
Console.WriteLine(d()); // prints "a"
a.X = "y";
Console.WriteLine(d()); // print "y"
}