在 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。我看到的问题是,如果以后审查此代码的程序员不知道intdefault 值是什么?他们必须用谷歌搜索,然后找到这个 *** 问题。只需将变量设置为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# 中使用 XML 文字?

使用 C# 提取 PDF 文件中的所有文字(支持 .NET Core)

在 C# 中使用十六进制文字将整数设置为负值

在C#的RichTextBox中如何使特定文字显示颜色

js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果

如何在 C# 中添加 Properties.Settings.Default