测试一个 oledbcommandbuilder 变量是否为 null

本文关键字:变量 是否 null oledbcommandbuilder 一个 测试 | 更新日期: 2023-09-27 18:34:06

>我有一个 OleDbCommand 变量,如果它是空的,我想使用它来创建命令生成器,使用我的数据适配器。如果变量不为 null,则已在此变量中创建命令生成器。如果我使变量局部化并测试空值,它会抱怨说:"使用未赋值的局部变量..."如果我将变量设为公共/全局,一切正常。相关代码为:

//Created locally in a button procedure:
OleDbCommandBuilder cBuilder;
if (cBuilder == null)
{
    cBuilder = new OleDbCommandBuilder(dAdapter);
}  

如果我在本地注释掉声明并将其与其他公共变量一起定义为公共,那么它就可以正常工作,没有任何抱怨。相对于我正在做的事情,为什么它的范围是本地的还是公共的会有什么不同?我只是想测试一下命令构建器是否已经创建,所以我不会一遍又一遍地创建多个命令构建器。我正在用我的数据适配器变量做同样的事情,但在这种情况下,它无论如何都必须是公开的。那么有没有更好的方法来攻击它,以测试在尝试创建之前是否已经创建了某些东西?

测试一个 oledbcommandbuilder 变量是否为 null

相对于我正在做的事情,为什么它是本地的还是公共的???

不同之处在于局部变量在包含它们的方法的开头没有值。无论方法运行了多少次,它的变量在每次执行时都会以没有值开始。

在您的示例中:

OleDbCommandBuilder cBuilder;
if (cBuilder == null)
{
    cBuilder = new OleDbCommandBuilder(dAdapter);
}  

此空检查毫无意义,因为此时cBuilder没有值,因此没有理由检查它是否null

C# 编译器阻止在为局部变量赋值之前访问该变量。这是帮助清除错误的保护措施。

如果您正在使用具有大量分支的相对复杂的方法,并且它变得过于复杂,无法确保变量在每一步都有一个值,则可以在声明它时将其初始化为null(或其他一些值(:

OleDbCommandBuilder cBuilder = null;

我强调要避免这样做,除非有令人信服的理由这样做。编译器对访问未初始化变量的限制是有原因的,以上通常只是规避它们的懒惰方法。