3

我可以使用用户定义的类型,比如使用 block 里面的类吗?当我使用:

  1. 它说,我需要继承 IDisposable 并实现 Dispose 方法。我继承并尝试定义 Dispose 方法,但我做不到。它向我展示了它不是公开的或其他东西:(请用一段关于如何实现它的小代码帮助我理解这一点。

  2. 如果我在“using”括号内创建一个类的实例,尽管该变量的范围仅在该 using 块内,但为什么我不能在 using 之外创建具有相同变量的同一类的另一个实例?我认为没有充分的理由:(我的推理是否正确?但我可以使用相同的变量在 using 之外实例化另一个类(可以这样做吗?因为我没有看到编译错误),尽管我很清楚我们应该练习编码指南(但从概念上讲,我正在寻求逻辑)......

请帮忙,我是 C# 新手

4

1 回答 1

8

using语句的重点是调用接口Dispose中指定的方法。IDisposable

是的,在实现接口时,方法需要是公共的,或者您需要使用显式接口实现:

// Via a public method
public class Foo : IDisposable
{
    public void Dispose()
    {
        // Stuff
    }
}

// Via explicit interface implementation
public class Bar : IDisposable
{
    void IDisposable.Dispose()
    {
        // Stuff
    }
}

这里没有什么特别的IDisposable——它只是普通的接口实现。

但是,您不应该IDisposable仅仅为了它而实施-想法是它应该为您清理-如果您没有要执行的清理,则也不需要该using语句。

至于第二点:您根本不允许声明与仍在范围内的另一个局部变量同名的局部变量。阅读起来会非常混乱,因此被禁止。从 C# 规范的第 8.5.1 节:

在 local-variable-declaration 中声明的局部变量的范围是发生声明的块。在局部变量的局部变量声明符之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个同名的局部变量或常量是编译时错误。

请注意,您仍然可以在一种方法中使用相同的局部变量名称两次,前提是它们不能同时在范围内:

void M()
{
    using (Stream x = ...)
    {
    }

    using (Stream x = ...)
    {
    }

    for (int x = 0; x < 10; x++)
    {
    }

    // Block introduced just for scoping...
    {
        string x = "";
        ...
    }
}
于 2012-07-21T17:02:39.057 回答