用于轮询属性的最简单的C#代码?

时间:2011-07-07 14:01:51

标签: c# properties

我想知道用于轮询属性值的最简单代码,以在其getter中执行代码。
目前我正在使用:instance.property.ToString();,但我宁愿有一些没有可能的副作用或不必要的开销。

8 个答案:

答案 0 :(得分:15)

(我假设你试图避免从简单地将值分配给未使用的变量而得到的警告。)

你可以写一个无操作的扩展方法:

public static void NoOp<T>(this T value)
{
    // Do nothing.
}

然后致电:

instance.SomeProperty.NoOp();

这不会包装值或触摸它 - 只需调用getter。超过ToString的另一个优点是,如果值为空引用,则不会发生这种情况。

每个值类型 需要对方法进行一次JIT编译,但这是一个相当小的成本......

答案 1 :(得分:5)

这听起来像是一个非常糟糕的主意。老实说,如果你在一个需要定期执行的getter中有逻辑,那就把它从getter中取出并粘贴在一个方法中。我不愿意跳进去维护这样的代码,一旦我终于找到为什么它正在做它会做什么我会重构它。

答案 2 :(得分:3)

我会将getter中的代码提取到一个函数中,并从getter和poller中调用该函数,如果这是一个选项。

答案 3 :(得分:0)

在变量中捕获它是最好的方法 - 除非吸气剂本身导致副作用,否则不会引起任何副作用。

var value = someObj.Property;

答案 4 :(得分:0)

我希望我理解正确。 首先

class MyClass
{
   public int Number{get;set;}
}

var cl = new MyClass();
cl.Number.ToString();

ToString()不一定返回值,对于原语,情况就是这样,但是对于其他更复杂的类,它通常只是完全限定名。我想这不是你想要的。

要执行getter,需要反思。

var propInfo = this.GetType().GetProperty("Number");
int val = (int)propInfo.GetValue(cl, null);

答案 5 :(得分:0)

我喜欢Jon Skeet的答案,但同样的,这也可以在不必编写扩展方法的情况下工作:

GC.KeepAlive(instance.SomeProperty);

KeepAlive方法接受object并且不对其执行任何操作,例如NoOp扩展方法。

答案 6 :(得分:0)

我认为您需要将代码移动到其他地方。因此,请尝试在“实例”对象的构造函数中设置全局变量。

OR .. (不确定你的全局变量是什么意思)但是如果它在一个对象中,那么你可以在你的全局对象上得到属性的getter来做一个延迟加载然后获得值。

string _myProp;
public string MyProp
{ 
   get
   {
     if (String.IsNullOrWhiteSpace(_myProp))
     {
        _myProp =  GetTheValueFromWhereEver();
     }
     return _myProp;
   }
}

(但你可能无法访问那里的'实例')

答案 7 :(得分:0)

即使这可能仍然是一个坏主意,我只想留下这个简洁的lambda解决方案:

((Func< [TYPE_OF_PROPERTY] >)(() => instance.Property))();