c# - 为什么 Guid 构造函数的源代码包含 "this = Guid.Empty"行?

标签 c# .net

如果您查看Guid(string) 的构造函数的源代码in the .NET 4.5.2 source code如下:

public Guid(String g)
{
    if (g==null) {
        throw new ArgumentNullException("g");
    }
    Contract.EndContractBlock();
    this = Guid.Empty;

    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.All);
    if (TryParseGuid(g, GuidStyles.Any, ref result)) {
        this = result.parsedGuid;
    }
    else {
        throw result.GetGuidParseException();
    }
}

问题是 this = Guid.Empty; 这行的目的是什么?

据我所知,如果 string g 可以在 TryParseGuid 方法中成功解析,那么 this 将被赋值。如果不能,则会抛出异常。

假设你写了:

var guid = new Guid("invalidguid");

这会导致异常,我认为 guid 的值是未定义的。那么为什么需要将 this 分配给 Guid.Empty

最佳答案

这更多的是风格问题 - 从功能上讲它是多余的,编译器甚至可以在生成的代码中优化掉对 Guid.Empty 的赋值。

防御性编码建议变量应始终明确分配初始值。为什么?因为它减少了歧义,特别是对于那些不熟悉给定编程语言/平台细节的人。例如有人可能会问:

  • Guid 的默认值是多少?
  • 它应该是一个新的 Guid 吗?
  • 它应该全为零吗?
  • 是否应该是其他不确定状态?

在声明中:

Guid id = Guid.Empty;

所有这些问题基本上都可以通过阅读代码来回答,而不必求助于阅读文档和/或源代码。此外,很明显,变量 id 开始时为空,这向读者表明稍后将在代码中设置它的值。

关于c# - 为什么 Guid 构造函数的源代码包含 "this = Guid.Empty"行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29506330/

相关文章:

.net - System.Configuration.ConfigurationManager 不可用?

.net - 使用 IMultiValueConverter 将多个 CommandParameters 传递给 viewModel

c# - 在 linq-to-sql 查询中将字符串转换为 int : how to deal with values which cannot be converted?

c# - 为什么 MSDTC 在使用 mstest 进行单元测试时表现不一致?

c# - 是否有更简单的方法使用 Microsoft.Extensions.Configuration 将数组作为命令行参数传递?

c# - 在 ASP.NET 中使用超链接编辑 gridview 中的行

c# - 在 C# 中处理异步 HttpWebRequest 异常的最佳方法是什么?

c# - API Controller 无法从 POST 正文中读取 Json

c# - Linq 首先按特定数字排序,然后按顺序显示所有其余部分

c# 泛型列表