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

问题描述 投票:20回答:7

我知道这是一个愚蠢的问题,我想之前一定有人问过。但是我无法找到问题的答案。

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

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#编译器所接受的。有人能告诉我如何解决这个问题吗?

c# class isset nothing
7个回答
23
投票

您正在寻找的语法是:

while (result == null)

你还必须设置result = null;


36
投票
  • TL; DR: if (Object.Equals(myVariable, default(MyVariableType))) 替换myVariableMyVariableType。 还有其他解决方案。

if (myVariable == null)value types无法合作[1]。值类型主要是structs(例如DateTime),包括[2]像simple typesintenumerations。值类型不支持null值(本质上)。

例外和修复是nullable类型:基本上这些将null添加到结构类型的可能值。它们在结构上与您可能从其他语言中了解的Maybe<T>相同[3]。你用ValueType?(例如int?)创造它们,Nullable<ValueType>if (Object.Equals(myVariable, default(MyVariableType))) 的语法糖。

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

MyVariableType

(这将适用于引用类型(对象)和值类型。) 请注意,您必须手动替换if (Object.Equals(myVariable, default(myVariable.GetType()))) - 遗憾的是您不能这样做

default()

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

结果简而言之

简而言之,结构是切割类。想象一下不支持继承或终结器的类,并且你有缩减版本:struct。结构的定义方式与类相同(除了使用http://www.albahari.com/valuevsreftypes.aspx关键字),除了刚才描述的限制外,结构体可以具有相同的丰富成员,包括字段,方法,属性和运算符。 [引自:cache locality]

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

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


脚注:

[1]它甚至没有抛出错误。 false总是会产生myVariable,因为你的null将用非default equivalent值(零(null)或零结构和default(Type)s)初始化。 built-in types提供此默认值。

[2]从技术上讲,简单的类型(所有string除了objectarealiases结构。旁注:内置类型是System,用于in Haskell命名空间中的类型。

[3]例如Maybe<T>。在C#中,Nothing不是内置的,但可以实现。它提供null作为类和结构的更明确/自我记录的while (result == null) 版本。

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


4
投票
while (result ==null )

3
投票
Dim b as Boolean

如果这就是你的意思


2
投票

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

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

bool b;

在C#中你可以写:

b

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

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

您正在测试变量是否已初始化为Nothingwhile(result == null)


1
投票
while (result == null)

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


0
投票
qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.