c#-获取对其构造函数引发异常的实例的引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-获取对其构造函数引发异常的实例的引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2108字,纯文字阅读大概需要4分钟。
内容图文
![c#-获取对其构造函数引发异常的实例的引用](/upload/InfoBanner/zyjiaocheng/665/336aa0c88eca4b79b8bfd523ebdd4d9b.jpg)
考虑以下问题
设计框架时,会提供一个暴露某些事件的接口
interface I
{
event MyEventHandler MyEvent
}
该接口最终将由许多不同的第三方供应商实现,并且可能由各种客户端使用.
由于每个供应商都可能使用无效数据来更新事件arg,因此,作为框架作者,我唯一的控制权是在事件args级别,因此我想到了以下模式:
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的废话,因为在我看来,上帝的绿色世界上没有办法获得对此类实例的引用,但是问题是,这种情况虽然很容易测试,可能有一些我从未想过的极端情况,因此是我的问题.
是否有任何可能的方法来获取对实例的引用,该实例的构造函数已引发异常并将其传递给事件侦听器?
解决方法:
当构造函数抛出异常时,无法获取对该对象的引用(除非对象通过在抛出之前分发该对象进行协作;这不太可能是不良的设计).
因此,您的无效值对象无法访问.它的状态确实是无效的(默认已初始化),但是没有人可以看到它.这就像是内部损坏的虚拟机,试图发射导弹,但您已禁用了虚拟NIC.
此模式在各处使用.您已经使用了很多次而没有意识到.例如,如果您说new FileStream(null),将如何获得对该无效流的引用?你不能
只是做正常的事情.不过,您最好还是仔细考虑一下.
Is there any possible way to obtain a reference to an instance whose constructor had thrown an exception and pass it to the event listeners?
否.但这是一个可能的示例:
class C {
public static C Instance;
public C() {
Instance = this; //publish/leak
throw ...;
}
}
只是不要那样做.无论如何,这是不自然的代码.对象的构造函数通常不应做太多事情,它应使对象进入有效状态且不会引起副作用.副作用是发布对此的引用的唯一方法.
还有一个陷阱:如果存在终结器,则将在该对象上调用终结器.终结器很少见,因为在大多数情况下,非托管资源应由句柄类保存.因此,这个问题很少生效.但是终结器可以看到其对象的私有状态.确保它可以处理. FileStreams终结器可能会检查是否中止了初始化并且什么也不做.
内容总结
以上是互联网集市为您收集整理的c#-获取对其构造函数引发异常的实例的引用全部内容,希望文章能够帮你解决c#-获取对其构造函数引发异常的实例的引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。