Vb.net如何对类的其余部分隐藏此变量?

Vb.net如何对类的其余部分隐藏此变量?,vb.net,class-design,Vb.net,Class Design,对于一些类型的对象,我更愿意只在需要时对它们进行初始化(sql连接、大型机连接、大型表单),因为有些用户只使用程序中非常特定的部分(管理员可以使用一台大型机来做他们想做的事,普通用户主要使用另一种资源) 为什么是p_? 我认为使用p_2;可以帮助我在intellisense中不使用或轻松找到变量,而不是该类中的本地属性。然后在私有属性或私有变量前面单独使用u,这些属性不需要本地访问 有什么好方法可以防止我意外地直接访问p_dlgAdd? 在2008年,这是匿名变量的一个很好的用途吗?(我还没有在

对于一些类型的对象,我更愿意只在需要时对它们进行初始化(sql连接、大型机连接、大型表单),因为有些用户只使用程序中非常特定的部分(管理员可以使用一台大型机来做他们想做的事,普通用户主要使用另一种资源)

为什么是p_? 我认为使用p_2;可以帮助我在intellisense中不使用或轻松找到变量,而不是该类中的本地属性。然后在私有属性或私有变量前面单独使用u,这些属性不需要本地访问

有什么好方法可以防止我意外地直接访问p_dlgAdd?
在2008年,这是匿名变量的一个很好的用途吗?(我还没有在工作中使用2008,但他们认为我们很快就会使用它)

老实说,我不熟悉匿名变量。话虽如此,我所知道的并没有任何机制可以阻止您编写代码来访问同一类中的私有变量。只要注意你的代码。如果您想在变量上添加某种前缀来提醒自己,这是可以接受的。

您通常可以做的事情(但在您的情况下,这可能是一种过分的做法)如下所示:

Public Class frmMain
    Private p_dlgAdd As frmAdd = Nothing
    Public ReadOnly Property _dlgAdd As frmAdd
        Get
            If p_dlgAdd Is Nothing Then
                p_dlgAdd = New frmAdd()
            End If
            Return p_dlgAdd
        End Get
    End Property

    Public Sub DoStuff()
       ''// Should not touch p_dlgAdd
    End Sub
End Class
这样,您的“p_dlgAdd”将不可访问,并且仅在派生类中。但这只有在您可以定义/更改基类型的情况下才有效。

您可以使用对Intellisense隐藏类成员

public class Base
{
    private frmAdd p_dlgAdd = null;
    protected frmAdd _dlgAdd 
    {
        get
        {
            if(p_dlgAdd == null)
                p_dlgAdd = new frmAdd();
            return p_dlgAdd;
        }
    }
}
_
私人p_dlgAdd作为frmAdd=无

想到的另一个选项是使用静态分析工具,比如检查是否违反了“不直接访问字段”规则。不确定宪兵队是否已经有了适当的规则,但它是可扩展的(但在您的情况下可能不值得这样做)。这就是静态的的目的

<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Private p_dlgAdd As frmAdd = Nothing

很抱歉,我试图将代码自由化,因此我没有从实际类中获得一堆实现。没想到只是粘贴到VisualStudio窗口然后再粘贴回来。哎呀,看起来我踩到了你的编辑。抱歉。有人能在这里评论匿名变量的可能性吗?是的,但如果你看他的例子,他试图阻止从自己的类而不是消费类访问私有变量。是的,我知道他试图保护内部使用错误的变量。但是如果他真的想保护它,他可以创建一个(可能是抽象的)基类,为管理器提供他的功能并封装变量。这基本上取决于这个类有多大、多复杂,以及他是否有几个这样的变量。当然,这并不总是可能的。我认为这是两个非常好的想法,它们也可以结合起来:-)我认为它们也是两个很好的想法。我将带着它们一起运行。这基本上不是一个单例的实现吗?创造性设计模式和可访问性之间有什么关系吗?我刚才回答了这个问题<代码>静态是VB6的遗留问题,老实说,我可能永远不会使用它。
Public Class frmMain
    Public ReadOnly Property _dlgAdd As frmAdd
        Get
            Static dlgAdd As frmAdd = Nothing
            If dlgAdd Is Nothing Then
                dlgAdd = New frmAdd()
            End If
            Return dlgAdd
        End Get
    End Property

    Public Sub DoStuff()
       ' cannot touch dlgAdd
    End Sub
End Class