我知道这是一个愚蠢的问题,我想这一定是以前问过的。但是,我找不到问题的答案。

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

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)

您还必须设置 result = null; 也从

其他提示

  • tl; dr:

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

    • 代替 myVariableMyVariableType.


    还有其他解决方案。


if (myVariable == null) 将要 不行[1] 价值 类型. 。值类型主要是 structS(例如 DateTime), 包含[2]简单类型 喜欢 int, , 和 enum精神。价值类型不支持 null 价值(本质上)。

例外和解决方案是 无效 类型:本质上是这些添加 null 到结构类型的可能值。它们在结构上与 Maybe<T> 您可能会从其他语言中知道[3]. 。您用它们来创建它们 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 ]

课程 参考类型: :类变量(或更具体地说,其内存区域)仅包含一个指向其他存储区域的指针,其中存储了实际对象实例数据。

值类型 变量直接包含数据。这可能由于 缓存位置 并保存查找。但是,在更复杂的结构的情况下,这也可能不利于性能。



脚注:

1]它甚至不会丢失错误。 myVariable == null 总是会屈服 false, ,因为你 myVariable 将以非 - 初始化null 默认 值(零(零)相等的)或零结构 nullS)。此默认值可用于 default(Type).

2]从技术上讲,简单类型(全部 内置类型 除了 stringobject) 结构。旁注:内置类型是 别名 对于类型 系统 名称空间。

3]例如 在哈斯克尔. 。在C#中 Maybe<T> 不是内置的,但可以实现。它提供 Nothing 作为更明确/自我记录的版本 null 既适用于课程和结构。

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

while (result == null)
while (result ==null )

如果那是你的意思

尽管您有一个答案,但背后有一些事情,您可能会发现有趣或有用。

c#和vb.net之间存在差异。在vb.net中,您可以写:

Dim b as Boolean

在C#中,您可以写:

bool b;

他们微妙。在vb.net中 b 已经给出了值false(换句话说,已经被初始化)。在C#中, b 没有价值(它是非初始化的)。 C#付出了很多努力,以确保您无法检查从未初始化的变量的值。

因此,您没有测试该变量是否初始化。在vb.net中,没有一个非初始化的变量。在C#中,不可能获得非初始化变量的值,以便将其与任何内容进行比较。

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

while(result == null)

c#中的无需等同于null。

while (result == null)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top