【发布时间】:2010-03-16 14:42:11
【问题描述】:
对不起,如果这有点随机,但是当类被实例化时,给类的所有字段一个值是一种好习惯吗?我只是想知道拥有一个不带参数并为所有字段提供默认值的构造函数是否更好的做法,或者是否应该分配具有值的字段而其他字段在需要之前保持不变?
我希望这是有道理的, 贝基
【问题讨论】:
标签: vb.net class constructor
对不起,如果这有点随机,但是当类被实例化时,给类的所有字段一个值是一种好习惯吗?我只是想知道拥有一个不带参数并为所有字段提供默认值的构造函数是否更好的做法,或者是否应该分配具有值的字段而其他字段在需要之前保持不变?
我希望这是有道理的, 贝基
【问题讨论】:
标签: vb.net class constructor
我不知道它是否会产生性能差异,但我个人更喜欢在声明中为其指定显式默认值的任何字段,如下所示:
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() }
【讨论】:
您的类的构造函数应该接受足够的参数以处于可用状态。
您可以通过在构造函数中使用 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
请记住,可选参数必须在所有非可选参数之后。
【讨论】:
理想的做法是在构造函数返回后立即使对象处于可用状态。这样可以减少错误地使用部分“就绪”的对象。
【讨论】:
这取决于。你打算如何使用这个类?上课的目的是什么? (即它是用于数据库建模的实体类还是其他类)
当使用不带参数的构造函数实例化类时,我总是使我的实体类具有可空属性,这些属性全部为空。然后当我调用 .Load 时,我知道所有属性都反映了数据库。
添加一个调用 .Load 并分配数据库中所有属性已知值的构造函数也是可行的方法。
如果您不是指实体建模类,那么它实际上取决于您对该类的使用。
我个人的偏好是为所有属性分配一个已知值(来自构造函数参数),因此该类处于已知 - 中性状态。
【讨论】: