使用 new 关键字使我认为这是一种参考类型。

这个对吗?

Guid uid = new Guid();

GUIDS是否存储在堆上?

有帮助吗?

解决方案

您可以自己看到GUID的定义:

public struct Guid ...

或者您可以这样测试:

bool guidIsValueType = typeof(Guid).IsValueType;

GUID是使用新关键字创建的,这使我认为这是一种参考类型。

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

其他提示

GUID是一种值类型。

MSDN. 。请注意,GUID是 结构. 。所有结构都是 价值类型.

GUID是使用新关键字创建的,这使我认为这是一种参考类型。

停止思考。价值类型也可以具有构造函数。说这是完全合法的,虽然很奇怪

int x = new int();

这与将零分配给x相同。

这个对吗?

没有。

GUID是否存储在堆上?

是的。 GUID还存储在堆栈中。

请注意,下面的分析假定CLI的实现是Microsoft“桌面”或“ Silverlight” CLR在Windows上运行的。我不知道CLI的其他版本在Mac上做什么,等等。如果您需要知道在其他实现中是否存储了特定的内存,则必须询问某人是这些实现的专家。

在以下情况下,将GUID存储在堆栈上:

(1)当GUID是持续计算的“临时”结果或被用作方法的参数。例如,如果您有一个方法调用M(new GUID()),则在堆栈上分配了新GUID的临时存储。

(2)当GUID是(a)不在迭代器块中的局部变量时,(b)不是匿名方法或lambda表达式的闭合外部变量。

在所有其他情况下,GUID均未存储在堆栈中。当它是参考类型的字段,数组的元素,匿名方法或lambda表达式的闭合本地元素或迭代器块中的局部性时,将其存储在堆上。

GUID也不得存储在GC堆和堆栈中。可以将GUID存储在完全不受管理的内存中,并通过不安全的指针算术访问。

我很好奇您为什么如此关心GUID的位在堆栈上还是在堆上。它有什么区别?

实际上是 GUID. 。所有类型都是使用 new 关键词。您可以通过价值类型来识别参考类型是否是 班级, 界面, , 或者 代表 (所有参考类型)或 结构 或者 枚举 (值类型)。

其值类型,请参见下面的示例:

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
*/
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top