等效的new Guid()和guide . empty的目的

本文关键字:guide empty new Guid | 更新日期: 2023-09-27 18:07:20

new Guid()Guid.Empty产生相同的结果(all-0 guid (0000000 -0000000 -0000000 -0000000 -000000000000)

var guid = new Guid();
Console.WriteLine(guid);//00000000-0000-0000-0000-000000000000
var emptyGuid = Guid.Empty;
Console.WriteLine(emptyGuid);//00000000-0000-0000-0000-000000000000

这是做同一件事的两种不同的方式吗?可读性原因?还是我错过了什么?

等效的new Guid()和guide . empty的目的

Guidstruct。所有结构体都有一个隐式默认构造函数,该构造函数将所有成员初始化为其默认值。在Guid中,您可以看到它将所有的组合成员设置为0

Guid.Empty只是通过调用默认构造函数缓存默认值:

public struct Guid : IFormattable, IComparable, IComparable<Guid>, IEquatable<Guid>
{
    public static readonly Guid Empty = new Guid();
}

另一种回答问题的方式,通过一个具体的例子:

c#允许你创建泛型类型(模板),它接受参数类型

例如:

public class MyTemplate<T>

可以在T上定义各种约束: "Not null""有构造函数""是一个类",等等。

:

public class MyTemplate<T> where T: notnull, new() // etc.

额外约束:您可能希望使T 不可为空,并且仍然返回默认值,该值可能不是"null"!

public class MyTemplate<T> where T: notnull, new() {
    public MyTemplate() {
        var t = new T(); // If T is a Guid, then this returns Guid.Empty.
        //var t = default; // Even if T is a Guid, 
                           // C# will still panic here because 
                           // it's not sure if the "default" of T 
                           // (which you know to be Guid.Empty)
                           // is nullable or not -- despite you 
                           // having defined T as notnull!
    }
}

总结:

你可以自己看到,根据上下文,相同的值 (guide . empty)可以从不同的概念派生出来:在一种情况下,它是无参数构造函数的结果,在另一种情况下,它是默认值。

因为c#不能预测你想做什么(如果你足够深入抽象,那么你可能想要一个场景,或另一个,或两个!)它实现了所有的概念单独,即使它们给出相同的结果。因此,您最终获得new Guid()Guid.Empty,以使用例(每个抽象)满意。