使用未知实现的语句?

时间:2014-06-11 22:25:45

标签: c#

可以将以下代码翻译成使用...... ejem ...'using'语句吗?

TextReader TheReader;
if( UploadedFile ) { TheReader = new System.IO.StreamReader( LocalFileName ); }
else { TheReader = new System.IO.StringReader( Input ); }
//Use The reader
TheReader.Close();

所以using (TextReader TheReader = ??)

3 个答案:

答案 0 :(得分:4)

你可以使用条件运算符:

// Variable names changed for convention, and fully-qualified names simplified
using (TextReader reader = uploadedFile ? File.OpenText(localFileName)
                                        : (TextReader) new StringReader(input))
{
    ...
}

转换为TextReader可以位于最后两个操作数中的任何一个 - 它只是为了让编译器知道表达式的类型,因为它不能找到常见的类型(TextReader)来自StreamReader(第2个操作数)和StringReader(第3个)。

根据Guffa的回答,您可以using语句之前分配变量 - 但我个人也会使用此代码来保留变量的范围仅限于using声明。

答案 1 :(得分:2)

虽然你已经有两个好的答案,但至少有三分之一也值得一提,在某些情况下可能更合适:再使用一个功能。

TextReader CreateReader()
{
    if( UploadedFile )
        return new System.IO.StreamReader( LocalFileName );
    else
        return new System.IO.StringReader( Input );
}

然后,使用它:

using (TextReader reader = CreateReader())
{
}

答案 2 :(得分:1)

是的,但不是这样。如果您无法在using语句中创建实例。但是要注意变量的范围,因为变量的范围在using块之外。您可以在代码周围使用块来限制变量的范围:

{
  TextReader TheReader;
  if( UploadedFile ) { TheReader = new System.IO.StreamReader( LocalFileName ); }
  else { TheReader = new System.IO.StringReader( Input ); }
  using (TheReader) {
    //Use The reader
  }
}