如果我在模块中有一个函数,它返回一个自定义结构,我可以在模块外部使该结构无法访问吗?

时间:2014-02-13 22:04:27

标签: vb.net

我对此范围有疑问。

说我有以下模块:

Public Module SampleModule

    Public Function SampleFunction() As SampleStructure
        Return New SampleStructure(123, 456)
    End Function

    Structure SampleStructure 'Do not want this accessible elsewhere in project
        Public A As Integer
        Public B As Integer
        Sub New(ByVal A As Integer, ByVal B As Integer)
            Me.A = A
            Me.B = B
        End Sub
    End Structure

End Module

函数SampleFuncton()是整个项目中唯一需要创建SampleStructure新实例的代码。我希望函数可以在我的项目中的任何地方访问,但我不希望任何地方都可以访问该结构,我不希望它在其他任何地方出现在Intellisense中。

这甚至可能吗?

3 个答案:

答案 0 :(得分:3)

如果您真正想做的只是阻止其他程序集创建SampleStructure的实例,那么您正在寻找访问修饰符Friend

SampleStructure的构造函数更改为以下

Friend Sub New(ByVal A As Integer, ByVal B As Integer)
    Me.A = A
    Me.B = B
End Sub

如果你真的想让结构只能在你的装配体中访问,但仍然可以访问外部世界,那么你就不幸了。

答案 1 :(得分:1)

不,那是不可能的。您正在返回结构的实例,因此程序的其他部分需要具有可见性。他们如何能够与它进行交互,或者知道函数返回什么类型?

如果您没有返回实例,则可以将其设为私有。

答案 2 :(得分:0)

我想分享另一种方法。以下所有代码都应放在您的模块中。

1)创建一个interface,公开您想要访问的所有属性,方法,功能等。

Public Interface Sample
    ReadOnly Property A() As Integer
    ReadOnly Property B() As Integer
End Interface

2)创建私有结构并实现Sample接口。

Private Structure InternalSample
    Implements Sample
    Friend Sub New(ByVal A As Integer, ByVal B As Integer)
        Me.m_a = A
        Me.m_b = B
    End Sub
    Public ReadOnly Property A() As Integer Implements Sample.A
        Get
            Return Me.m_a
        End Get
    End Property
    Public ReadOnly Property B() As Integer Implements Sample.B
        Get
            Return Me.m_a
        End Get
    End Property
    Friend m_a As Integer
    Friend m_b As Integer
End Structure

3)GetSample函数中,创建InternalSample的新实例,设置所需的值并返回对象。

Public Function GetSample() As Sample
    Dim struct As New InternalSample(123, 456)
    'You can still change the values before returning the object:
    struct.m_a = 321
    struct.m_b = 654
    Return struct
End Function