Guid 是使用new
关键字创建的,这让我认为它是一种引用类型。
它是否正确?
Guid uid = new Guid();
Guid 是否存储在堆上?
Guid 是使用new
关键字创建的,这让我认为它是一种引用类型。
它是否正确?
Guid uid = new Guid();
Guid 是否存储在堆上?
您可以自己查看 Guid 的定义:
public struct Guid ...
或者你可以像这样测试它:
bool guidIsValueType = typeof(Guid).IsValueType;
引用:“ GUID 是使用 new 关键字创建的,这让我认为它是一种引用类型。”
结构也可以有构造函数,例如new DateTime(2012, 12, 23)
.
GUID 是使用 new 关键字创建的,这让我认为它是一种引用类型。
别这么想了。值类型也可以有构造函数。这是完全合法的,虽然很奇怪,说
int x = new int();
这与将零分配给 x 相同。
它是否正确?
没有。
GUID 是否存储在堆上?
是的。指南也存储在堆栈中。
请注意,下面的分析假设 CLI 的实现是在 Windows 上运行的 Microsoft“桌面”或“Silverlight”CLR。我不知道其他版本的 CLI 做了什么,它们在 Mac 上做了什么,等等。如果您需要知道在其他实现中是否有特定的内存块存储在堆栈中,您必须询问那些在这些实现方面是专家的人。
Guid 在以下情况下存储在堆栈中:
(1) 当 Guid 是正在进行的计算的“临时”结果或被用作方法的参数时。例如,如果您有一个方法调用 M(new Guid()),那么新 Guid 的临时存储空间将分配在堆栈上。
(2) 当 Guid 是一个局部变量时,它 (a) 不在迭代器块中,(b) 不是匿名方法或 lambda 表达式的封闭外部变量。
在所有其他情况下,Guid 不存储在堆栈中。当 Guid 是引用类型的字段、数组的元素、匿名方法或 lambda 表达式的封闭局部或迭代器块中的局部时,Guid 存储在堆上。
Guid 也可以既不存储在 GC 堆中也不存储在堆栈中。Guid 可能存储在完全非托管的内存中,通过不安全的指针算法访问。
我很好奇为什么您如此关心 guid 的位是在堆栈上还是在堆上。它有什么区别?
它的值类型,见下面的例子:
using System;
public class Program
{
public static void Main()
{
Guid a1 = new Guid();
Console.WriteLine(a1);
Guid b1 = a1;
Console.WriteLine(b1);
a1 = Guid.NewGuid();
Console.WriteLine(a1);
Console.WriteLine(b1);
}
}
/* OUTPUT
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
164f599e-d42d-4d97-b390-387e8a80a328
00000000-0000-0000-0000-000000000000
*/