我想使用使用语句,但可能需要更改我使用"的变量的值。如果它应该指向的对象不存在。
我想到了类似的东西(对于注册表访问和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,和/或在使用之前测试注册表项是否存在来解决这个问题。
有没有办法继续使用使用,之后处理正确的对象?
答案 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块中,该对象是只读的,无法修改 或重新分配。