如何判断变量是否已在C#中初始化?

如何判断变量是否已在C#中初始化?,c#,class,isset,nothing,C#,Class,Isset,Nothing,我知道这是一个愚蠢的问题,我想这一定是以前问过的。然而,我无法找到我的问题的答案 下面是一些示例代码(当然不会编译)来概述我的问题: class test { int[] val1; string val2; static bool somefunction(test x, test y) { dosomestuff() test result; while(result is nothing)

我知道这是一个愚蠢的问题,我想这一定是以前问过的。然而,我无法找到我的问题的答案

下面是一些示例代码(当然不会编译)来概述我的问题:

class test
{
     int[] val1;
     string val2;

     static bool somefunction(test x, test y)
     {
         dosomestuff()

         test result;

         while(result is nothing)
         {
              if(somecondition){result=new test(something);}
         }
     }
}
我遇到的问题如下:

while(result is nothing)
这是VB的语法,当然C#编译器不接受这种语法。 谁能告诉我怎么解决这个问题吗

while (result == null)
如果你是这个意思的话

while(result == null)

C#中的nothing等价物为null。

您要查找的语法是:

while (result == null)

您还必须设置
result=null
开头也是

尽管你有一个满意的答案,但背后有些东西你可能会觉得有趣或有用

while (result == null)
C#和VB.NET之间存在差异。在VB.NET中,您可以编写:

Dim b as Boolean
bool b;
用C#你可以写:

Dim b as Boolean
bool b;
它们有细微的不同。在VB.NET中,
b
已被赋予值false(换句话说,它已被初始化)。在C#中,
b
没有值(未初始化)。C#需要花费大量精力来确保您无法检查从未初始化过的变量的值

因此,您不是在测试变量是否已初始化。在VB.NET中,没有未初始化的变量。在C#中,不可能获取未初始化变量的值以将其与任何对象进行比较

您正在测试变量是否已初始化为
null
Nothing

  • TL;医生:

    if(Object.Equals(
    myVariable
    ),默认(
    MyVariableType
    ))

    • 替换
      myVariable
      MyVariableType

    还有其他解决办法。

如果(myVariable==null)
不起作用[1]
(参考类型与值类型以及结构的简短介绍见下文。)

值类型主要是
struct
s(例如
DateTime
),包括[2]类似的
int
enum
运算。值类型不支持
null
值(本质上)

例外情况和对此的修复是类型:本质上,这些类型向结构类型的可能值添加
null
。它们在结构上与其他语言中可能知道的
相同[3]。您可以使用
ValueType?
(例如
int?
)创建它们,这是
Nullable
的语法糖


或者,您可以将变量与其类型的默认值进行比较,而不是使用可为空的类型:
if (Object.Equals(myVariable, default(MyVariableType)))
(这对引用类型(对象)和值类型都有效。)
请注意,您必须手动替换
MyVariableType
,不幸的是,您可以这样做

if (Object.Equals(myVariable, default(myVariable.GetType())))
因为
default()
只直接接受类型名。(我想它是在编译时计算的。)


简而言之,结构 简言之,结构是经过裁剪的类。想象一下那些没有 支持继承或终结器,您拥有精简版本: 结构。结构的定义方式与类相同(除了 使用
struct
关键字),除了限制之外 如上所述,结构可以具有相同的富成员,包括字段, 方法、属性和运算符。
[引自:http://www.albahari.com/valuevsreftypes.aspx ]

类是引用类型:类变量(或者更具体地说,它的内存区域)只包含指向存储实际对象实例数据的其他内存区域的指针

值类型变量直接包含数据。这可能会由于查找和保存查找而产生速度优势。但在更复杂的结构中,这也可能对性能有害



脚注:

[1] 它甚至不会抛出错误
myVariable==null
将始终只产生
false
,因为
myVariable
将使用非
null
值(零()或零和
null
s的结构)初始化。此默认值可与
默认值(类型)
一起使用

[2] 从技术上讲,简单类型(除了
字符串
对象
)结构。旁注:内置类型用于命名空间中的类型

[3] 例如。在C#
中,
可能不是内置的,但可以实现。它提供了
Nothing
,作为类和结构的
null
的更明确/自文档化版本


[4] 没有[4]。不,真的,您可以去检查。

编译器会为此抛出以下异常:“使用未分配的局部变量‘test’”不,因为我没有像科林·麦凯建议的那样首先设置test=null。确定。很高兴你能弄明白。这根本不是个愚蠢的问题。当我从VB.NET转到C#时,遇到了很多这样的问题。这对值类型不起作用。请参阅下面我的修复。是的,但这不是问题所在。问题是专门询问一个名为
test
类,它不是值类型。(同意,就提问者的例子而言,您的回答是正确和完整的。不过,我认为指出就问题的更一般的标题而言,您的回答并不完整是有用的;在我看来,这一点似乎并不明显,但与遇到此问题的其他人相关。)我声明了一个类,但没有初始化它。然后,如果尝试检查(myClass==null)VisualSutdio是否允许我运行这个程序。错误是“使用无符号局部变量”带有?ValueType的伟大提示。