代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

C#可能错误的空语句

c#
  •  4
  • GurdeepS  · 技术社区  · 14 年前

    在C#中,我可以这样写:

    using (new MyDisposableClass().MethodA());
    

    谢谢

    8 回复  |  直到 7 年前
        1
  •  11
  •   Paul Alexander    14 年前

    MyDisposableClass tmp = new MyDisposableClass().MethodA();
    try
    {
    }
    finally
    {
        if( tmp != null )
            tmp.Dispose();
    }
    

    基本上你是在处理呼叫的结果 MethodA ,而不是处理 MyDisposableClass 这是可能的意图。

    这个 ; 遵循using语句是合法的,但是警告提示您可能是错误地将其添加到了那里。例如,以下代码无法编译:

    using( var tmp = new MyDisposableClass() );
    {
        tmp.MethodA();
    }
    

    解析器计算两个完全独立的块,编译器会将其视为您键入了以下内容:

    using( var tmp = new MyDispoableClass() )
    {
    
    }
    
    
    {
        tmp.MethodA();
    }
    

    ; 所以编译器的警告只是暗示你可能想做些别的事情。有时需要简短的陈述,我认为最好的方法是使用 {} ;

    using( new MyDisposableClass().MethodA() ){}
    

    请注意,这是在处理MethodA调用的结果,而不是MyDisposableClass实例。你的代码实际上应该写成

    using( var tmp = new MyDisposableClass() ){ tmp.MethodA(); }
    
        2
  •  3
  •   Abtin Forouzandeh    14 年前

    using (var foo = new bar())
    {
      SomeStatments();
    } 
    //foo is disposed
    

    using (var foo = new bar())
      SomeStatments();
    //foo is disposed
    

    你的分号没有结束 using 使用

    MethodA 变成一个 static 方法,因为您显然没有强制约束或依赖任何类成员。

        3
  •  2
  •   MatthewMartin muthu    14 年前

    为什么要变得聪明?

    这应该是等价的,未来的开发人员将不必谷歌什么简短的语法可能意味着。

    //By the name of the example, I can assume that MyDisposableClass 
    //implements IDisposable
    using (MyDisposableClass something = new MyDisposableClass())
    {
       //Assuming the example code compiles, then the return value of MethodA
       //implemented IDisposable, too.
       using(something.MethodA())
       {
    
       };
    }
    

        4
  •  1
  •   Daniel Schaffer    14 年前

    我认为这样写会更清楚:

    using (var myDisposable = new MyDisposableClass())
    {
       myDisposable.MethodA();
    }
    

    你拥有它的方式 MethodA 会被当作 IDisposable 实施。

        5
  •  0
  •   TcKs    14 年前

    可能有助于此示例:

    public static class Helper {
        public static void Using<T>( Action<T> action ) where T : IDisposable, new() {
            var obj = new T();
            action( obj );
        }
    }
    
    // ...
    Helper.Using<MyDisposableClass>( cls => cls.MethodA() );
    Helper.Using<OtherClass>( cls => {
        for( int i = 0; i < 5; i++ ) { cls.DoRandom(); }
    } );
    
        6
  •  0
  •   davidbak    10 年前

    甚至替换“;”使用空块(消除编译器警告)可能会在以后读取时导致头部抓伤—请记住,代码是空的 阅读 更多的时候是写出来的。

    保罗·亚历山大的回答是正确的,但我没有足够的声誉对此发表评论。

    try {
        using (var _ = File.Open(logPath, FileMode.Open, FileAccess.Read)) { }
    } catch (Exception ex) { ... }
    

    Open返回必须关闭或释放的文件流。但我不太喜欢。最后,我给变量命名,并在块中显式地结束。我觉得以后会更容易理解。

        7
  •  -1
  •   dlras2    14 年前

    有时会生成编译器警告,但在您继续键入时不会清除。尝试构建解决方案,看看它是否会消失。

    另外,我不知道你指的是什么逗号。你是说这行末尾的分号吗?

        8
  •  -2
  •   Mike Webb    14 年前

    这个方法实际上会调用MethodA(),然后再也不用它了Using'仅在特定Using块中使用括号中的内容。那就超出范围了。所以:

    using (new MyDisposableClass().MethodA())
    {
        //Code that uses MethodA()
    }
    

    澄清:

    你仍然可以打电话 new MyDisposableClass().MethodA() 在程序的其他地方,但是在代码中进行的特定调用 using (new MyDisposableClass().MethodA()) 将超出范围,无法访问。