我来自VBA世界,在那里将代码分解为类,名称空间和模块的选项受到限制。现在,我刚进入一个有很多选择的世界,我感到迷茫。
我想知道在另一个类中声明一个类的目的是什么? (请参见下面的示例)
Class FirstClass
Public OnePropertyInside As String
Class SecondClass
Public AnotherProperty As String
End Class
End Class
如果我创建FirstClass
的新实例(例如myFirstClass
),则不会实例化SecondClass
。
(至少对我而言)更为愚蠢的是,智能为我提供了myFirstClass.SecondClass
。显然,由于未实例化该类,因此我无法访问其任何成员。
因此,仅在SecondClass
包含shared
个成员的情况下有用吗?
为了尝试回答该问题,我在SecondClass
中添加了一个共享成员:
Class FirstClass
Public OnePropertyInside As String
Class SecondClass
Public AnotherProperty As String
Public Shared SharedProperty As String
End Class
End Class
我进行了一些测试,这些测试带来了次要问题(请参见代码中的注释)
Sub Main()
Dim myFirstClass As New FirstClass
'Works as expected
Console.WriteLine(myFirstClass.OneProperty)
'What is the difference between the two lines below?
Console.WriteLine(myFirstClass.SecondClass.SharedProperty)
Console.WriteLine(FirstClass.SecondClass.SharedProperty)
'This line cannot be compiled, this demonstrates SecondClass is not instantiated when FirstClass is.
Console.WriteLine(myFirstClass.SecondClass.AnotherProperty)
Dim mySecondClass As New FirstClass.SecondClass
'Works as expected, but I feel this hierarchy should better be dealt with through a namespace statement?
Console.WriteLine(mySecondClass.AnotherProperty)
End Sub
答案 0 :(得分:5)
您可以将其视为最里面的类是某种帮助程序类。甚至根本不需要使用它。将内部类(或简单嵌套的类)嵌套在外部类中,可以访问外部成员的所有成员。您甚至可以访问该初始外部类中的私有成员。
编辑:为澄清起见,我的意思是说,内部可以访问外部的私有成员,而不能相反。
答案 1 :(得分:3)
通常这样做是因为您想限制嵌套类的范围。
因此,如果只需要在“父”类中使用该类(就范围而言),则通常将其定义为嵌套类是一个好主意。
如果您可能需要在程序集的外部使用该类,则最好将其定义为一个完全独立的类(在其自己的文件中),然后相应地定义您的关系。您将需要在另一个实例化一个实例(无论它是单独的还是嵌套的,这都是相同的-因此它的位置在该点上基本上无关紧要)。
答案 2 :(得分:1)
这样做时,内部类可被其他类访问(可访问性为Public
或Friend
),外部类基本上就像命名空间一样工作。因此,例如,使用您的示例,您可以创建嵌套类的新对象,而无需创建任何外部类:
Dim x As New FirstClass.SecondClass()
最明显的好处是代码的结构组织,非常类似于名称空间和代码文件。因此,例如,将嵌套类用于常量以帮助更好地组织它们并不罕见:
Public Class Urls
Public Class Processing
Public Const Submit As String = "..."
Public Const Cancel As String = "..."
End Class
Public Class Reporting
Public Const Daily As String = "..."
Public Const Weekly As String = "..."
End Class
End Class
' ...
Dim url As String = Urls.Reporting.Daily
但是,在狭窄的情况下,诸如此类的事情很有用,大多数人宁愿根本不嵌套公共类。
但是,正如其他人提到的那样,您真正会看到相当经常使用的嵌套类的地方是Private
类。如果您需要一些小的帮助程序类,这些类将无法在类外进行编码,则没有理由公开它。即使将其可访问性设置为Friend
,同一项目中的所有其他类仍将可见。因此,如果您真的想将其隐藏在其他所有内容中,则需要使其成为嵌套的私有类。例如:
Public Class MyClass
Public Function GetTheIdOfSomething() As Integer
Dim d As Details = GetDetailsAboutSomething()
If d.Value Is Nothing Then
Return d.Id
Else
Throw New Exception()
End If
End Sub
Private Function GetDetailsAboutSomething() As Details
' ... return a Details object
End Function
Private Class Details
Public Property Id As Integer
Public Property Value As String
End Class
End Class