我知道这是一个愚蠢的问题,我想之前一定有人问过。但是我无法找到问题的答案。
下面是一些示例代码(当然不会编译)来概述我的问题:
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;
if (Object.Equals(
myVariable
, default(
MyVariableType
)))
替换myVariable
和MyVariableType
。
还有其他解决方案。if (myVariable == null)
与value types无法合作[1]。值类型主要是struct
s(例如DateTime
),包括[2]像simple types的int
和enum
erations。值类型不支持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
除了object
和are)aliases结构。旁注:内置类型是System,用于in Haskell命名空间中的类型。
[3]例如Maybe<T>
。在C#中,Nothing
不是内置的,但可以实现。它提供null
作为类和结构的更明确/自我记录的while (result == null)
版本。
[4]没有[4]。不,真的,你可以去检查。
while (result ==null )
Dim b as Boolean
如果这就是你的意思
虽然你有一个你很满意的答案,但你可能会发现有些有趣或有帮助的东西。
C#和VB.NET之间存在差异。在VB.NET中你可以写:
bool b;
在C#中你可以写:
b
它们略有不同。在VB.NET中,b
的值为false(换句话说,它已经被初始化)。在C#中,null
没有价值(它是未初始化的)。 C#需要付出很多努力才能确保您无法检查从未初始化的变量的值。
所以你没有测试变量是否被初始化。在VB.NET中没有未初始化的变量。在C#中,无法获得未初始化变量的值以便将其与任何内容进行比较。
您正在测试变量是否已初始化为Nothing
或while(result == null)
。
while (result == null)
C#中没有任何东西是null。
qazxswpoi