将Guid与默认值或空值进行比较
本文关键字:比较 空值 Guid 默认值 | 更新日期: 2023-09-27 18:11:15
检查Guid是否为空的正确方法是什么?
第一种方法:
Guid value;
// ...
if (value != Guid.Empty)
或第二种方法:
if (value != default(Guid))
我认为第二种方法更好,但我无法解释为什么。
由于Guid.Empty == default(Guid)
并不重要,但为了可读性,我更喜欢Guid.Empty
。
Guid.Empty
等价于new Guid()
,也等价于default(Guid)
。
当你对Guid
结构进行反编译时,它似乎;
public static readonly Guid Empty = new Guid();
由于Guid
是struct
,因此来自默认值表;
通过将所有值类型字段设置为默认值而产生的值值和所有引用类型字段设置为null。
由于Guid
的字段类型为short
、int
、byte
(此类型的默认值为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
对我来说似乎更好。
两者相同!
Guid.Empty
是Guid的只读字段,具有值{00000000-0000-0000-0000-000000000000}
。
使用default(Guid)
,编译会创建一个常量值,该值具有{00000000-0000-0000-0000-000000000000}
。
在这两种情况下,都会将您的值与内存中某个位置的另一个值进行比较。
为了便于阅读,请使用Guid.Empty
使用泛型时,请使用default(T)
。
我说第二个纯粹是因为记录处于未初始化状态,因此,它将包含默认值。您检查的是变量是否处于默认状态,而不是它是否为空-两种不同的检查(IMO(。
Guid.Empty
相当于.NET中的default(Guid)
,因此从技术角度来看,这并不重要,但是,与Guid.Empty
相比,给我的印象是,您检查的是特定值,而不是记录是否处于默认状态。
您应该使用以下内容:
var guidIsEmpty = value == Guid.Empty;
然而,与Guid相比,两者在技术上都是正确的。空的代码更有可读性。
就我个人而言,为了可读性,我会使用Guid.Empty
。我唯一一次像这样真正使用default
是在没有其他选项的情况下,例如在检查KeyValuePair
时。
我知道这是一个老话题,但我只想插话:
将Guid的默认值定义为方法的参数时,必须使用default(Guid(而不是Guid.Empty,因为Guid.Empy不被视为编译时常数。
这将编译:
private void MyMethod(Guid id = default(Guid))
这不会编译:
private void MyMethod(Guid id = Guid.Empty)