2009-07-28 10 views
52

は、なぜ私は、コンパイラの警告にアンダースコア付きのこの名前がCLS準拠でないのはなぜですか?

を得るのですか識別子 'Logic.DomainObjectBase._isNewは' CLSに準拠し、次のコードのための

ではないでしょうか?

public abstract class DomainObjectBase 
{ 
    protected bool _isNew; 
} 
+23

あなたはおそらくとにかくアンダースコアで非プライベートメンバーをマークするべきではありません。私は誰もが自分のスタイルを持っていることを知っていますが、他の人たちは、この分野が大会ではプライベートではないとほとんど確信しています。 –

+0

@EdS。どの慣習ですか? – Pharap

+0

一度にVBのコンベンションになっているようですが、C++、C#のスタイルが外れているようですが、ここのボックスに収まるサイズよりも詳細な情報があります:https://stackoverflow.com/questions/3136594/naming-コンベンション - アンダースコア - イン - cc変数 – MatthewMartin

答えて

77

Common Language Specificationから:

CLS準拠の言語コンパイラを起動することができますし、識別子に含まれる文字のセットを支配するUnicode標準3.0のテクニカルレポート15の附属書7の規則に従わなければなりません。この標準は、Unicode ConsortiumのWebサイトから入手できます。

look this upあなたの場合:

すなわち、識別子の最初の文字は大文字、小文字、タイトルケース手紙、修飾文字、その他の文字、または文字番号を指定できます。識別子の後続の文字には、スペーシング以外の記号、スペーシング・コンバイン・マーク、10進数、コネクタの句読点、および書式設定コード(右端の記号など)のいずれかを使用できます。通常、識別子を格納または比較する前に、書式設定コードをフィルタ処理する必要があります。

基本的に、アンダースコアで識別子を開始することはできません。これは、可視(公開/保護された)フィールドのCLSに違反します。

+0

http://msdn.microsoft.com/en-us/library/k5645wwb(v=VS.100).aspx – JohnB

+1

「文字番号」とは何ですか? – Kevin

+2

@Kevin:上のスニペットのすべての用語は、「文字、大文字」、「文字、小文字」、「文字、タイトルケース」、「文字、修飾子」、「文字、その他」、文字"。ローマ数字は「文字番号」の一例です。 http://www.fileformat.info/info/unicode/category/Nl/list.htm – Joren

28

_isNew(すなわち、プライベートではない)は、可視であると主要underscore付随。

+12

+1ただし、先頭のアンダースコアとともにCLS準拠ではない*非公開*であるという事実を含める必要があります。 –

1

これはアンダースコアです。これはarticleを参照してください。

0

データメンバの名前が_isNewであるため、先頭にアンダースコアが付いています。

2

CLS準拠の識別子はアンダースコアで始めるべきではありません。

7

アンダースコアが問題の原因です。一般的な方法は、アンダースコアはプライベートフィールド用に予約されていることです。保護された/公衆のメンバーは適切に収容され、命名されるべきである。例えば

public abstract class DomainObjectBase{ 
    private bool _isNew; 
    protected bool IsNew { get { return _isNew; } set { _isNew = value;} } 
} 

OR、あなたは3.xのを使用して、プライベートフィールドを取り除くしたい場合:

public abstract class DomainObjectBase{ 
    protected bool IsNew { get; set; } 
} 
+0

ありがとう!もし私ができるなら、これを第2のベスト・アンサーとしてマークしたいと思います。 – MatthewMartin

1

大手_は

非CLS準拠しています

Microsoft StyleCopはあなたのコードを分析し、CLSに準拠していない理由を説明する関連文書へのリンクを提供します。

+1

私はStyleCopのアイデアが気に入っていますが、そのルールはFxCopのルール、ResharperのリフォーマッタとVisual Studioリフォーマッタと競合します。 – MatthewMartin

+0

StyleCopとFxCopはどちらもマイクロソフトが制作しています(異なる製品チームではありますが)が、私は「Microsoft」コードスタイルを使用する場合はStyleCopが後であり、より好ましいと考えています。 – Frozenskys

38

CLS complianceは、異なる.NET言語間の相互運用性に関係します。アンダースコアで始まりパブリックです(注:パブリッククラスの保護されたプロパティはアセンブリの外部からアクセスできます)。このプロパティはCLSに準拠していません。これはプロパティがC#からアクセスされる場合は機能しますが、プロパティ名の先頭にアンダースコアを許可しない他の.NET言語からアクセスされる場合はアクセスできないため、CLSに準拠しません。

次のような行を持つCLS準拠したものとしてどこかにあなたのコードで、あなたのアセンブリをラベル付けしているので、あなたは、このコンパイラエラーを取得している:

[assembly: CLSCompliant(true)] 

Visual StudioがどのAssemblyInfo.csファイルに次の行を含んでいますほとんどのプロジェクトのプロパティで見つけることができます。

  1. (推奨)あなたの財産の名前を変更します:

    protected bool isNew; 
    
  2. 準拠した非CLSようにあなたの全体のアセンブリを設定します。

    [assembly: CLSCompliant(false)] 
    
  3. あなたはどちらかのことができ、このエラーを回避するには

  4. あなたのプロパティに属性を単に追加してください:

    [CLSCompliant(false)] 
    protected bool _isNew; 
    
  5. プロパティの範囲を変更して、アセンブリの外側に表示されないようにします。

    private bool _isNew; 
    
+0

したがって、保護された変数を持つパブリックプロパティがある場合は、どのような方法が最適ですか? –

+3

個人的に私はすべてのフィールドを非公開にしたい。スコープを増やす必要がある場合は、Property Get/Setでラップします。 –

+0

@MartinBrown:クラスには、更新を処理する保護されたメソッドを呼び出しているパブリックプロパティがありますが、派生型がフィールドを直接使用し、後で更新をポストする正当な必要性がある場合があります(たとえば、コントロールからの色とキャプションの両方を変更する方法がありますが、基本はできません。派生クラスが両方のフィールドを変更してから、一度更新メソッドを呼び出すと便利です)。 VB.NETとC#の両方がそれを受け入れるので、私の傾向は "特性"と "_特性"を使用することです。何をお勧めしますか? – supercat

関連する問題