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

时间:2014-07-30 15:06:21

标签: c# .net default

在我上一份工作中,我的经理告诉我他已经阅读了微软最佳实践公会关于变量声明的内容。

比如说我想声明一个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);

在某些方面,我可以看到为什么这种方法可能是有利的,因为变量的声明和初始化是一致的。

我想知道是否有人知道我的经理声称的合法性,并且在这方面,如果你能指出我在微软的.NET和C#最佳实践文档中的guildine的方向

3 个答案:

答案 0 :(得分:3)

我说你的代码比你的经理建议的更具可读性。编写可供所有人阅读的代码。此外,我还没有通过微软提出这样的指导原则(有人可以引用它)。

为了争论,请考虑以下片段:您对它的默认值有多确定?

SomeCustomType something = default(SomeCustomType);

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

当我们开始讨论实例或静态字段时,所有这些参数都开始破坏。因为它是多余的,CLR会为您做到这一点。你不需要。有趣的是,如果您针对.Net1.1 initializing the fields to leads to performance penalty编译程序。以后进行了优化。

答案 1 :(得分:0)

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

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

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

这会减少&#34;噪音&#34;在代码中,类型明确在default

中明确显示

答案 2 :(得分:0)

我一直听到泛型类型使用的default(T)关键字,当var不知道var是指向值类型还是引用时。我认为它是var关键字的右侧等价物,但主要用于通用模板。

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

编辑:请参阅此相关主题,其中包含默认(类型)关键字的一般说明:What is the use of `default` keyword in C#?