好的,我需要能够跟踪值类型对象,这些对象是另一个对象上的属性,如果这些属性不实现 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
显然,这需要对闭包的工作原理有一定的了解,但我的问题是:这是一个好主意还是一个肮脏的黑客行为和对封闭系统的滥用?
Edit:由于有些人似乎误解了我想说的内容,这里有一个控制台程序来演示它:
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
then 10
.
您偶然发现了著名的公案:关闭是穷人的目标。您正在使用Action<T>
替代 type 的属性获取器T
。在更动态的语言中,这样的事情会(稍微)不那么肮脏,因为它可以通过注入用日志记录函数装饰的 getter 来实现,但在 C# 中,没有一种优雅的方法可以在对某人的属性进行猴子修补时他们并不期待它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)