2011-04-13 2 views
0

VB.Netのアクセス修飾子について私が理解できない問題が発生しました。私はクラスがFriendと宣言しました。プロパティPublicを宣言すると、アプリケーションが動作します。私がFriendを宣言すると、アプリケーションは失敗します。クラスとメンバーのアクセスが異なる場合の動作を説明してください。

これまで、Friendと宣言されたクラスでは、メンバーを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

は、ほとんどのインスタンス化と入力して、クラスレベルの契約でそのアクセスルールです。そして、上記のDLLを参照して別のアセンブリで以下のWinFormsのアプリケーションを想像

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 

::(Syncfusionが何をするか、ほぼ間違いなく)指定されたオブジェクトのプロパティを確認するためにリフレクションを使用して、次の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のプロパティのみにアクセスできます。これを実行すると、イミディエイトウィンドウに2つの行が表示され、唯一のプロパティであるPublicPropが表示されます。

+0

Chris、返信いただきありがとうございます。残念ながら、私はまだ混乱しています。クラスのアクセスレベルがメンバーに流れ込まないと言うと、アセンブリの外部からアクセスできないフレンドクラスにアセンブリの外部からアクセス可能なパブリックメソッドがあると言っていますか?実際の問題として、この行動はいつ、どのように使用されますか?私はコードを試していましたが、アセンブリ外からFriendクラスのPublicメンバを参照するためのVB.Net構文は見つかりませんでした。 – Todd

+0

@Todd、正直言って私もそれを考えなければならなかった。私は非常にまれに「友達」を使っているので、これを書いて実際に私を助けました! –

+0

クリス、あなたは素晴らしいです!そのコードサンプルは概念を完全に説明しています。ネストされたプロパティとメソッドのアクセス宣言がなぜ重要であるかを理解しました。 私は反射を理解していなかったので、私の元の誤解が存在​​したことがわかりました。私の限られた経験の中で、リフレクションは予期しない失敗につながり、Visual Studioのコードチェック機能をバイパスし、難読化を複雑にし、本当に必要なことではありません。その理由から、私は可能な限り反射を避けるべきであるという結論に達しました。それは合理的な結論ですか? – Todd

関連する問題