我有一个OleDbCommand变量,如果它是null,我想用它来创建一个命令构建器,使用我的dataadapter。如果变量不为null,则已在此变量中创建了一个commandbuilder。如果我将变量设为local并测试为null,则会抱怨说:“使用未分配的局部变量......”如果我将变量设为public / global,则一切正常。相关代码是:
//Created locally in a button procedure:
OleDbCommandBuilder cBuilder;
if (cBuilder == null)
{
cBuilder = new OleDbCommandBuilder(dAdapter);
}
如果我在本地注释掉声明并将其定义为与其他公共变量一起公开,那么它可以正常工作而不会产生任何影响。相对于我正在做的事情,为什么它的范围是本地的还是公众的呢?我只想测试一下是否已经创建了命令构建器,所以我不会反复创建多个。我正在使用我的dataadapter变量执行相同的操作,但在这种情况下,它必须是公共的。那么有没有更好的方法来攻击它,以便在尝试创建之前测试是否已经创建了某些东西?
答案 0 :(得分:1)
相对于我正在做的事情,为什么它的范围是本地的还是公开的呢?
区别在于局部变量在包含它们的方法的开头没有值。无论方法运行了多少次,它的变量都会在每次执行时都没有值开始。
在你的例子中:
OleDbCommandBuilder cBuilder;
if (cBuilder == null)
{
cBuilder = new OleDbCommandBuilder(dAdapter);
}
此空检查毫无意义,因为cBuilder
此时没有值,因此没有理由检查它是否为null
。
C#编译器在分配值之前阻止访问本地变量。这是帮助清除错误的安全措施。
如果你正在使用一个相对复杂的方法进行大量分支并且变得太复杂而无法确保变量在每一步都有值,你可以将它初始化为null
(或其他一些值) )当你宣布它时:
OleDbCommandBuilder cBuilder = null;
我强调要避免这样做,除非有令人信服的理由这样做。编译器对访问未初始化变量的限制是有原因的,而上述通常只是一种规避它们的懒惰方式。