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

C# Guid被认为是值类型还是引用类型?,c#,.net,guid,value-type,reference-type,C#,.net,Guid,Value Type,Reference Type,guid是使用new关键字创建的,这让我觉得它是一种引用类型 这是正确的吗 Guid uid=new Guid() GUI是否存储在堆上?它是一种值类型 Guid是一种值类型 看。请注意,Guid是一个。所有结构都是 您可以自己查看Guid的定义: public struct Guid ... 或者你可以这样测试它: bool guidIsValueType = typeof(Guid).IsValueType; 引用:“GUID是使用new关键字创建的,这使我认为它是引用类型。” 结构也可

guid是使用
new
关键字创建的,这让我觉得它是一种引用类型

这是正确的吗

Guid uid=new Guid()

GUI是否存储在堆上?

它是一种值类型

Guid是一种值类型


看。请注意,Guid是一个。所有结构都是

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

public struct Guid ...
或者你可以这样测试它:

bool guidIsValueType = typeof(Guid).IsValueType;
引用:“GUID是使用new关键字创建的,这使我认为它是引用类型。”

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

它实际上是。所有类型都使用
new
关键字构造。您可以通过引用类型是、或(所有引用类型)还是或(值类型),从值类型中识别引用类型

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

别这么想。值类型也可以有构造函数。这是完全合法的,尽管说起来很奇怪

int x = new int();
这与将零赋值给x是一样的

这是正确的吗

没有

GUID是否存储在堆上

对。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
*/

当然,除了System.ValueType,它实际上是一个类:)@JaredPar:True,但它也是抽象的,因此没有实例化的危险。您可能希望将枚举添加到值类型列表中。好吧,现在很清楚guid可以存储在任何地方,我想这无关紧要。在编写软实时应用程序(动画、游戏、一些UI工作)时,通常有必要在软件的特定“循环”或迭代中减少、摊销或消除GC分配。这样做可以减少或消除这些循环中的GC集合,从而导致用户可见的动画“挂接”。因此,了解是否需要特定的代码行“allocs”来决定何时缓存对象或使用对象池。示例:完全用C#编写的平滑实时物理模拟不能在碰撞或集成阶段分配。不,这是一个值类型->请参见@Randolpho'sanswer@CodingYourLife事实上,你读错了答案。