检查GUID是否为空的正确方法是什么?第一种方法:
Guid value; // ... if (value != Guid.Empty)
或第二种方法:
if (value != default(Guid))
我认为第二种方法更好,但我不能解释为什么。
1zmg4dgp1#
因为Guid.Empty == default(Guid)并不重要,但我更喜欢Guid.Empty的可读性。
Guid.Empty == default(Guid)
Guid.Empty
uoifb46i2#
Guid.Empty相等new Guid(),而new Guid()也相等default(Guid)。当你反编译Guid结构时,它似乎;
new Guid()
default(Guid)
Guid
public static readonly Guid Empty = new Guid();
既然Guid是一个struct,从 * Default Values Table *;通过将所有值类型字段设置为默认值并将所有引用类型字段设置为空值而生成的值。由于Guid的字段类型为short、int、byte(该类型的默认值为0),因此当我们使用default(Guid)时,将得到一个Guid,其中所有字段均为0。从Guid.Empty Field开始Guid结构的只读执行严修,其值全部为零。当我们写这个代码的时候;
struct
short
int
byte
0
Guid.Empty Field
Console.WriteLine(default(Guid)); Console.WriteLine(new Guid());
产出;
00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000
如果你关心可读性(我认为你应该关心),Guid.Empty对我来说似乎更好。
68bkxrlz3#
这两者是一样的!Guid.Empty是Guid的只读字段,具有值{00000000-0000-0000-0000-000000000000}。对于default(Guid),编译会创建一个常量值,其值为{00000000-0000-0000-0000-000000000000}。在这两种情况下,都会将您的值与内存中某个位置的另一个值进行比较。使用Guid.Empty以提高可读性。当您使用泛型时,请使用default(T)。
{00000000-0000-0000-0000-000000000000}
default(T)
8e2ybdfx4#
我会说第二个纯粹是因为你有一个 uninitialized 状态的记录,因此,它将包含 default 值。你检查的是变量是否处于默认状态,而不是它是否为空- 2个不同的检查(IMO)。Guid.Empty等效于.NET中的default(Guid),因此从技术Angular 来看这并不重要,但是,与Guid.Empty相比,我会觉得您检查的是特定值,而不是记录是否处于默认状态。
4xrmg8kj5#
您应该使用下列程式码:
var guidIsEmpty = value == Guid.Empty;
然而,与Guid.Empty相比,这两种方法在技术上都是正确的。
uqjltbpv6#
就我个人而言,我会使用Guid.Empty来提高可读性。我唯一真正这样使用default的时候是在没有其他选项的时候,比如检查KeyValuePair。
default
KeyValuePair
x7rlezfr7#
我知道这是一条旧线,但刚要插话:当将GUID的默认值定义为方法的参数时,必须使用default(Guid)而不是Guid.Empty,因为Guid.Empty不被视为编译时常量。这将编译:
private void MyMethod(Guid id = default(Guid))
这不会编译:
private void MyMethod(Guid id = Guid.Empty)
7条答案
按热度按时间1zmg4dgp1#
因为
Guid.Empty == default(Guid)
并不重要,但我更喜欢Guid.Empty
的可读性。uoifb46i2#
Guid.Empty
相等new Guid()
,而new Guid()
也相等default(Guid)
。当你反编译
Guid
结构时,它似乎;既然
Guid
是一个struct
,从 * Default Values Table *;通过将所有值类型字段设置为默认值并将所有引用类型字段设置为空值而生成的值。
由于
Guid
的字段类型为short
、int
、byte
(该类型的默认值为0
),因此当我们使用default(Guid)
时,将得到一个Guid
,其中所有字段均为0
。从
Guid.Empty Field
开始Guid结构的只读执行严修,其值全部为零。
当我们写这个代码的时候;
产出;
如果你关心可读性(我认为你应该关心),
Guid.Empty
对我来说似乎更好。68bkxrlz3#
这两者是一样的!
Guid.Empty
是Guid的只读字段,具有值{00000000-0000-0000-0000-000000000000}
。对于
default(Guid)
,编译会创建一个常量值,其值为{00000000-0000-0000-0000-000000000000}
。在这两种情况下,都会将您的值与内存中某个位置的另一个值进行比较。
使用
Guid.Empty
以提高可读性。当您使用泛型时,请使用
default(T)
。8e2ybdfx4#
我会说第二个纯粹是因为你有一个 uninitialized 状态的记录,因此,它将包含 default 值。你检查的是变量是否处于默认状态,而不是它是否为空- 2个不同的检查(IMO)。
Guid.Empty
等效于.NET中的default(Guid)
,因此从技术Angular 来看这并不重要,但是,与Guid.Empty
相比,我会觉得您检查的是特定值,而不是记录是否处于默认状态。4xrmg8kj5#
您应该使用下列程式码:
然而,与Guid.Empty相比,这两种方法在技术上都是正确的。
uqjltbpv6#
就我个人而言,我会使用
Guid.Empty
来提高可读性。我唯一真正这样使用default
的时候是在没有其他选项的时候,比如检查KeyValuePair
。x7rlezfr7#
我知道这是一条旧线,但刚要插话:
当将GUID的默认值定义为方法的参数时,必须使用default(Guid)而不是Guid.Empty,因为Guid.Empty不被视为编译时常量。
这将编译:
这不会编译: