【发布时间】:2010-12-30 01:42:37
【问题描述】:
好的,我需要能够跟踪值类型对象,它们是另一个对象的属性,如果不让这些属性实现 IObservable 接口或类似接口,就无法做到这一点。然后我想到了闭包和 Jon Skeet 的著名例子,以及它如何打印出 9(或 10)次而不是数字的升序。所以我想为什么不这样做:
Class MyClass
{
...
Func<MyValueType> variable;
...
public void DoSomethingThatGetsCalledOften()
{
MyValueType blah = variable(); //error checking too not shown for brevity
//use it
}
...
}
... in some other consuming code ...
MyClass myClass = new MyClass();
myClass.variable = () => myOtherObject.MyOtherProperty;
//then myClass will get the current value of the variable whenever it needs it
显然,这需要对闭包的工作原理有所了解,但我的问题是:这是一个好主意还是一个肮脏的黑客和对闭包系统的滥用?
编辑:由于有些人似乎误解了我想说的话,这里有一个控制台程序来演示它:
using System;
using System.Linq;
namespace Test
{
class Program
{
public static void Main()
{
float myFloat = 5;
Func<float> test = () => myFloat;
Console.WriteLine(test());
myFloat = 10;
Console.WriteLine(test());
Console.Read();
}
}
}
这将打印出5,然后是10。
【问题讨论】:
-
我已经编辑了我的答案;希望它对您的代码的适用性(或不适用性!)更加清晰。
-
我个人认为您应该从问题中删除第一个示例;它实际上与您的问题无关。
-
我想这是一个很好的观点。
标签: c# .net lambda closures value-type