Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net 什么都不占用多少内存?_.net_Memory Management_Null_Native_Nothing - Fatal编程技术网

.net 什么都不占用多少内存?

.net 什么都不占用多少内存?,.net,memory-management,null,native,nothing,.net,Memory Management,Null,Native,Nothing,我只是想知道,如果我有一个变量,我给它赋值Nothing(或Null),那么这个变量会占用多少内存 比如说 Dim i as Integer = Nothing 变量是否不使用内存?还是整数的大小,4字节?基本上,我认为这意味着这个值没有赋值,因此内存中没有任何值,所以应该不需要内存。然而,存储的信息表明变量为零,所以这些信息必须占用内存,对吗?NET和本地语言之间有区别吗?或者在值和引用类型之间?一般来说:对Null的引用只占用堆栈上引用本身的空间。在64位系统上应该是8字节 在您的特定情况

我只是想知道,如果我有一个变量,我给它赋值
Nothing
(或
Null
),那么这个变量会占用多少内存

比如说

Dim i as Integer = Nothing

变量是否不使用内存?还是整数的大小,4字节?基本上,我认为这意味着这个值没有赋值,因此内存中没有任何值,所以应该不需要内存。然而,存储的信息表明变量为零,所以这些信息必须占用内存,对吗?NET和本地语言之间有区别吗?或者在值和引用类型之间?

一般来说:对Null的引用只占用堆栈上引用本身的空间。在64位系统上应该是8字节

在您的特定情况下:请注意装箱和未装箱值之间的差异!装箱整数是对integer类实例的引用。实例未创建(无),因此不占用空间。引用需要8个字节

如果使用非固定值(int),它将占用int(struct)的空间,正好是4个字节。请注意,此处不涉及参考

使用“regular”类而不是带有Integer的特例将是一个更简单的示例。例如,考虑

Object o = new Object()

这占用堆栈上的8个字节,即使
o
本身是空的。

一般来说:对Null的引用只占用堆栈上引用本身的空间。在64位系统上应该是8字节

在您的特定情况下:请注意装箱和未装箱值之间的差异!装箱整数是对integer类实例的引用。实例未创建(无),因此不占用空间。引用需要8个字节

如果使用非固定值(int),它将占用int(struct)的空间,正好是4个字节。请注意,此处不涉及参考

使用“regular”类而不是带有Integer的特例将是一个更简单的示例。例如,考虑

Object o = new Object()
这需要堆栈上的8个字节,即使
o
本身是空的。

如注释中所述,为
Nothing
赋值是C#中的
default(T)
的VB.NET等价物

整数
将始终占用4字节32位。不管你把哪个值放进去

但是,如果您有一个引用,它将在32位进程中占用4个字节,在64位进程中占用8个字节,这也与您输入的值无关。但是,
整数
System.Int32
不是引用类型

Nothing
这里并不意味着“无引用”(正如我最初所想的那样),只是将类型的默认值赋给变量。在这种情况下,
Integer
的默认值为0

因此,您的变量占用4个字节,因为它是一个
System.Int32
。您拥有的代码只会将值
0
分配给它。

如注释中所述,将值
Nothing
分配给C#中的
default(T)
是VB.NET等价物

整数
将始终占用4字节32位。不管你把哪个值放进去

但是,如果您有一个引用,它将在32位进程中占用4个字节,在64位进程中占用8个字节,这也与您输入的值无关。但是,
整数
System.Int32
不是引用类型

Nothing
这里并不意味着“无引用”(正如我最初所想的那样),只是将类型的默认值赋给变量。在这种情况下,
Integer
的默认值为0



因此,您的变量占用4个字节,因为它是一个
System.Int32
。您拥有的代码只会将值
0
分配给它。

您真的可以在vb.net中声明一个类型为
Integer
的值来保存
Nothing
?值类型总是有一个值
Nothing
仅使用该类型的默认值,在本例中为
0
Dim foo As foo=Nothing
不存储任何内容。您可以使用
null(Int32的)
来代替。好吧,这很有意义,但是可为null的引用类型呢?@jens:如上所述,
null
/
Nothing
的引用类型不需要在堆上存储任何内容,因为没有任何内容可存储。您混合了术语“可为null”仅当您将值类型包装在
Nullable(Of T)
中时,才将其用于值类型。您真的可以在vb.net中声明类型为
Integer
的值以保存
Nothing
?值类型始终具有值
Nothing
仅使用该类型的默认值,在本例中为
0
Dim foo As foo=Nothing
不存储任何内容。您可以使用
null(Int32的)
来代替。好吧,这很有意义,但是可为null的引用类型呢?@jens:如上所述,
null
/
Nothing
的引用类型不需要在堆上存储任何内容,因为没有任何内容可存储。您混合了术语“可为null”仅当您将值类型包装在
null(Of T)
int
是一个基本结构时,才将其用于值类型,因此您可能希望避免将其称为类
Nullable
也是一个结构。这说明引用需要8个字节,而实际对象没有任何其他内容。出于好奇,对于空引用,指针的值是多少(它是指针,对吗?;-)?@Jens不要忘记引用也只是一种值类型<引用类型上的code>null或
Nothing
,与引用某些内容的引用相比,仍然会占用相同的空间。@Jens值为0。这是一个指针式的东西,但我们称之为引用。它比一些指针更受限制。好吧,这很好地总结了它,回答了我的问题