在c#中使用默认值(..)和文字值声明变量

本文关键字:文字 声明 变量 默认值 | 更新日期: 2023-09-27 18:15:44

在我上一份工作中,我的经理告诉我他读过微软关于变量声明的最佳实践指南。

例如,我想声明一个int、一个string和一个泛型类型,它们的默认值:

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);
在某些方面,我可以理解为什么这种方法可能是有利的,因为变量的声明和初始化是一致的。

我想知道是否有人知道我的经理声明的合法性,在这方面,如果你能给我指出微软的。net和c#最佳实践文档中的指导方向

在c#中使用默认值(..)和文字值声明变量

我得说你的代码比你经理建议的更可读。编写所有人都可读的代码。我也没有从微软那里得到这样的指导方针(如果有的话,有人可以引用它)。

为了便于论证,请考虑以下代码片段:您有多确定它的默认值是什么?

SomeCustomType something = default(SomeCustomType);

null ?还是new SomeCustomType ?不,你不能说,除非你知道它是struct还是class。为了知道这一点,您需要导航到类型的定义(如果没有源代码,则导航到元数据)。考虑有10多个这样的领域。它变得乏味。所以直接告诉你代码的读者,SomeCustomType something = null;是一个引用类型(忽略可空类型,我们可以很容易地找到它,它将有?后缀)。相信我,你代码的读者会很高兴的。

当我们开始讨论实例或静态字段时,所有这些参数都开始失效。因为它是冗余的,CLR为您做了这些。你不需要。有趣的是,如果针对。net 1.1编译程序,初始化字段会导致性能损失。

我不喜欢你经理的建议。对我来说,将int初始化为0而不是default(int)是很清楚的。

但是,如果我需要使用您的经理建议,我更喜欢使用var而不是声明类型:

var index = default(int);
var ordersPerCustomer = default(Dictionary<string, Order>);

这减少了代码中的"噪音",因为类型在default中明确规定了。

我总是听到default(T)关键字用于泛型类型,当它是未知的var将指向一个值类型或引用。我认为它相当于右边的var关键字,但主要用于通用模板。

来源:http://msdn.microsoft.com/en-us/library/xwth0h0d (v = vs.110) . aspx

编辑:请参阅这个相关的线程与默认(类型)关键字的一般描述:"默认"关键字在c#中的用途是什么?