【问题标题】:C# programming style question - Assignment of Null Before Real Assignment [closed]C# 编程风格问题 - 在实际赋值之前分配 Null [关闭]
【发布时间】:2009-05-13 09:03:58
【问题描述】:

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

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

XmlDocument doc = xmlDocuments[3];

我看过很多次,但对我来说似乎过于冗长

【问题讨论】:

    标签: c# coding-style


    【解决方案1】:

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

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

    尽可能在首次使用时声明的原因:

    • 它使变量的类型保持接近它的用途 - 无需在方法中向上滚动即可找到它。
    • 它使范围尽可能窄,这使得变量的使用更加明显。

    【讨论】:

      【解决方案2】:

      我会用

      XmlDocument doc = xmlDocuments[3];
      

      声明变量的使用位置。

      【讨论】:

        【解决方案3】:

        它们是不同的风格,客观上它们都不比另一个更好。这只是口味问题。你可以先声明变量,然后给它赋值:

        XmlDocument doc;
        doc = xmlDocuments[3];
        

        或者你可以在同一个语句中做这两个:

        XmlDocument doc = xmlDocuments[3];
        

        但是,这种形式:

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

        给变量分配一个空引用然后立即用不同的引用替换它是完全没有意义的。

        【讨论】:

        • 分配一个空引用并不是毫无意义的,它实际上是有害的,因为你不想养成这个习惯。如果您使用未分配的变量,编译器将发出编译错误。分配 null 将消除该错误。提出该错误通常很有用。
        • 我假设你的意思是它不是只是毫无意义。 :)
        【解决方案4】:

        理想情况下,声明和赋值应该配对以提高代码的可读性。事实上,ReSharper 会发现任何例外情况并建议加入。

        【讨论】:

          【解决方案5】:

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

          旧的 VB 不支持你的第二种风格,因此第一种风格仍然流行......

          【讨论】:

          • 我怀疑这是原因,因为这样做似乎没有任何功能性原因。
          【解决方案6】:

          如果变量 'doc' 是在 在声明之后 赋值的,那么不,我看不出你有什么理由要这样做。无论如何,这肯定不是我的风格。

          【讨论】:

            【解决方案7】:

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

            这完全取决于您需要在哪里使用它们。

            案例一:

            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...
            

            【讨论】:

            • 即使一个变量在多个地方使用,为什么要在顶部声明它而不是在 first 使用之前声明它?好处在哪里?在第一次使用时声明它意味着当您查看它的使用时,声明和初始化就在您面前,从而提高了可读性。
            【解决方案8】:

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

            你有选择:

            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];
            

            词汇(与语言无关):

            • 声明:Coder 为编译器引入了新名称。
            • 类型绑定:类型推断、使用超类型等
            • 定义:编码器使编译器保留空间。 (在堆栈等 - 注意外部名称不需要空间)
            • 初始化:编码器在定义期间首次赋值。 在大多数情况下,如果编码器忽略初始化,编译器会进行初始化(对 null、0、false、默认值等)。
            • 用法:很明显!
            • 范围:很明显!
            • 可访问性(如果适用)。 : 很明显!
            • 修饰符:实例级别、类级别、方法级别、常量、只读等。

            我希望这会有所帮助。

            【讨论】:

              【解决方案9】:

              我更喜欢用这个:

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

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

              如果我想在分配后立即使用它,我会选择

               XmlDocument doc = xmlDocuments[3];
              

              【讨论】:

              • 除非您特别需要,否则我会避免将值分配给 null。
              【解决方案10】:

              我会去

              void Foo()
              {
                XmlDocument doc;
              
                //Do other code here
              
                //Create doc
                doc = xmlDocuments[3];
              }
              

              因为 doc 可能要等到该方法的后期才会使用。在使用之前创建文档更有意义。更容易阅读(更少滚动)。

              【讨论】:

              • 为什么不在第一次使用时声明文档?更好:)
              • 为什么与在使用时查看变量的类型相比,查看正在使用的变量数量更有用?在方法开始时声明变量已被视为一种反模式很长时间...
              • 我认为它增加了混淆,因为它鼓励您使用相同的变量名来表示两种不同的含义 - 限制范围意味着变量的用途很明显.至于将鼠标悬停在变量上:当我不必用鼠标四处了解代码时,我发现代码更具可读性。
              • @Stevo3000 将声明放在顶部也意味着变量的范围大于必要的范围。这使得该变量的预期用途不太清楚,例如为什么要在开头声明循环索引?这只是鼓励重复使用,并增加出错的可能性。
              • @divo:这正是我要表达的观点。将变量保持在尽可能有限的范围内,因为这样可以防止意外使用错误的变量。
              【解决方案11】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-04-16
                • 2022-10-14
                • 2020-09-08
                • 2012-02-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多