C#中的整数引用类型是什么?

12

我希望有一个整数变量,可以设置为null,但不想使用int? myVariable的语法。我已经尝试使用intInt16,但没有成功。我是否必须使用int? myVariable

我提到这一点是因为在Java中,有一个' int '类型(原始类型)和' Integer '(引用类型)。我想确定是否有内置的整数引用类型可供使用。对于我的需求,我将使用'int?'。


5
为什么你不想使用那个语法? - womp
3
@Jon,这就像是...我希望编译器在我没有明确说明的情况下就能够理解它。 - Dykam
8个回答

26

顺便提一下,int? / Nullable<T> 并不是引用类型;它只是一个“可空类型”,意味着一个结构体(本质上是一个包含一个int 和一个bool标志的结构体),具有特殊的编译器规则(例如空检查、运算符等)和 CLI 规则(用于装箱/拆箱)。在 .NET 中,除非你计算装箱,否则没有“整数引用类型”。

int i = 123;
object o = i; // box

但这样创建了一个不必要的对象,并且有很多相关的问题。

对于你想要的,int? 应该是理想的。你可以使用冗长的语法 (Nullable<int>),但在我看来这是不必要的啰嗦,而且我见过它让人困惑。


4
在我看来,混淆取决于个人背景 - 这可能会让熟悉 Ruby 的人感到困惑。我们正在使用 Nullable<T>,这使得新手可以在谷歌和微软文档中轻松查找到相关信息。 - Sergey Mirvoda
如果你有一个IDictionary<SomeObject, int>,用于计算不同对象的数量,那么当你需要处理这种情况时该怎么办呢?代码“theDictionary[someObject] = newValue”将无法工作,因为索引器调用(“[..]”)返回的值不是指向存储在字典的KeyValuePair<SomeObject, int>实例中相同值的对象引用。要增加计数器,您是否必须删除KVP并重新添加它以将任何新值写入KVP?还是有其他方法? - Marchy
1
@Marchy theDictionary[someObject] = newValue 将正常工作;这是对索引器的赋值,它是明确定义和完全支持的。 - Marc Gravell

8

是的,您应该使用可空类型。

请参见可空类型

Nullable<int> Nullable<float> 

或者简单地
int? float?

PS:

如果您不想使用?符号或Nullable,可以使用特殊的结构来实现此目的。例如DataTable

var table = new DataTable();
table.Columns.Add('intCol',typeof(int));
var row = table.NewRow();
row['intCol'] = null; //

请注意,根据您提供的链接,这不是引用类型("表示可以分配空值的值类型")。但它确实回答了OP的潜在问题,尽管没有回答标题中的问题。 - Kat

4

2

是的,这是唯一的方法,因为Int32 / Int16 / int是基本类型(无论是否装箱/拆箱)。


0

你需要使用可空类型,即:

Nullable<int> or int?

可空类型的目的是使您能够将 null 赋值给值类型。

来自 MSDN:

可空类型 解决了您想要具有具有 null(或未知)值的基元类型的情况。这在数据库场景中很常见,但在其他情况下也很有用。

过去,有几种方法可以实现此目的:

  1. 装箱值类型。这在编译时不是强类型化的,并涉及为每种类型执行堆分配。
  2. 值类型的类包装器。这是强类型化的,但仍涉及堆分配,而且您必须编写包装器。
  3. 支持可空性概念的结构包装器。这是一个好的解决方案,但您必须自己编写它。

0

<var>?语法使其可为空。如果您深入挖掘,您会发现它只是一个通用对象。

如果您想像C++一样使用它,您必须使用不安全的操作。然后,像C中的指针一样可用,但您的代码不符合CLR...

要使用纯.NET而没有指针,?是正确的方法。


5
它不是一个对象,Nullable 是一个结构体。 - Hans Passant

0

是的。这就是为什么微软添加了它。人们正在创建自己的Nullable类,因此他们在.NET中包含了这种模式。


0
如果你非常讨厌问号?,你可以使用System.Nullable<int>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接