C# 如何很好地调用具有副作用的属性?

C# 如何很好地调用具有副作用的属性?,c#,C#,这纯粹是语言问题,因为我知道,这可能(甚至可能应该)以不同的方式解决 我们有一个属性Prop,它的getter有一些副作用。如何以“好”的方式“调用”此属性以触发这些副作用 单向: object dummy = this.Prop; 但这似乎不是一个好的解决方案,因为它涉及到创建不必要的变量。我试过: (() => this.Prop)(); 但它没有编译。有没有简洁明了的方法呢?如果你创建了一个变量,你会收到代码抱怨它没有被使用,这可能会让人恼火 对于基准测试案例,我有时会添加一个通

这纯粹是语言问题,因为我知道,这可能(甚至可能应该)以不同的方式解决

我们有一个属性
Prop
,它的getter有一些副作用。如何以“好”的方式“调用”此属性以触发这些副作用

单向:

object dummy = this.Prop;
但这似乎不是一个好的解决方案,因为它涉及到创建不必要的变量。我试过:

(() => this.Prop)();

但它没有编译。有没有简洁明了的方法呢?

如果你创建了一个变量,你会收到代码抱怨它没有被使用,这可能会让人恼火

对于基准测试案例,我有时会添加一个通用的
Consume()
扩展方法,它什么也不做:

public static void Consume<T>(this T ignored)
{
}
编译器会很高兴的。另一种选择是使用接受
Func
的方法:


在测试之外,我很少遇到这种情况(包括基准测试和“我应该能够在不引发异常的情况下调用属性”测试),但它经常是有用的,例如强制初始化类。每当您发现自己需要此属性时,都值得考虑是否将其作为一种更合适的方法。

是否可以更改包含此属性的类?如果是这样的话,查看属性是如何编码的将getter中的副作用移动到separate方法中会很有用吗?还有为什么在getter中会有副作用?除非副作用与获取(并希望获取)
Prop
的值有关,否则以这种方式触发副作用没有任何意义。正如您所看到的,您会得到外观难看的代码来触发副作用,而不需要
Prop
的值。当您发现自己需要副作用而不需要任何属性时,则它位于错误的位置。解决真正的问题。@OndrejSvejdar“这纯粹是语言问题,因为我知道,这可能会以不同的方式解决。”。如果有一种简单而优雅的方法可以做到这一点,那我们就称之为好奇吧。为什么不干脆禁用线路警告呢?使用getter处理副作用已经不是一件很好的事情了,几个pragma不会让事情变得更糟。@golergka:这取决于场景。我更愿意让我的代码表达我想要做的事情,这不是要有一个变量,而是要使用这个值。当然,你可以想出一个更清晰的名字——但从根本上说,我不认为像这样消费它有什么问题。
this.Prop.Consume();
public static void Consume<T>(Func<T> function)
{
    function();
}
Consume(() => this.Prop);