36

Guid 是使用new关键字创建的,这让我认为它是一种引用类型。

它是否正确?

Guid uid = new Guid();

Guid 是否存储在堆上?

4

6 回答 6

43

Guid 是一种值类型。

请参阅MSDN。请注意, Guid 是一个struct。所有结构都是值类型

于 2010-02-26T19:22:58.617 回答
37

您可以自己查看 Guid 的定义:

public struct Guid ...

或者你可以像这样测试它:

bool guidIsValueType = typeof(Guid).IsValueType;

引用:“ GUID 是使用 new 关键字创建的,这让我认为它是一种引用类型。”

结构也可以有构造函数,例如new DateTime(2012, 12, 23).

于 2010-02-26T19:24:59.563 回答
21

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 的位是在堆栈上还是在堆上。它有什么区别?

于 2010-02-26T20:43:33.133 回答
7

它是一种价值类型。

http://msdn.microsoft.com/en-us/library/system.guid.aspx

于 2010-02-26T19:22:57.057 回答
6

它实际上是Guid。所有类型都是使用new关键字构造的。您可以通过它们是接口委托(所有引用类型),还是结构枚举(值类型)来从值类型中识别引用类型。

于 2010-02-26T19:26:53.180 回答
3

它的值类型,见下面的例子:

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
*/
于 2018-04-03T04:39:38.360 回答