.NET IDisposable Pattern 意味着如果您编写终结器并实现IDisposable,则终结器需要显式调用Dispose.这是合乎逻辑的,而且在极少数情况下我总是会做终结器的保证.
但是,如果我这样做会发生什么:
class Foo : IDisposable
{
public void Dispose(){ CloseSomeHandle(); }
}
Run Code Online (Sandbox Code Playgroud)
并且不要实现终结器或任何东西.框架会为我调用Dispose方法吗?
是的,我意识到这听起来很愚蠢,而且所有的逻辑都暗示它不会,但我总是有两件事让我不确定.
几年前有人曾告诉我,事实上它会这样做,而且那个人有"非常了解他们的东西"的良好记录.
编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)执行其他"神奇"操作,因此这也可能是"魔术".
虽然我已经阅读了很多关于它的内容,并且有很多暗示的内容,但我从来没有能够找到这个问题的肯定是或否答案.
好吧,这是一个我要问的问题,而不是在展示良好的编码实践(这实际上可能被认为是一种不好的做法),而是在"可以"的问题上完成.
也就是说,在VB.NET中你实现了这样的接口......
Sub SomeInterfaceMember()
Implements ISomeInterface.SomeInterfaceMember
End Sub
Run Code Online (Sandbox Code Playgroud)
而在C#中你明确地这样做(只能通过界面调用)......
void ISomeInterface.SomeInterfaceMember(){}
Run Code Online (Sandbox Code Playgroud)
或者更简单地,隐含地像这样(在这种情况下你可以直接调用它,或通过接口)......
void SomeInterfaceMember(){} // <-- This name matches the interface member
Run Code Online (Sandbox Code Playgroud)
但是,关于VB,您也可以使用您想要的任何名称来执行此操作...
Sub SomeRandomMemberName() // <-- This name doesn't match the interface member
Implements ISomeInterface.SomeInterfaceMember
End Sub
Run Code Online (Sandbox Code Playgroud)
换句话说,处理实现的方法可以具有与接口的成员名称完全不同的名称.
我只是想知道在C#中是否有类似的东西.(是的,我知道我可以简单地做一个显式接口,然后通过另一个'wrapper'成员使用一个简单的委托给它的不同名称来访问它,但是在VB.NET中,你只需要一个方法.)
那可以做到吗?
标记