2012-01-24 5 views
3

VB.NETのPublic変数とPublicプロパティの違いは何ですか? (コード分析VS2010、CA1051:Microsoft.Design)私のプロジェクトにコード分析を実行しているとき、私は、次のメッセージが表示さ

:これを解決するには

CA1051 : Microsoft.Design : Because field 'ClassName.VarName' is visible outside of its declaring type, change its accessibility to private and add a property, with the same accessibility as the field has currently, to provide access to it.

を、私は次の行を変更することができます

Public VarName As String 
これに

:私はなぜPropertyキーワードを理解していない

Public Property VarName As String 

この特定のケースでは非常に重要です。このメンバーをPropertyに変更すると、コード分析と大きな違いが生じる理由は誰にも説明できますか?私は何か間違っているのですか?

答えて

1

Public Property VarName As Stringは、カプセル化のレベルを提供するプロパティを宣言します。 _VarNameを使用すると、クラス内のこの変数のプライベートメンバー状態にアクセスできます。

Public VarName As Stringは、この変数の単一のパブリックインスタンスを提供し、カプセル化を行わない変数を宣言します。

+0

カプセル化を使用することは.NETのベストプラクティスと考えられますか? – afuzzyllama

+0

アクセスコントロールを実装したい場合(おそらくあなたのケースではないかもしれません - 将来的には?) – alundy

+0

このコードにもう一度触れなければならないことは99.9%疑わしいですが、コードの保守性のためには、カプセル化が重要です。 – afuzzyllama

2

変数を非公開にし、データにアクセスするためのパブリックプロパティを提供することは、常に優れたコーディング方法でした。

たとえば、値が変更されたときに発生するイベントを後で追加する必要がある場合、そのコードをsetプロパティに適用する方が簡単で、プロパティを使用する既存のコードはすべて変更する必要はありません変数を使用し続けてイベントを発生させる必要がある場合は、値を設定してイベントを発生させ、変数の代わりに作成した新しいプロパティを使用する既存のコードをすべて更新するプロパティを作成する必要があります。

+0

いつもVB.Net以来、とにかく。 VB6では、呼び出し元に触れることなく、パブリック変数をプロパティに置き換えることができます。 VB6では.Netよりも優れていたのは唯一のことです。 – MarkJ

+0

VB6でも、初めてプロパティを使うのは良いことです。あなたが最初にやってはいけないことをすることは、必ずしも「より良い」というわけではありません。 – Nick

+0

なぜそれは "最初にやってはいけないこと"(VB6)だと思いますか? VB.Netには+1の良い答えがありますが、VB6には当てはまりません。 VB6では "変数を使い続けてイベントを発生させる必要があると判断した場合は、値を設定してイベントを発生させ、*既存のコードに触れる必要がないプロパティを作成する必要がある場合は、プロパティ "を使用します。 – MarkJ

2

カプセル化は、OODの重要な原則です。あなたが他の人にあなたのメンバーを公開している場合(私はすでに自分自身を笑いながら知っています)、正しい状態を維持できる保証はありません。

プロパティを使用すると、メンバーのアクセス方法に関する明確なガイドラインを定義することで、メンバーの状態を保護できます。

+0

真、真。私は何かを書いているので、どんなget/setもちょうどデフォルトです。過去に私が何かをカプセル化する必要があった時、私はgetter/setterで書き直すだけでしたが、決してそれは私の公のメンバー全員には行なわれませんでした...私はベストプラクティスはあなたがすべきことだと思いますか? – afuzzyllama

+0

@afuzzyllama:ええ、それはすべてのメンバーのためにそれをすることを傷つけることはありません...特にVB.NETはおそらくC#のような自動プロパティを持っているでしょうから。 –

+2

VB.NETには2010年に自動実装されたプロパティがあります。 – Nick

関連する問題