在 C# 中使用 default(...) 与文字值声明变量 [关闭]
Posted
技术标签:
【中文标题】在 C# 中使用 default(...) 与文字值声明变量 [关闭]【英文标题】:Declaring variables with default(...) vs literal value in C# [closed] 【发布时间】:2014-07-30 15:06:20 【问题描述】:在我上一份工作中,我的经理告诉我,他阅读了有关变量声明的 Microsoft 最佳实践指南。
例如,我想声明一个 int、一个字符串和一个泛型类型,以及它们的默认值:
int intValue = 0;
string stringValue = null;
T genericValue = default(T);
上面的例子说明了所有变量都被初始化为它们的默认值,显式(和字面上),除了泛型类型的情况;这里我们使用default(T)
将成员隐式初始化为其默认值。
我的经理提出的论点是所有变量,即使在我们使用默认值初始化它们的情况下,也应该使用 default(...);
进行初始化
int intValue = default(int);
string stringValue = default(string);
T genericValue = default(T);
在某些方面我可以理解为什么这种方法可能是有利的,因为变量的声明和初始化是一致的。
我想知道是否有人知道我的经理声称的合法性,在这方面,您是否可以在 Microsoft 的 .NET 和 C# 最佳实践文档中为我指出行规的方向
【问题讨论】:
有一个 FxCop 规则强制删除无操作字段初始值设定项。 【参考方案1】:我会说您的代码比您的经理建议的更具可读性。编写所有人都可读的代码。此外,我还没有通过微软的这样的指导方针(如果有的话,有人可以引用它)。
为了论证起见,考虑以下sn-p:你有多确定它的默认值是多少?
SomeCustomType something = default(SomeCustomType);
null
?或new SomeCustomType
?不,除非你知道是struct
还是class
,否则你不能说。为了知道您需要导航到类型的定义(或元数据,如果没有源代码)。考虑有 10 多个这样的字段。它变得乏味。所以马上告诉你代码的读者SomeCustomType something = null;
是一个引用类型(忽略可为空的类型,我们可以很容易地找到它,它将有?
suffix)。相信我,您的代码的读者会很高兴..
当我们开始谈论实例或静态字段时,所有这些论点都开始破裂。因为它是多余的,所以 CLR 会为您执行此操作。你不需要。有趣的是,如果您针对 .Net1.1 initializing the fields to leads to performance penalty 编译程序。后期优化了。
【讨论】:
+1。我看到的问题是,如果以后审查此代码的程序员不知道int
的default
值是什么?他们必须用谷歌搜索,然后找到这个 *** 问题。只需将变量设置为0
,就可以省去一些麻烦。
@SteveWortham 如果当时互联网无法正常工作,情况会变得更糟:-D【参考方案2】:
我不喜欢你经理的建议。对我来说很清楚将int
初始化为0,而不是default(int)
。更明确。
但是,如果我需要使用您的经理建议,我更喜欢使用 var
而不是声明类型:
var index = default(int);
var ordersPerCustomer = default(Dictionary<string, Order>);
这减少了代码中的“噪音”,因为类型在 default
中明确明确。
【讨论】:
【参考方案3】:我总是听说泛型类型使用default(T)
关键字,当不知道var 将指向值类型还是引用时。我认为它是 var
关键字的右侧等效项,但主要用于通用模板。
来源:http://msdn.microsoft.com/en-us/library/xwth0h0d(v=vs.110).aspx
编辑:请参阅此相关主题以及对默认(类型)关键字的一般描述:What is the use of `default` keyword in C#?
【讨论】:
以上是关于在 C# 中使用 default(...) 与文字值声明变量 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 提取 PDF 文件中的所有文字(支持 .NET Core)