C#编程风格问题 - 在实际分配之前分配Null

时间:2009-05-13 09:03:59

标签: c# coding-style

编程这种风格是否有充分的理由(优势)

XmlDocument doc = null;
doc = xmlDocuments[3];

VS

XmlDocument doc = xmlDocuments[3];

我已经看过很多次,但对我而言,它似乎过于冗长

11 个答案:

答案 0 :(得分:30)

不 - 通常认为最好的做法是尽可能晚地声明变量,最好在声明点设置它。我不这样做的唯一时间是我必须有条件地设置变量,或者它设置在更严格的范围内:

String name;
using (TextReader reader = ...)
{
    // I can't declare name here, because otherwise it isn't
    // accessible afterwards
    name = reader.ReadToEnd();
}

在可能的情况下首次使用时声明的原因:

  • 它使变量的类型接近其使用 - 无需在方法中向上滚动以查找它。
  • 它使范围尽可能地缩小,这使得变量的使用更加明显。

答案 1 :(得分:18)

我会用

XmlDocument doc = xmlDocuments[3];

声明使用它们的变量。

答案 2 :(得分:3)

它们是不同的风格,它们都没有比另一种更客观。这只是一个品味问题。您可以先声明变量,然后为其赋值:

XmlDocument doc;
doc = xmlDocuments[3];

或者你可以在同一个声明中做到这两点:

XmlDocument doc = xmlDocuments[3];

但是,这种形式:

XmlDocument doc = null;
doc = xmlDocuments[3];

要为变量指定空引用,然后立即用不同的引用替换它,完全没有意义。

答案 3 :(得分:2)

理想情况下,声明和赋值应与代码易读性配对。事实上,ReSharper会接受任何例外,并建议他们加入。

答案 4 :(得分:1)

正如其他人指出的那样,如果你需要在循环范围之外声明变量,if或其他东西,第一种样式会很有用。但在大多数情况下,我认为这种风格是Visual Basic 6(及更早版本)旧时代的遗留物,在使用之前你总是必须声明一个变量。

旧的VB不支持你的第二种风格,因此第一种风格仍然很受欢迎......

答案 5 :(得分:0)

如果变量'doc'在之后被赋予,那么它被声明然后没有,我没有看到任何你想要这样做的理由。无论如何,这肯定不是我的风格。

答案 6 :(得分:0)

我喜欢将变量视为“共享”或“不共享”,因为某些变量需要在类或方法中的多个位置使用,有些变量只需要使用一次。 对于前者,我将它们全部声明在相关块的顶部,后者在我使用它们之前声明。

这完全取决于您需要使用它们的位置。

案例1:

Xyz xyz = new Xyz; // Declared at the top.
// Loads of unrelated code in-between...
xyz.abc();
// More unrelated code in-between...
xyz.def(stuff);

案例2:

// Loads of unrelated code above...
Xyz xyz = new Xyz; // Declared in a 'block'.
xyz.abc();
xyz.def(stuff);
xyz.destroy();
// More unrelated code below...

答案 7 :(得分:0)

我主要同意乔恩(更不用说通常我必须同意他: - )。

你有选择:

1

//Do something...
XmlDocument doc = xmlDocuments[3];
//use doc
//Do something...

2

//Do something...
XmlDocument doc = null;
doc = xmlDocuments[3];
//Use doc
//Do something...

3

//Do something...
XmlDocument doc = null;
//...Do something with other variables etc...
doc = xmlDocuments[3];
//Do something...
//Use doc

4

//Do something...
XmlDocument doc = null;
//...Do something with other variables etc...
doc = xmlDocuments[3];
//Use doc
//Do something...

5

//Do something...
XmlDocument doc = null;
doc = xmlDocuments[3];
//Do something...
//Use doc

6

//Do something...
XmlDocument doc = xmlDocuments[3];
//Do something...
//use doc

我希望你能看到选项1很有道理。

最好将声明,定义和初始化保持为“一起”。 选项1是在一行中一起完成的声明,定义和初始化的示例。你可以进一步压缩它:

var doc = xmlDocuments[3];

词汇(语言无关):

  • 声明:编码器为编译器引入新名称。
  • 类型绑定:类型推断,使用超类型等。
  • 定义:编码器使编译器保留空间。 (在堆栈等 - 注意外部名称不需要空格)
  • 初始化:编码器在定义期间第一次分配值。 如果编码器省略初始化,编译器会在大多数情况下进行初始化(为空,0,假,默认值等)。
  • 用法:明显!
  • 范围:明显!
  • 适用的辅助功能。 :很明显!
  • 修饰符:实例级别,类级别,方法级别,常量,只读等。

我希望这会有所帮助。

答案 8 :(得分:-1)

我更喜欢使用这个:

XmlDocument doc = null;
//blah blah
doc = xmlDocuments[3];

我只想在需要时分配和使用'doc'。

如果我想在作业后立即使用

 XmlDocument doc = xmlDocuments[3];

答案 9 :(得分:-2)

我会选择

void Foo()
{
  XmlDocument doc;

  //Do other code here

  //Create doc
  doc = xmlDocuments[3];
}

因为doc可能在以后的方法中才被使用。在使用doc之前创建doc更有意义。更容易阅读(减少滚动)。

答案 10 :(得分:-3)

我总是试图在可能的情况下声明并在同一行上分配变量,所以在这种情况下我会尝试使用第二个选项。在阅读代码时,要记住的代码行数越少,声明的变量就越少。最后,我认为这完全取决于您和您的团队使用的编码规则。我们有编码规则说在方法的开头声明所有局部变量,所以我看到了两种编程风格。