2011-04-13 3 views
0

VB.Net에서 액세스 한정자에 대한 이해가 어려워지는 문제가 발생했습니다. 나는 수업을 친구로 선언했다. Public 속성을 선언하면 응용 프로그램이 작동합니다. 친구라고 선언하면 애플리케이션이 실패합니다.클래스와 멤버가 다른 액세스 권한을 가질 때 동작을 설명하십시오.

전에 필자는 Friend를 선언 한 클래스에서 공개 또는 친구 멤버로 선언했는지 여부에 관계없이 기능상 차이가 없다고 생각했습니다. 클래스 접근 선언은 모든 중첩 된 엔티티에 제한을 적용하여 Public으로 선언 된 중첩 된 속성이 실제로 Friend로 선언 된 것처럼 제한된다는 것을 알았습니다. 분명히, 나는 틀렸다. 액세스 수정자가 실제로 작동하는 방식을 설명하거나 관련 문서를 알려줄 수 있습니까?

상황에 대한 자세한 설명은 다음과 같습니다. StripDate, HistorianDate 및 TaskText라는 속성이있는 StripTask라는 Friend 클래스가 있습니다. Syncfusion GridDataBoundGrid의 데이터 소스로 사용되는 StripTasks 컬렉션 (_StripTasks)이 있습니다. 바인딩이 작동하는 방식에 따라 StripTask 속성의 이름을 각 그리드 열에 전달해야 각 열이 표시 할 데이터를 알 수 있습니다. 결국 _DataBoundGrid.GridBoundColumns (1) .MappingName = "StripDate"와 같은 것을 찾습니다. 매핑 된 속성이 Public으로 선언되면 작동합니다. 매핑 된 속성이 Friend로 선언되면 모눈은 올바른 행 수로 채워지지만 모든 셀은 비어 있습니다.

후속 질문으로, 속성 접미사를 문자열로 전달해야하는 Syncfusion 바인딩 메서드와 같은 것을 피하는 것이 좋습니다. 마치 내가 문제를 불러 일으키는 것처럼 느껴집니다.

답변

2

아니요, 아니요, 클래스의 액세스 수준이 멤버 및 메소드로 넘어 가지 않습니다. In VB all methods are Public if you don't specify anything. 무언가를 Friend으로 표시하면 어셈블리 외부의 코드가보고있는 것과 똑같은 사운드에 액세스 할 수 없도록하려는 것입니다.

EDIT 이해하는 것이 중요합니다 무엇

은 대부분 인스턴스화하고 입력을 가지는 클래스 수준의 거래에 대한 액세스 규칙입니다. (거의 확실히 Syncfusion가하는 일이다) 주어진 객체의 속성을보고 반사를 사용하는 다음 DLL을 상상해 :

Option Explicit On 
Option Strict On 

Public Class Class1 
    Public Sub Process(ByVal obj As Object) 
     Dim T = obj.GetType() 
     Dim Props = T.GetProperties() 
     For Each P In Props 
      Trace.WriteLine(P.Name) 
     Next 
    End Sub 
End Class 

그런 다음 위의 DLL에 대한 참조를 별도의 어셈블리의 다음 윈폼 응용 프로그램을 상상 :

Option Explicit On 
Option Strict On 

Public Class Form1 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim X As New ClassLibrary1.Class1() 
     Dim FC As New FriendClass() 
     Dim PC As New PrivateClass() 
     X.Process(FC) 
     X.Process(PC) 
    End Sub 

    Private Class PrivateClass 
     Public Property PublicProp As String 
     Friend Property FriendProp As String 
     Private Property PrivateProp As String 
    End Class 
End Class 

Friend Class FriendClass 
    Public Property PublicProp As String 
    Friend Property FriendProp As String 
    Private Property PrivateProp As String 
End Class 

당신은 완전히 유효있어하는 Friend 클래스뿐만 아니라 다른 어셈블리에 Private 클래스 모두를 전달할 수 있습니다. 그러나 다른 쪽에서 DLL은 Friend 또는 Private 속성에 액세스 할 수 없으며 Public 속성 만 액세스 할 수 있습니다. 이 명령을 실행하면 직접 실행 창에 두 줄을 볼 수있는 유일한 속성 인 PublicProp이 표시됩니다.

+0

Chris, 답장을 보내 주셔서 감사합니다. 불행하게도 나는 아직도 혼란 스럽다. 클래스 액세스 수준이 멤버에게 물방울이되지 않는다고 말하면 어셈블리 외부에서 액세스 할 수없는 Friend 클래스에 어셈블리 외부에서 액세스 할 수있는 Public 메서드가있을 수 있다고 말하고 있습니까? 실용적인 문제로서 언제 어떻게 이러한 행동이 사용됩니까? 나는 코드를 실험 해왔고 어셈블리 외부에서 Friend 클래스의 Public 멤버를 참조하는 VB.Net 구문을 찾을 수 없다. – Todd

+0

@Todd, 솔직히 나는 그것을 통해 생각해야했다. 나는 '친구'를 거의 사용하지 않기 때문에 이것을 써서 실제로 나를 도왔습니다! –

+0

크리스, 당신은 최고입니다! 이 코드 샘플은 개념을 완벽하게 설명합니다.이제 중첩 속성 및 메서드에 대한 액세스 선언이 중요한 이유를 이해합니다. 나는 반성을 이해하지 못했기 때문에 나의 원래 오해가 존재했다. 필자의 제한된 경험으로 인해 리플렉션은 예기치 않은 오류를 유발하고 Visual Studio의 코드 검사 기능을 우회하고 난독 화를 복잡하게하며 절대로 필요하지 않습니다. 그런 이유로 나는 가능한 한 반사가 피해야한다는 결론에 도달했다. 그게 합당한 결론인가요? – Todd

관련 문제