nik*_*sfi 21 c# class nothing isset
我知道这是一个愚蠢的问题,我想之前一定有人问过.但是我无法找到问题的答案.
下面是一些示例代码(当然不会编译)来概述我的问题:
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);}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题在于以下几行:
while(result is nothing)
Run Code Online (Sandbox Code Playgroud)
这是VB的语法,当然这不是C#编译器所接受的.有人能告诉我如何解决这个问题吗?
Aar*_*oma 37
TL; DR:
if (Object.Equals(myVariable, default(MyVariableType)))
myVariable和MyVariableType.
还有其他解决方案.
if (myVariable == null)将不起作用[1] 与值 类型.值类型主要是structs(例如DateTime),包括[2]类似的简单类型int和enumerations.值类型不支持null值(本质上).
异常和对此的修复是可空类型:基本上这些添加null到结构类型的可能值.它们在结构上与Maybe<T>您可能从其他语言中了解的相同[3].你创建它们ValueType?(例如int?),这是语法糖Nullable<ValueType>.
或者,您可以将变量与其类型的默认值进行比较,而不是使用可空类型:
if (Object.Equals(myVariable, default(MyVariableType)))
Run Code Online (Sandbox Code Playgroud)
(这对于引用类型(对象)和值类型都有效.)
请注意,您必须MyVariableType手动替换- 遗憾的是您无法做到
if (Object.Equals(myVariable, default(myVariable.GetType())))
Run Code Online (Sandbox Code Playgroud)
因为default()只能直接接受类型名称.(我想它在编译时进行评估.)
简而言之,结构是切割类.想象一下不支持继承或终结器的类,并且你有缩减版本:struct.结构的定义方式与类相同(除了
struct关键字),除了刚才描述的限制外,结构体可以具有相同的富成员,包括字段,方法,属性和运算符.
[引自:http://www.albahari.com/valuevsreftypes.aspx ]
类是引用类型:类变量(或更具体地,它的存储区)仅包含指向其他存储区的指针,其中存储实际的对象实例数据.
值类型变量直接包含数据.由于缓存局部性并保存查找,这可能会产生速度优势.但是在更复杂的结构的情况下,它也可能对性能有害.
脚注:
[1]它甚至没有抛出错误.myVariable == null将始终只是屈服false,因为您myVariable将使用非null 默认值(零(等效)或零结构和nulls)进行初始化.此默认值可用default(Type).
[2]从技术上讲,简单类型(除了和之外的所有内置类型)都是结构.附注:内置类型的别名从类型的系统命名空间.stringobject
[3]例如在Haskell.在C#Maybe<T>中没有内置,但可以实现.它为类和结构提供Nothing了更明确/自我记录的版本null.
[4]没有[4].不,真的,你可以去检查.
Col*_*kay 24
您正在寻找的语法是:
while (result == null)
Run Code Online (Sandbox Code Playgroud)
你也必须result = null;开始