RCI*_*CIX 2 .net c# lambda closures value-type
好吧,我需要能够跟踪作为另一个对象的属性的值类型对象,如果没有这些属性实现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
Run Code Online (Sandbox Code Playgroud)
显然这需要对闭包的工作原理有所了解,但我的问题是:这是一个好主意还是一个肮脏的黑客和滥用封闭系统?
编辑:由于有些人似乎误解了我想说的内容,这里有一个控制台程序来演示它:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印出来5,然后10.
你偶然发现了着名的公案:关闭是一个穷人的对象.您正在使用Action<T>替换类型的属性getter T.这样的东西(稍微)可以用更动态的语言来减少一个脏技巧,因为它可以通过注入一个用你的日志记录功能装饰的getter来实现,但是在C#中,没有一种优雅的方式来对一个人的属性进行monkeypatch他们没想到.