Guid被认为是值类型还是引用类型?

Sof*_*eek 30 .net c# guid value-type reference-type

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

它是否正确?

Guid uid = new Guid();

Guids是否存储在堆上?

Ran*_*pho 38

Guid是一种价值类型.

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

  • 当然除了System.ValueType,它实际上是一个类:) (4认同)

Jul*_*iet 36

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

public struct Guid ...
Run Code Online (Sandbox Code Playgroud)

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

bool guidIsValueType = typeof(Guid).IsValueType;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不,这是一种价值类型 - >请参阅@ Randolpho的回答 (4认同)

Eri*_*ert 18

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

别想了.值类型也可以有构造函数.说完全合法,虽然很奇怪

int x = new int();
Run Code Online (Sandbox Code Playgroud)

这与为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的位是在堆栈上还是在堆上.它有什么不同?


Sam*_*ell 6

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

  • 您可能希望将枚举添加到值类型列表中. (4认同)

Hir*_*ana 5

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

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
*/
Run Code Online (Sandbox Code Playgroud)