我正在尝试比较以下内容:
if (e.CreatedBy == null)
但这给了我一个错误:
表达式的结果始终为“假”,因为“int”类型的值永远不会等于“int?”类型的“null”。
有人可以帮助告诉我如何检查 CreatedBy 的值是否尚未设置吗?注意这里是 CreatedBy 的定义:
public int CreatedBy { get; set; }
我正在尝试比较以下内容:
if (e.CreatedBy == null)
但这给了我一个错误:
表达式的结果始终为“假”,因为“int”类型的值永远不会等于“int?”类型的“null”。
有人可以帮助告诉我如何检查 CreatedBy 的值是否尚未设置吗?注意这里是 CreatedBy 的定义:
public int CreatedBy { get; set; }
的类型CreatedBy
是int
不能取值的类型null
。
从您目前拥有的情况来看,无法检测是否CreatedBy
已设置。假设其默认值为0
。然后将该值设置为1
,然后再设置为0
。现在,您如何区分当前0
未修改的原始版本0
?
如果您想做的是检测该值是否为0
,那么我认为我不需要告诉您该怎么做。如果您真的想检测是否曾经设置过该值,则需要维护一个bool
标志并在属性的设置器第一次执行时设置该标志。
int
是一个值类型,这意味着它永远不能为空。它的默认值为0。如果要存储null而不是0,则需要将类型更改为int?
可以为空的int类型。要了解有关 Nullable 类型的更多信息,请查看“ Nullable Types (C#) ”
int 值是一种非Nullable
类型,请参见
http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=vs.80).aspx
如果你想检查是否设置或不使用
//GetValueOrDefault()
private int? createdBy;
public int CreatedBy
{
get { return createdBy.GetValueOrDefault(-1); }
set { createdBy= value; }
}
///your code
if(e.CreatedBy == -1)
{
//not set
}else
{
//set
}
int
是一个不能为空的值类型。如果你想让一个值类型可以为空,你需要使用int?
which 是创建这样一个Nullable
对象的简写方式
Nullable<int> myNullable = new Nullable<int>();
有人可以帮助告诉我如何检查 CreatedBy 的值是否尚未设置吗?
不,这是不可能的,因为值类型(如 int)不能为空。
但是您可以使用Nullable Types,让您将其声明为“Nullable of int”,然后它可以为 null。
从我链接到的文档中:
可空类型可以表示其基础值类型的正确值范围,外加一个额外的空值
要将您的属性设置为“Nullable of int”,只需添加一个问号:
public int? CreatedBy { get; set; }
上面的语法实际上只是以下的简写:
public Nullable<int> CreatedBy { get; set; }
因为 int 的默认值是 0 而不是 null。e.CreatedBy
永远不会有null
更好的价值是将它与 0 进行比较。
if (e.CreatedBy == 0)
nullable
int 可以等于 null 但不能为空(默认 int)永远不会等于null
.
好吧,您使用的是int not nullable int所以它永远不能为空?
您可以CreatedBy
按如下方式更改您的定义:
public int? CreatedBy { get; set; }
他们可以进行以下检查
if (e.CreatedBy == null)
或者if (e.CreatedBy.HasValue)
好的,很多答案解释了显而易见的。以下是一些实际解决问题的想法:
一种选择:只需使用默认值 0。
现在,null
您可以检查 if(CreatedBy > 0)
.
如果您更喜欢“显式”,您可以使用 -1 来显式指示“空”或“未设置”,方法是将其设置为构造函数中的默认值。我并不是说这在所有情况下都是理想的,但它相当简单:
public YourClass(){
CreatedBy = -1;
}
public int CreatedBy { get; set; }
显然,这导致了测试:if(CreatedBy != -1)
.
另一种选择是使用nullable of int
,正如一些人所建议的那样,并检查null
. 这样做的缺点是必须处理类型,int?
而不是在使用该值的任何地方都更“通用” int
。这可能不是问题,但有时会很烦人,尤其是当您将值传递给其他方法、类或其他任何东西时。
要回答您的问题,您无法检查该值是否已设置,您只能检查它现在具有的值。任何属性在初始化时都会有一个“默认”值。对于大多数类型(包括 Nullable),默认值为 null,但对于 int,默认值为 0。
如果您确定没有人会出于任何其他原因将此属性设置为 0,那么您可以测试:
if (e.CreatedBy == 0)
...但是,如果 0 在另一种情况下是此属性的有效值,那么测试 0 将无济于事。同样,如果您将属性更改为可为空,那么您可以测试:
if (e.CreatedBy == null)
...根据您的原始设计,但是如果有任何其他原因可能将该属性设置为 null 那么您不会再发现它是否曾经被设置过,只是最后一次设置它是设置为空。
如果您想真正知道该值是否已设置,则需要在使用 setter 时安排其他事情发生,例如设置另一个标志。这是一个这样做的示例,其中 CreatedByHasBeenSet 属性为 false(bool 的默认值!),直到 CreatedBy 上的设置器被调用:
private int createdBy;
public int CreatedBy
{
get
{
return this.createdBy;
}
set
{
this.createdBy = value;
this.CreatedByHasBeenSet = true;
}
}
public bool CreatedByHasBeenSet { get; private set; }