Guids是使用new
关键字创建的,这让我觉得它是一种参考类型。
这是对的吗?
Guid uid = new Guid();
Guids是否存储在堆上?
答案 0 :(得分:37)
Guid是一种价值类型。
见MSDN。请注意,Guid是struct。所有结构都是Value Types。
答案 1 :(得分:36)
您可以自己查看Guid的定义:
public struct Guid ...
或者您可以像这样测试:
bool guidIsValueType = typeof(Guid).IsValueType;
GUID是使用new创建的 关键字让我觉得它是一个 参考类型。
结构也可以有构造函数,例如new DateTime(2012, 12, 23)
。
答案 2 :(得分:17)
GUID是使用new关键字创建的,这使我认为它是一种引用类型。
不要这么想。值类型也可以有构造函数。说完
是完全合法的,虽然很奇怪int x = new int();
这与为x分配零点相同。
这是对的吗?
不。
GUID是否存储在堆上?
是。 Guids也存储在堆栈中。
请注意,下面的分析假定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的位是在堆栈上还是在堆上。它有什么不同?
答案 3 :(得分:7)
答案 4 :(得分:6)
实际上是Guid。所有类型都使用new
关键字构建。您可以根据值类型标识引用类型,无论它们是class,interface还是delegate(所有引用类型),还是struct或enum (价值类型)。
答案 5 :(得分:0)
其值类型,请参阅以下示例:
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
*/