.net 是否将GUID与默认值或空值进行比较?

f0ofjuux  于 2022-11-26  发布在  .NET
关注(0)|答案(7)|浏览(265)

检查GUID是否为空的正确方法是什么?
第一种方法:

Guid value;
// ...
if (value != Guid.Empty)

或第二种方法:

if (value != default(Guid))

我认为第二种方法更好,但我不能解释为什么。

1zmg4dgp

1zmg4dgp1#

因为Guid.Empty == default(Guid)并不重要,但我更喜欢Guid.Empty的可读性。

uoifb46i

uoifb46i2#

Guid.Empty相等new Guid(),而new Guid()也相等default(Guid)
当你反编译Guid结构时,它似乎;

public static readonly Guid Empty = new Guid();

既然Guid是一个struct,从 * Default Values Table *;
通过将所有值类型字段设置为默认值并将所有引用类型字段设置为空值而生成的值。
由于Guid的字段类型为shortintbyte(该类型的默认值为0),因此当我们使用default(Guid)时,将得到一个Guid,其中所有字段均为0
Guid.Empty Field开始
Guid结构的只读执行严修,其值全部为零
当我们写这个代码的时候;

Console.WriteLine(default(Guid));
Console.WriteLine(new Guid());

产出;

00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000

如果你关心可读性(我认为你应该关心),Guid.Empty对我来说似乎更好。

68bkxrlz

68bkxrlz3#

这两者是一样的!
Guid.Empty是Guid的只读字段,具有值{00000000-0000-0000-0000-000000000000}
对于default(Guid),编译会创建一个常量值,其值为{00000000-0000-0000-0000-000000000000}
在这两种情况下,都会将您的值与内存中某个位置的另一个值进行比较。
使用Guid.Empty以提高可读性。
当您使用泛型时,请使用default(T)

8e2ybdfx

8e2ybdfx4#

我会说第二个纯粹是因为你有一个 uninitialized 状态的记录,因此,它将包含 default 值。你检查的是变量是否处于默认状态,而不是它是否为空- 2个不同的检查(IMO)。
Guid.Empty等效于.NET中的default(Guid),因此从技术Angular 来看这并不重要,但是,与Guid.Empty相比,我会觉得您检查的是特定值,而不是记录是否处于默认状态。

4xrmg8kj

4xrmg8kj5#

您应该使用下列程式码:

var guidIsEmpty = value == Guid.Empty;

然而,与Guid.Empty相比,这两种方法在技术上都是正确的。

uqjltbpv

uqjltbpv6#

就我个人而言,我会使用Guid.Empty来提高可读性。我唯一真正这样使用default的时候是在没有其他选项的时候,比如检查KeyValuePair

x7rlezfr

x7rlezfr7#

我知道这是一条旧线,但刚要插话:
当将GUID的默认值定义为方法的参数时,必须使用default(Guid)而不是Guid.Empty,因为Guid.Empty不被视为编译时常量。
这将编译:

private void MyMethod(Guid id = default(Guid))

这不会编译:

private void MyMethod(Guid id = Guid.Empty)

相关问题