【问题标题】:VS2010's "Public Property <PropertyName> As <DataType> vs. Public varVS2010 的“Public Property <PropertyName> As <DataType> vs. Public var
【发布时间】:2011-02-14 11:57:50
【问题描述】:

在VS2008中,我曾经打字

Public Property <PropName> As <dataType> 

然后按 Enter 键,IDE 编辑器会自动将其展开为完整的属性块。

现在,据我了解,2010 年的一个新功能是编译器自动将上面的简短语法“扩展”为与您使用完整属性 GET AND SET 子方法获得的相同 IL 代码,这些子方法已经习惯了之前在编辑器中看到过。

但是功能,这与仅仅拥有一个公共类级别的变量有什么不同呢?如果唯一的差异是它编译成的内容,并且如果在其他方面没有功能差异,那么新方法是否比旧方法效率低,因为它涉及的代码比仅具有类级别的内存变量更多?

Public <Variable> as <DataType>

我认为,如果您的属性后面没有代码,那么它们本质上是相同的。我想不同之处在于他们只是添加了关键字“属性”但功能,他们没有差异,是吗?

【问题讨论】:

    标签: vb.net visual-studio-2008 visual-studio-2010


    【解决方案1】:

    在这种特殊情况下几乎没有什么区别,但我从不使用公共数据成员——任何需要在类之外公开的东西总是用属性来完成的。这意味着在声明它们时需要做更多的工作,但是当你稍后希望你有一个属性/访问器方法因为你需要实现一些代码时,知道代码中的其他地方已经在使用你的属性要容易得多。 .

    在有人把我拉起来之前,不 - 无论如何都不一样...您可以使用引用来操纵公共成员...

    【讨论】:

      【解决方案2】:

      这与属性为何有用密切相关。它们在类实现和使用它的客户端代码之间提供了一定程度的隔离。当您使用公共字段时,您无法轻松地重构该字段的行为方式,客户端代码直接引用它。例如,将字段更改为属性需要重新编译所有使用它的客户端代码。

      自动属性的用处在于它不会强迫您预先决定某个字段可能需要在某天重构。您可以随时推迟决定并将其从自动属性更改为具有自定义行为的显式属性。无需对客户端代码进行任何更改。

      JIT 编译器确保自动属性与字段一样高效,它内联访问器方法调用。新的自动属性语法使其在您的手腕上与公共字段一样高效。这是一个完全的双赢,再次使用公共字段已经没有任何意义了。

      【讨论】:

        【解决方案3】:

        我不确定我是否正确理解了您的问题。
        但是已经讨论了公共类级别变量与属性的需求here

        编辑:此外,IDE/编译器可以让您轻松地减少代码,如果您只是在执行 get/set

        例如 public string Name { get; set; },不需要您声明支持字段。
        但是,您将不得不使用该属性访问该成员(甚至在类内部)。因为,编译器会为您生成一个支持字段,并且它的名称是未知的。

        【讨论】:

          【解决方案4】:

          另一个区别是属性是从其他控件(例如 DataGridView)访问的,这些控件可以读取公共属性值但不能读取变量。

          【讨论】:

            【解决方案5】:

            Auto-Implemented Properties (VB) 和公共字段的主要区别在于接口定义。

            如果将来您决定向属性添加逻辑,则使用具有自动实现属性的类的代码不需要更改,而如果您使用字段,则必须将接口定义修改为属性.

            因此,自动实现的属性使用公共字段的简单语法(没有完整的属性声明),但具有属性的灵活性。

            一点例子

            当前代码(C#):

            class PersonA {
              public int Age;
              public int BirthYear;
            }
            
            class PersonB {
              public int Age { get; set; }
              public int BirthYear { get; set; }
            }
            
            Usage:
            var john = new PersonA { Age = 30, BirthYear = 1980 };
            var jane = new PersonB { Age = 20, BirthYear = 1990 };
            

            如果将来您决定废弃 Age setter 并从 BirthYear 派生值,您可以轻松更新您的类,而不会破坏任何当前的客户端代码。

            class PersonA {
              public int Age { get { return Date.Now.Year - BirthYear; }; set { } };
              public int BirthYear;
            }
            
            class PersonB {
              public int Age { get { return Date.Now.Year - BirthYear; }; set { } };
              public int BirthYear { get; set; }
            }
            
            Usage:
            var john = new PersonA { Age = 30, BirthYear = 1980 }; // broken when not recompiled
            var jane = new PersonB { Age = 20, BirthYear = 1990 };
            

            【讨论】:

              猜你喜欢
              • 2018-07-28
              • 1970-01-01
              • 1970-01-01
              • 2011-03-21
              • 2023-02-22
              • 1970-01-01
              • 2011-04-02
              • 2023-03-14
              • 2010-10-17
              相关资源
              最近更新 更多