相关疑难解决方法(0)

垃圾收集器是否会为我调用IDisposable.Dispose?

.NET IDisposable Pattern 意味着如果您编写终结器并实现IDisposable,则终结器需要显式调用Dispose.这是合乎逻辑的,而且在极少数情况下我总是会做终结器的保证.

但是,如果我这样做会发生什么:

class Foo : IDisposable
{
     public void Dispose(){ CloseSomeHandle(); }
}
Run Code Online (Sandbox Code Playgroud)

并且不要实现终结器或任何东西.框架会为我调用Dispose方法吗?

是的,我意识到这听起来很愚蠢,而且所有的逻辑都暗示它不会,但我总是有两件事让我不确定.

  1. 几年前有人曾告诉我,事实上它会这样做,而且那个人有"非常了解他们的东西"的良好记录.

  2. 编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)执行其他"神奇"操作,因此这也可能是"魔术".

虽然我已经阅读了很多关于它的内容,并且有很多暗示的内容,但我从来没有能够找到这个问题的肯定是或否答案.

.net dispose idisposable

126
推荐指数
5
解决办法
3万
查看次数

在C#中,是否可以使用具有不同名称的成员实现接口成员,就像在VB.NET中一样?

好吧,这是一个我要问的问题,而不是在展示良好的编码实践(这实际上可能被认为是一种不好的做法),而是在"可以"的问题上完成.

也就是说,在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中,你只需要一个方法.)

那可以做到吗?

标记

c# vb.net interface interface-implementation

13
推荐指数
1
解决办法
2497
查看次数