使用语句更改已使用的变量

时间:2016-04-13 15:12:25

标签: c# using using-statement

我想使用使用语句,但可能需要更改我使用"的变量的值。如果它应该指向的对象不存在。

我想到了类似的东西(对于注册表访问和32/64窗口 - 虽然这是我当前的用例,这是一个普遍的问题):

using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MS\Platform"))
{
    if (key == null)
        key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MS\Platform");
    // use key
}

以上代码无法编译:

error CS1656: Cannot assign to 'key' because it is a 'using variable'

我可以通过不使用使用但尝试/ catch / finally,和/或在使用之前测试注册表项是否存在来解决这个问题。

有没有办法继续使用使用,之后处理正确的对象?

3 个答案:

答案 0 :(得分:4)

也许Null合并?

using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MS\Platform") ?? Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MS\Platform"))
{

    // use key
}

答案 1 :(得分:3)

if

中取出using
var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MS\Platform");
if (key == null)
        key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MS\Platform");

//prob best to null check
if (key != null)
{
  using (key)
  {

      // use key
   }
}

正如一个FYI并解释为什么你可以这样做,using语句只是语法糖:

readonly IDisposable item;
try
{

}
finally
{
   item.Dispose();
}

因为它被标记为readonly,这也解释了为什么你不能在using语句中分配它。

答案 2 :(得分:1)

输入using语句后,无法修改它引用的Disposable对象:

  

在using块中,该对象是只读的,无法修改   或重新分配。

https://msdn.microsoft.com/library/yh598w02.aspx