正确实现IDisposable时,大多数实现(包括框架指南)都建议包含一个private bool disposed;成员,以便安全地允许多次调用Dispose(),Dispose(bool)并在适当时抛出ObjectDisposedException.
这适用于单个类.但是,当您从可支配资源中继承子类,并且子类包含其自己的本机资源和唯一方法时,事情会变得有点棘手.大多数示例都展示了如何Dipose(bool disposing)正确覆盖,但不要超出处理范围ObjectDisposedException.
在这种情况下,我有两个问题.
第一:
子类和基类都需要能够跟踪处置状态.我知道有几个主要选项 -
1)声明私人布尔处置; 在这两个班级.每个类跟踪它自己的this.disposed,并根据需要抛出.
2)使用protected bool Disposed {get; 私人集; 而不是一个字段.这将让子类检查处置状态.
3)提供一些受保护的辅助方法来检查处理状态,如果对象被处理,则通过反射拉动当前类型名称来抛出.
我看到每个选项的优点是:
1)这对我来说"闻到",因为它包含重复的布尔值,但似乎工作正常.我经常在子类化其他代码时使用它.
2)这取出了重复的布尔值,但不是设计指南书的编写方式等.这是我通常使用的,因为它使状态保持单一点.
3)这对我来说似乎是最干净的选择,但没有出现在标准指南中.对于来自该类用户的其他方法,可能对方法的预期稍差.
在某些方面,我尝试过使用这三种方法.我想知道这三种方法的优点和缺点,以及任何其他想法,以更清洁,更好的方式来处理这个问题.你在处理这个问题时会做出什么选择?为什么?
第二:
抛出时ObjectDisposedException,你对name参数使用了什么?我知道"典型"方法调用是:
throw new ObjectDisposedException(GetType().FullName);
Microsoft员工在此页面上发表评论,建议实施具体类的全名是适当的用法.
在上面的第三个选项中,这将是唯一有意义的选择.但是,如果类实现了throw本身,则可能会返回定义被调用方法的类的名称.(即:基类可以返回基类的名称,而不是具体的子类)
我认为这不是一个好主意 - 但我在其他人编写的代码上遇到了这个问题.使实现方法的类的名称返回有优缺点吗?
优化Lucene性能的各种方法有哪些?
我应该使用缓存API来存储我的lucene搜索查询,以便节省再次构建查询的开销吗?
我刚刚开始使用驼鹿.
我正在创建一个简单的通知对象,并希望检查输入是否为"电子邮件"类型.(暂时忽略简单的正则表达式匹配).
从文档中我相信它应该类似于以下代码:
# --- contents of message.pl --- #
package Message;
use Moose;
subtype 'Email' => as 'Str' => where { /.*@.*/ } ;
has 'subject' => ( isa => 'Str', is => 'rw',);
has 'to' => ( isa => 'Email', is => 'rw',);
no Moose; 1;
#############################
package main;
my $msg = Message->new(
subject => 'Hello, World!',
to => 'coolkids@example.com'
);
print $msg->{to} . "\n";
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
String found where operator expected at message.pl line 5, near …
我在iPhone上的Safari中查看如何在页面上跟踪用户缩放和平移的选项.Safari暴露了移动和手势事件,因此理论上我可以保持平移和缩放操作的运行记录,但这似乎有点过分,因为浏览器必须在内部跟踪它.
这些信息是通过文档对象模型公开的吗?
我使用Newtonsoft的JSON序列化程序序列化了一个对象,并且DateTime已经通过:
/Date(1237588418563+0000)/
Run Code Online (Sandbox Code Playgroud)
当我使用$ .evalJSON()时,它是一个对象,但是我找不到像toUTCString这样的普通Date方法.
我有什么想法可以做到这一点?
主要玩家似乎是x264和xvid,两者都是GPL.这意味着我们无法将解码功能集成到回放应用程序中,而无需将整个事物作为GPL许可,因此我们也无法使用.
首选目标平台是Linux.任何非病毒开放许可证都没问题,我们非常乐意提供我们对库所做的任何更改的来源,而不是我们的整个应用程序.
有没有什么?或者我们现在应该在开发过程中使用GPL作为测试,并计划在发货之前用商业许可的编解码器替换它?
我正在寻找一个带有常见的可重用数据结构的C库,比如链表,哈希表等.像Kyle Loudon那样使用C语言(Masterback Algorithms with C)进行分发.
我正在考虑去实用的工作室iphone课程,但由于价格而有点警惕.我目前从事合同工作,因此没有一家公司会为我支付课程费用,当然除了我的.
旅行,食品,酒店和货币转换后,课程可达3500多个.
这值得么?
在这里,我再次看到另一个看似简单的问题,我找不到答案.我想使用输入类型="按钮",但asp:Button总是给我一个type ="submit".
<asp:Button runat="server" bla bla bla />
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我最近看到过这两件事,我有点困惑.
var blah = new MyClass() { Name = "hello" }
Run Code Online (Sandbox Code Playgroud)
和
var blah = new MyClass { Name = "hello" }
Run Code Online (Sandbox Code Playgroud)
有什么不同?为什么他们都工作?
更新: 这是否意味着,如果我在构造函数中有一些东西做了一些计算,我将不得不调用第一个?