2009-05-22 1 views
1
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 

일부 사용자는 프로그램의 특정 부분 만 사용하기 때문에 필요한 경우 (SQL 연결, 메인 프레임 연결, 대형 양식) 필요할 때만 초기화하는 것이 좋습니다 (관리자가 하나의 메인 프레임을 사용하여 수행 할 수 있음). 그들이 원하는 것, 일반 사용자는 주로 다른 리소스를 사용합니다).Vb.net 어떻게이 변수를 나머지 클래스에서 숨길 수 있습니까?

왜 p_? p_를 사용하면 intellisense에서 해당 클래스의 로컬 속성 대신 변수를 쉽게 사용하거나 쉽게 찾을 수 있다고 생각합니다. 그런 다음 개인 속성이나 개인 변수 앞에 _를 단독으로 사용하여 속성에서 로컬로 액세스 할 필요가 없습니다.

실수로 p_dlgAdd에 직접 액세스하는 것을 방지하는 좋은 방법은 무엇입니까? 2008 년 익명 변수에 유용합니까? (나는 아직 직장에서 2008 년을 사용할 수는 없지만 우리는 곧 그렇게 할 것이라고 생각한다.)

+0

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 
. 비주얼 스튜디오 창에 붙여 넣기 만하면 되겠다고 생각하지 않았습니다. – Maslow

+0

내가 편집을 밟은 것처럼 보입니다. 죄송합니다. –

+0

여기에 익명의 변수 가능성을 말할 수있는 사람은 누구입니까? – Maslow

답변

2

EditorBrowseableAttribute을 사용하면 Intellisense에서 클래스 구성원을 숨길 수 있습니다. 마음에 오는

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

다른 옵션은 "직접 현장에 접근하지 않는다"규칙의 위반을 확인하기 위해 Gendarme 같은 정적 분석 도구를 사용하고 있습니다. Gendarme이 이미 적절한 규칙을 가지고 있는지 확신 할 수는 없지만 확장 성이 있습니다 (그러나 귀하의 경우에는 그럴 가치가 없을 수도 있음).

+0

두 개의 아주 좋은 아이디어라고 생각합니다. 그리고 그들은 결합 될 수도 있습니다 :-) –

+0

나는 두 개의 좋은 아이디어라고 생각합니다. 나는 그들을 데려가 그들과 도망 갈 것이다. – Maslow

0

솔직히, 나는 익명의 변수에 익숙하지 않다. 위에서 말한 것처럼 실제로 같은 클래스 내에서 private 변수에 액세스하는 코드를 작성하지 못하게하는 방법은 없습니다. 코드에만주의하십시오. 변수에 접두사를 붙이면 사용자가 상기시킬 수 있습니다.

0

당신은 항상 (하지만 귀하의 경우 잔인한 수 있음) 할 수있는 다음과 같다 : 이런 식으로

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는"단지에 접근 _dlgAdd되지 않습니다 파생 클래스. 그러나 이것은 기본 유형을 정의/변경할 수있는 경우에만 작동합니다.

+0

네,하지만 그의 예제를 살펴보면, 개인 클래스가 소비 클래스가 아닌 자신의 클래스에서 액세스되는 것을 막으려 고합니다. – NYSystemsAnalyst

+0

네, 그가 잘못된 내부 사용 변수를 보호하려고 시도하고 있음을 알고 있습니다. 그러나 정말로 보호하고 싶다면 관리자에게 자신의 기능을 제공하고 변수를 캡슐화하는 (아마도 추상적 인) 기본 클래스를 만들 수 있습니다. 기본적으로 클래스가 얼마나 크고 복잡한 지, 그런 변수가 여러 번 발생했는지에 따라 다릅니다. 그리고 물론 항상 가능한 것은 아닙니다. –

0

이것은 무엇입니까 정적입니다.

나는 그래서이 방법으로 내 실제 클래스에서 내 구현의 무리를 가지고 있지 않은 코드를 입력 자유 형식으로하려고했다 미안

https://msdn.microsoft.com/en-us/library/z2cty7t8.aspx

+0

기본적으로 이것이 Singleton 구현이 아닌가요? 창조적 인 디자인 패턴과 접근성 사이에 이해 된 관계가 있습니까? –

+0

나는 묻는대로 질문에 대답하고있었습니다. 'Static'은 VB6의 숙취이며 정직하기 위해 결코 사용하지 않을 것입니다. https://msdn.microsoft.com/en-us/library/z2cty7t8.aspx –

관련 문제