我希望有一个整数变量,可以设置为null,但不想使用int? myVariable
的语法。我已经尝试使用int
和Int16
,但没有成功。我是否必须使用int? myVariable
?
我提到这一点是因为在Java中,有一个' int '类型(原始类型)和' Integer '(引用类型)。我想确定是否有内置的整数引用类型可供使用。对于我的需求,我将使用'int?'。
我希望有一个整数变量,可以设置为null,但不想使用int? myVariable
的语法。我已经尝试使用int
和Int16
,但没有成功。我是否必须使用int? myVariable
?
我提到这一点是因为在Java中,有一个' int '类型(原始类型)和' Integer '(引用类型)。我想确定是否有内置的整数引用类型可供使用。对于我的需求,我将使用'int?'。
顺便提一下,int?
/ Nullable<T>
并不是引用类型;它只是一个“可空类型”,意味着一个结构体(本质上是一个包含一个int
和一个bool
标志的结构体),具有特殊的编译器规则(例如空检查、运算符等)和 CLI 规则(用于装箱/拆箱)。在 .NET 中,除非你计算装箱,否则没有“整数引用类型”。
int i = 123;
object o = i; // box
但这样创建了一个不必要的对象,并且有很多相关的问题。
对于你想要的,int?
应该是理想的。你可以使用冗长的语法 (Nullable<int>
),但在我看来这是不必要的啰嗦,而且我见过它让人困惑。
theDictionary[someObject] = newValue
将正常工作;这是对索引器的赋值,它是明确定义和完全支持的。 - Marc Gravell是的,这是唯一的方法,因为Int32 / Int16 / int是基本类型(无论是否装箱/拆箱)。
你需要使用可空类型,即:
Nullable<int> or int?
可空类型的目的是使您能够将 null 赋值给值类型。
来自 MSDN:
可空类型 解决了您想要具有具有 null(或未知)值的基元类型的情况。这在数据库场景中很常见,但在其他情况下也很有用。
过去,有几种方法可以实现此目的:
- 装箱值类型。这在编译时不是强类型化的,并涉及为每种类型执行堆分配。
- 值类型的类包装器。这是强类型化的,但仍涉及堆分配,而且您必须编写包装器。
- 支持可空性概念的结构包装器。这是一个好的解决方案,但您必须自己编写它。
<var>?
语法使其可为空。如果您深入挖掘,您会发现它只是一个通用对象。
如果您想像C++一样使用它,您必须使用不安全的操作。然后,像C中的指针一样可用,但您的代码不符合CLR...
要使用纯.NET而没有指针,?
是正确的方法。
是的。这就是为什么微软添加了它。人们正在创建自己的Nullable类,因此他们在.NET中包含了这种模式。
?
,你可以使用System.Nullable<int>
。