我知道这是一个愚蠢的问题,我想之前一定有人问过。但是我无法找到问题的答案。
以下是一些示例代码(当然不会编译)来概述我的问题:
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#编译器所接受的。 有人可以告诉我如何解决这个问题吗?
答案 0 :(得分:36)
<强> TL; DR:强>
if (Object.Equals(
myVariable
, default(
MyVariableType
)))
myVariable
和 MyVariableType
。
还有其他解决方案。
if (myVariable == null)
将无效 [1] < / strong>即可。值类型主要是struct
s(例如DateTime
),包括 [2] simple types,如int
和enum
操作。值类型不支持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
除了object
和Maybe<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#中,无法获得未初始化变量的值,以便将其与任何内容进行比较。
您正在测试该变量是否已初始化为null
或Nothing
。
答案 5 :(得分:1)
while(result == null)
C#中没有任何东西是null。
答案 6 :(得分:0)
while (result == null)