小编Sam*_*Sam的帖子

在包装Interop COM对象时,如何在c#中实现dispose模式?

我的类包含来自Interop的对象,并在其上调用一个方法,使其分配内容.它还公开了一个释放这些东西的方法,所以我希望我应该在Dispose()中调用它:

class MyClass : IDisposable
{
    private DllName.ComClassName comInstance;

    void SomeMethod()
    {
        comInstance = new DllName.ComClassName();
        comInstance.AllocStuff();
    }

    public void Dispose()
    {
        comInstance.FreeThatStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我应该扩展所有这些以遵循Dispose模式.我没有其他一次性或非托管资源可以发布,所以假设comInstance被管理(不是Interop所做的那样,将非托管包装到托管?),我认为该模式解决了:

public void Dispose()
{
    if (comInstance != null)
    {
        comInstance.FreeStuff();
        comInstance = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个泄漏除非我在MyClass的实例上显式调用Dispose(),这会使Dispose模式有缺陷?那么这是否意味着comInstance必须是非托管的,并且模式解析为:

public void Dispose()
{
    DisposeComInstance();
    GC.SuppressFinalize(this);
}

~MyClass()
{
    DisposeComInstance();
}

private void DisposeComInstance()
{
    if (comInstance != null)
    {
        comInstance.FreeStuff();
        comInstance = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

  1. 为了避免使用完整的模式使我的班级混乱,我可以封闭我的班级吗?
  2. 我怎么知道ComClassName(通常是任何类)是不受管理的?

c# interop dispose

5
推荐指数
1
解决办法
2305
查看次数

自动转换java源代码使用泛型而不是原始类型

有没有一种方法/工具可以自动将Java源代码从使用原始类型转换为使用泛型类型?

我有一些遗留代码,对原始类型有677个引用:

ArrayList   47
Vector      420
Hashtable   61
Enumeration 64
Class       7
Iterator    78
TOTAL       677
Run Code Online (Sandbox Code Playgroud)

现在我可以手动查看代码来推断泛型类型并替换,但这需要很长时间.

java generics

5
推荐指数
1
解决办法
535
查看次数

标签 统计

c# ×1

dispose ×1

generics ×1

interop ×1

java ×1