使用“使用”时出现意外行为

时间:2012-07-21 16:59:30

标签: c# asp.net .net

我可以使用用户定义的类型,比如使用块内的类吗?我用的时候:

  1. 它说,我需要继承IDisposable并实现Dispose方法。我继承并尝试定义Dispose方法,我做不到。它告诉我它不是公开的东西:(请帮助我理解这一点,我只能用一个小代码来实现它。

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

  3. 请帮忙,我是C#的新手

1 个答案:

答案 0 :(得分: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中声明的局部变量的范围是声明发生的块。在局部变量的local-variable-declarator之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误。

请注意,可以在一个方法中仍然具有两次相同的局部变量名称,前提是它们不在同一时间的范围内:

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

    using (Stream x = ...)
    {
    }

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

    // Block introduced just for scoping...
    {
        string x = "";
        ...
    }
}