24

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

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

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

4

7 回答 7

39
  • TL;博士:

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

    • 替换myVariableMyVariableType

    还有其他解决方案。

if (myVariable == null)不适用于[1 ]类型 (有关引用类型值类型   和s
的简短介绍,请参见下文  。)struct

值类型主要是structs(例如DateTime),包括[2]和erations等简单类型。值类型不支持值(本质上)。intenumnull

例外和对此的修复是可为的类型:本质上,这些添加null到结构类型的可能值中。它们在结构上与Maybe<T>您可能从其他语言中知道的[3]相同。ValueType?您使用(eg )创建它们,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]

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

值类型变量直接包含数据。由于缓存局部性和保存查找,这可能会产生速度优势。但在结构更复杂的情况下,它也可能不利于性能。



脚注:

[1] 它甚至不会抛出错误。myVariable == null将始终只 yield false,因为您myVariable将使用非null 默认值(零(等效)或零和nulls 的结构)进行初始化。此默认值适用于default(Type)

[2] 从技术上讲,简单类型(除and之外的所有内置类型都是结构。旁注:内置类型是 System 命名空间中类型别名stringobject

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

[4] 没有[4]。没有,你可以去看看。

于 2012-03-15T18:47:12.303 回答
25

您正在寻找的语法是:

while (result == null)

您还必须设置result = null;开始

于 2009-07-28T17:45:35.440 回答
4
while (result == null)
于 2009-07-28T17:44:22.617 回答
3
while (result ==null )

如果这就是你的意思

于 2009-07-28T17:44:45.143 回答
2

尽管您有一个满意的答案,但在这背后有一些您可能会觉得有趣或有帮助的东西。

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

Dim b as Boolean

在 C# 中,您可以编写:

bool b;

它们有细微的不同。在 VB.NET 中,b被赋予了 false 值(换句话说,它已经被初始化了)。在 C# 中,b没有值(未初始化)。C# 付出了很多努力来确保您无法检查从未初始化过的变量的值。

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

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

于 2009-07-28T18:39:53.537 回答
1
while(result == null)

在 C# 中,nothing 的等价物是 null。

于 2009-07-28T17:45:23.927 回答
0
while (result == null)
于 2009-07-28T17:48:07.603 回答