题
我知道这是一个愚蠢的问题,我想这一定是以前问过的。但是,我找不到问题的答案。
这是一些示例代码(当然没有编译)来概述我的问题:
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
)))
- 代替
myVariable
和MyVariableType
.
还有其他解决方案。- 代替
if (myVariable == null)
将要 不行[1] 和 价值 类型. 。值类型主要是 struct
S(例如 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
默认 值(零(零)相等的)或零结构 null
S)。此默认值可用于 default(Type)
.
2]从技术上讲,简单类型(全部 内置类型 除了 string
和 object
) 是 结构。旁注:内置类型是 别名 对于类型 系统 名称空间。
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)