C# - Basic question: What is '?'?
我想知道在C中,?是什么意思?我看到的是:DateTime?或int?。我想这是C 4.0特有的?我不能在谷歌里找到它,因为我不知道它的名字。问题是我使用的是datetime,我有很多强制转换错误(从DateTime到DateTime?)。
谢谢你
- 它不是新的;从.NET 2.0开始就存在。
- 不要与传统的c if-then-else运算符混淆,x<0?"-"+"
这是写Nullable或Nullable的简写。nullables用于不能为空的值类型(它们总是有一个值)。
顺便说一下,这并不是针对C 4的。
如果int有值,则只能将int?分配给它,因此您的代码必须执行以下操作:
1 2
| int? n = 1;
int i = n ?? default(int); //or whatever makes sense |
还要注意,Nullable有两个属性,HasValue和Value,如果设置了值,可以使用test来获取实际值。
- int i=n?默认值(INT);
- @布莱恩·吉迪恩,你完全正确,我只是想说明一个空值有这两个属性。
- @克劳斯比斯科夫:指出这些属性是很好的,但是你举了一个例子,在这个例子中,它们是一个糟糕的选择——也许你可以单独记录它们,并使用??来分配给int。
- @280Z28不错。我已经做到了。
- 如果我想让我的类可以为空呢?我该怎么做?有没有需要实现的接口?
- 类实例已经可以为空。nullable用于本机不能为空的结构。
- 很高兴知道谢谢!
- @amokrane您可能想阅读以下内容:msdn.microsoft.com/en-us/library/34yytbws%28vs.71%29.aspx
- 我想补充一下,myNullableInt != null通常比myNullableInt.HasValue更易读,这就是他们添加它的原因。两者编译到相同的东西,但!= null是一个更普遍认可的非空变量检查。
- 你也可以用n.GetValueOrDefault()代替n ?? default(int)。
这意味着它是一个可以为空的类型。
它允许您为值类型(如int和datetime)分配一个空值。它对数据库中的可选字段非常有用。
?是可以为空的值类型。
可以使用??运算符将其与值类型混合:
1 2 3 4 5 6 7
| const int DefaultValue = -1;
// get a result that may be an integer, or may be null
int? myval = GetOptionalIdFromDB();
// the value after ?? is used if myval is null
int nonNullable = myval ?? DefaultValue; |
可以将可以为空的类型与空进行比较,因此上面是以下内容的简写:
1 2 3 4 5
| if( myval != null ) {
nonNullable = myval.Value;
} else {
nonNullable = DefaultValue;
} |
但我更喜欢??。
它指定可以为空的类型。
I suppose this is C# specific to C#
4.0?
自2.0年以来一直在C中
正如其他人所说,在类型的名称之后,它意味着可以为空的类型。
?也用于条件运算符。
这相当于:
1 2 3 4 5 6 7 8 9
| int max;
if( x > y )
{
max = x;
}
else
{
max = y;
} |
它是声明泛型类Nullable实现的一种简略方法,其中t是不可为空的值类型。
所以
是一样的
如上所述,Nullable公开hasValue属性,以便在处理之前检查i是否具有值。
有趣的是:如果您将Nullable i = 3;强制转换为一个对象,那么您可以将它强制转换回int或Nullable,因为它在装箱前有一个值。但是,如果将Nullable i = null;强制转换为对象,则在强制转换回int时会得到nullreferenceexception,但可以强制转换回Nullable。
要注意的一点:【编辑:显然这只是有时发生的】
1 2 3 4 5
| // nullable type properties may not initialize as null
private int? foo; // foo = 0
// to be certain, tell them to be null
private int? foo = null; |
- 这不是我的经验:你能用一个主要的方法和所有的东西发布一份完整的报告吗?像这样:静态类程序私有静态int?i;public static void main()console.writeline(i);
- 实际上,你是对的…当我在代码段编译器中执行直接测试时,它确实初始化为空。当我在后面的页面代码中编写代码,从另一个公共密封类访问属性时,我看到它们初始化为它们的值类型默认值。我得更深入地研究,找出发生这种情况的时间和原因。- 1个人!