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

时间:2009-07-28 17:41:44

标签: c# class isset 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#编译器所接受的。 有人可以告诉我如何解决这个问题吗?

7 个答案:

答案 0 :(得分:36)

  • <强> TL; DR:

    if (Object.Equals( myVariable , default( MyVariableType )))

    • 替换 myVariable MyVariableType


    还有其他解决方案。


使用 value types <

if (myVariable == null)无效 [1] < / strong>即可。值类型主要是struct s(例如DateTime),包括 [2] simple types,如intenum操作。值类型不支持null值(本质上)。

异常和对此的修复是nullable类型:基本上这些将null添加到结构类型的可能值。它们在结构上与您可能从其他语言 [3] 中了解的Maybe<T>相同。您使用ValueType?(例如int?)创建它们,这是Nullable<ValueType>的语法糖。


或者,您可以将变量与其类型的默认值进行比较,而不是使用可空类型:

if (Object.Equals(myVariable, default(MyVariableType)))

(这对参考类型(对象)和值类型都有效。)
请注意,您必须手动替换 MyVariableType - 遗憾的是,您可以执行

if (Object.Equals(myVariable, default(myVariable.GetType())))

因为default()只接受类型名称。 (我想它在编译时进行评估。)


简而言之,

结构

  

简单地说,结构是减少的类。想象一下没有的课程   支持继承或终结器,你有减少版本:   结构。结构的定义方式与类相同(除外)   使用struct关键字),除了限制之外   描述,结构可以有相同的富有成员,包括字段,   方法,属性和运算符。   
[引自:http://www.albahari.com/valuevsreftypes.aspx]

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

值类型变量直接包含数据。由于cache locality并保存查找,这可能会产生速度优势。但是对于更复杂结构的情况,它也可能对性能有害。



脚注:

[1]它甚至不会抛出错误。 myVariable == null始终只会产生false,因为您的myVariable将使用非null default值(零(equivalent)或零结构和null s)。此默认值适用于default(Type)

[2]从技术上讲,简单类型(string除了objectMaybe<T>built-in types结构之外的所有are。附注:对于aliases命名空间中的类型,内置类型为System

[3]例如in Haskell。在C#中Nothing不是内置的,但可以实现。它为类和结构提供null作为{{1}}的更明确/自我记录的版本。

[4]没有 [4] 。不,你可以去检查。

答案 1 :(得分:23)

您正在寻找的语法是:

while (result == null)

您还必须将result = null;设置为以

开头

答案 2 :(得分:4)

while (result == null)

答案 3 :(得分:3)

while (result ==null )

如果这就是你的意思

答案 4 :(得分:2)

虽然你有一个很满意的答案,但是你可能会发现这些有趣或有用的东西。

C#和VB.NET之间存在差异。在VB.NET中,您可以写:

Dim b as Boolean

在C#中你可以写:

bool b;

他们略有不同。在VB.NET中,b的值为false(换句话说,它已经被初始化)。在C#中,b没有值(它是未初始化的)。 C#需要付出很多努力才能确保您无法检查从未初始化的变量的值。

所以你没有测试变量是否被初始化。在VB.NET中没有未初始化的变量。在C#中,无法获得未初始化变量的值,以便将其与任何内容进行比较。

您正在测试该变量是否已初始化为nullNothing

答案 5 :(得分:1)

while(result == null)

C#中没有任何东西是null。

答案 6 :(得分:0)

while (result == null)