【发布时间】:2019-05-25 03:59:05
【问题描述】:
我正在尝试以一种限制错误表面积的方式编写代码,只公开我希望public 用户能够使用的内容。
在这种情况下,我有一个Action,我希望public 用户能够订阅或取消订阅。但是,我不希望这些用户能够对其他用户产生不利影响,即取消订阅 EVERYBODY。
public class X
{
public static Action a;
}
public class Mistake
{
public void Oops()
{
X.a = null;
// I just cleared ALL subscribers to X.a - not just my own subscription.
}
}
解决此问题的一种方法是隐藏Action 本身,而是提供对其进行sub/unsub 的方法:
public class X
{
static Action _a;
public static void SubA(Action cb) =>
_a += cb;
public static void UnsubA(Action cb) =>
_a -= cb;
}
这行得通 - 犯类似的错误已经非常困难了。但是,它比我想要的要冗长一些。
因此我的问题是:
是否有任何“好”/惯用的方式来允许公开X.a += ... 和X.a -= ...,但不允许公开X.a = null;?
我尝试使用自动属性 public static Action A { get; private set; },但正如预期的那样,这阻止了 += 和 -= 的公开使用。
我怀疑可能有一种方法可以在 X.a 周围放置一个包装属性,其设置器在 value == null 时抛出/不做任何事情,但即使这样有效,我觉得它仍然非常冗长。
如果 Action 无法做到这一点,但事件/委托(我对此知之甚少)可能会实现大致相似的事情,我也会感兴趣!
希望你们都在享受节日吗????
【问题讨论】: