【发布时间】:2016-06-25 07:29:49
【问题描述】:
考虑以下问题
在设计框架时,会呈现一个暴露某些事件的接口
interface I
{
event MyEventHandler MyEvent
}
此接口最终将由许多不同的 3rd 方供应商实现,并可能被各种客户端使用。
由于每个供应商都可能使用无效数据更新事件参数,因此我作为框架作者的唯一控制是事件参数级别,因此我想到了以下模式:
class MyEventArgs
{
public int? MyProperty{get;}
MyEventArgs(int arg)
{
if(arg.IsInvalidArgument())//Let's pretend that there's such an extension method
throw new ArgumentException(...)
MyProperty = arg;
}
这确保了客户端不能使用某些流氓代码提供的无效值,因为构造函数会抛出异常,因此整数将没有分配值,使其成为空引用。
但是,这也会在客户端代码中产生开销,因为现在客户端必须检查 HasValue 然后访问 Value,这使得 EventArgument 对用户不太友好。当每个事件参数的参数数量增加时,变得更加麻烦。
我可以从技术上删除问号,这将使客户摆脱 Nullable 废话,因为在我看来,在上帝的绿地上没有办法获得对这种实例的引用,但是问题是这种情况虽然很容易测试,但可能有我从未想过的极端情况,因此我提出了问题。
是否有任何可能的方法来获取对其构造函数抛出异常的实例的引用并将其传递给事件侦听器?
【问题讨论】:
-
我真的不清楚你想问什么。首先,您在说什么“开销”?二、你到底想得到什么“参考”?
-
@CodeCaster 我已经编辑了我的问题。感谢您引起我的注意。开销是在事件参数类中为每个属性使用 Nullable API,引用是其构造函数抛出异常的引用。
标签: c# exception constructor defensive-programming