【问题标题】:VB Classes Best Practice - give all properties values?VB 类最佳实践 - 给所有属性值?
【发布时间】:2010-03-16 14:42:11
【问题描述】:

对不起,如果这有点随机,但是当类被实例化时,给类的所有字段一个值是一种好习惯吗?我只是想知道拥有一个不带参数并为所有字段提供默认值的构造函数是否更好的做法,或者是否应该分配具有值的字段而其他字段在需要之前保持不变?

我希望这是有道理的, 贝基

【问题讨论】:

    标签: vb.net class constructor


    【解决方案1】:

    我不知道它是否会产生性能差异,但我个人更喜欢在声明中为其指定显式默认值的任何字段,如下所示:

    Public Class MyClass
        Private pIsDirty As Boolean = False
        Private pDated as Date = Now()
    End Class
    

    请记住,大多数“简单”类型,如布尔值、整数等,都是自动默认的,不需要初始化,但我在这里作为示例展示,有时为了清楚起见,无论如何你都需要它。此外,由于我编写的任何类都是供内部使用的(我们不出售任何代码对象供公众使用),我可以向我的类的消费者保证。所以我通常只写一个最小的构造函数(如果需要一个非默认构造函数),它只接受主要字段,并使用 VB 中的新 With 语法启动任何附加值,如下所示:

    Dim myObj = New SomeClass() With { .Prop1 = "value", .Prop2 = Now() }
    

    【讨论】:

    • 语法看起来很棒,我想我会用它,因为它会删除我所有的参数负载构造函数:o)
    • 不需要将变量初始化为其默认值。 msdn.microsoft.com/library/ms182274(VS.90).aspx
    • 正确的蒂姆,正如我所说的,一些数据类型已经默认,并且不需要初始化。有些人可能更喜欢为了清楚起见,或者组织标准,或者谁知道。我只是将这些变量用作快速示例。给出的代码只是一个 [非常] 快速而肮脏的例子。
    • 对不起,这是一个错误的答案。此策略仅适用于无行为数据持有者类(if 甚至存在!),仅此而已。我什至会说这是代码异味,因为它使类的 API 更难使用,允许实例处于未初始化状态并且基本上只是懒惰。 eidylon 甚至说,“因为我写的任何类都是内部使用的,所以我可以向消费者保证”——即使是真的,这基本上是好的类设计的对立面。套用 Josh Bloch 的话说:编写每个类,就好像它是一个公共 API,只有好处。
    • 抛开其他参数,它实际上并没有使类处于不一致的状态。任何需要初始化并具有默认值的字段都将被显式初始化(​​或根据 Tim 的评论对内在类型隐含)。如果某些字段必须设置为某些内容,并且没有可用且可接受的默认值,那么在这种情况下,我将编写一个构造函数,专门公开最终用户需要设置的那些字段。 . 从而强制类始终处于可用状态,并删除默认构造函数。
    【解决方案2】:

    您的类的构造函数应该接受足够的参数以处于可用状态。

    您可以通过在构造函数中使用 Optional Parameters 来获得您似乎正在寻找的相同功能。

    这样,您可以通过名称仅设置您必须设置的属性,其余的保留默认值,直到您需要更改它们。

    Sub Notify(ByVal Company As String, Optional ByVal Office As String = "QJZ")
       If Office = "QJZ" Then
          Debug.WriteLine("Office not supplied -- notifying Headquarters")
          Office = "Headquarters"
       End If
       ' Code to notify headquarters or specified office.
    End Sub
    

    请记住,可选参数必须在所有非可选参数之后。

    【讨论】:

      【解决方案3】:

      理想的做法是在构造函数返回后立即使对象处于可用状态。这样可以减少错误地使用部分“就绪”的对象。

      【讨论】:

        【解决方案4】:

        这取决于。你打算如何使用这个类?上课的目的是什么? (即它是用于数据库建模的实体类还是其他类)

        当使用不带参数的构造函数实例化类时,我总是使我的实体类具有可空属性,这些属性全部为空。然后当我调用 .Load 时,我知道所有属性都反映了数据库。

        添加一个调用 .Load 并分配数据库中所有属性已知值的构造函数也是可行的方法。

        如果您不是指实体建模类,那么它实际上取决于您对该类的使用。

        我个人的偏好是为所有属性分配一个已知值(来自构造函数参数),因此该类处于已知 - 中性状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多