C#中的整数引用类型是什么?
我想要一个可以设置为null的整数变量,而不想使用C#中的整数引用类型是什么?,c#,C#,我想要一个可以设置为null的整数变量,而不想使用int?myVariable语法。我试着使用int和Int16都没有用。我必须使用int吗?myVariable 我提到这一点是因为在Java中既有“int”类型(原语)也有“Integer”(引用类型)。我想确定我没有可以使用的内置整数引用类型。我将使用“int”来完成我的工作。是的,这是唯一的方法,因为Int32/Int16/int是一个基本类型(不管这些类型的装箱/拆箱)。是的,您应该使用可为空的类型 看 附言: 如果您根本不想使用?表示法
int?myVariable
语法。我试着使用int
和Int16
都没有用。我必须使用int吗?myVariable
我提到这一点是因为在Java中既有“int”类型(原语)也有“Integer”(引用类型)。我想确定我没有可以使用的内置整数引用类型。我将使用“int”来完成我的工作。是的,这是唯一的方法,因为Int32/Int16/int是一个基本类型(不管这些类型的装箱/拆箱)。是的,您应该使用可为空的类型 看 附言: 如果您根本不想使用?表示法或Nullable,只需使用特殊结构即可。例如:
?
语法使其可为空。如果你再深入一点,你会发现它只是一个被使用的通用对象
如果你想像C++那样做,你必须使用不安全的操作。然后,可以使用C中的指针,但您的代码不符合CLR
对于使用没有指针的纯.NET来说,
?
是一个不错的选择。是的。这就是为什么微软增加了这一点。人们正在创建自己的可空类,以便将此模式包含在.NET中。您可以使用系统。如果您非常讨厌?
,则可空。有关信息,int?
可空是而不是引用类型;它只是一个“可空类型”,意思是:一个结构(本质上是andint
和bool
标志),具有特殊的编译器规则(重空检查、运算符等)和CLI规则(用于装箱/取消装箱)。.NET中没有“整数引用类型”,除非您计算装箱:
int i = 123;
object o = i; // box
但这会创建一个不必要的对象,并有许多相关的其他问题
对于您想要的内容,int?
应该是理想的选择。您可以使用长句语法(Nullable
),但在我看来,这是不必要的冗长,我看到它让人困惑。
因此,int、int?和Nullable都是值类型,而不是引用类型
您必须使用可为空的类型,即:
Nullable<int> or int?
Nullable还是int?
nullable type的用途是,使您能够将null分配给值类型
从MSDN:
可空类型解决您希望能够拥有具有空(或未知)值的基元类型的场景。这在数据库场景中很常见,但在其他情况下也很有用
过去,有几种方法可以做到这一点:
装箱的值类型。这在编译时不是强类型的,需要对每种类型进行堆分配李>
值类型的类包装器。这是强类型的,但仍然涉及堆分配,并且必须编写包装器李>
支持可空性概念的结构包装器。这是一个很好的解决方案,但你必须自己编写
... 你为什么不想用那种语法?@Jon,那就像。。。我不想让编译器知道,它不是一个对象,Nullable是一个struct.IMHO?混乱取决于背景——它让ruby人感到困惑。我们正在使用Nullable it googlable和msdable:)对于新手,您如何处理这样一个场景:您有一个IDictionary,假设您使用它作为各种对象的计数。代码“theDictionary[someObject]=newValue”不起作用,因为索引器调用(“[…]”)返回的值不是对字典的KeyValuePair实例中存储的相同值的对象引用。要增加计数器,您是否必须删除KVP并重新添加它以将任何新值写入KVP?或者有其他方法吗?@Marchy字典[someObject]=newValue
可以正常工作;这是对索引器的赋值,它是定义良好且完全支持的。请注意,根据您的链接,这不是引用类型(“表示可以赋值为null的值类型”)。但它确实回答了OP的根本问题,如果不是标题中的问题的话。
var table = new DataTable();
table.Columns.Add('intCol',typeof(int));
var row = table.NewRow();
row['intCol'] = null; //
int i = 123;
object o = i; // box
Nullable<int> or int?