Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的整数引用类型是什么?_C# - Fatal编程技术网

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

C#中的整数引用类型是什么?,c#,C#,我想要一个可以设置为null的整数变量,而不想使用int?myVariable语法。我试着使用int和Int16都没有用。我必须使用int吗?myVariable 我提到这一点是因为在Java中既有“int”类型(原语)也有“Integer”(引用类型)。我想确定我没有可以使用的内置整数引用类型。我将使用“int”来完成我的工作。是的,这是唯一的方法,因为Int32/Int16/int是一个基本类型(不管这些类型的装箱/拆箱)。是的,您应该使用可为空的类型 看 附言: 如果您根本不想使用?表示法

我想要一个可以设置为null的整数变量,而不想使用
int?myVariable
语法。我试着使用
int
Int16
都没有用。我必须使用
int吗?myVariable


我提到这一点是因为在Java中既有“int”类型(原语)也有“Integer”(引用类型)。我想确定我没有可以使用的内置整数引用类型。我将使用“int”来完成我的工作。

是的,这是唯一的方法,因为Int32/Int16/int是一个基本类型(不管这些类型的装箱/拆箱)。

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

附言:

如果您根本不想使用表示法或Nullable,只需使用特殊结构即可。例如:

语法使其可为空。如果你再深入一点,你会发现它只是一个被使用的通用对象

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


对于使用没有指针的纯.NET来说,
是一个不错的选择。

是的。这就是为什么微软增加了这一点。人们正在创建自己的可空类,以便将此模式包含在.NET中。

您可以使用
系统。如果您非常讨厌
,则可空。

有关信息,
int?
可空
而不是引用类型;它只是一个“可空类型”,意思是:一个结构(本质上是and
int
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?