5

CLSに準拠していない次のコードを検討してください(大文字と小文字のみが異なります)。

protected String username;

public String Username { get { return username;} set { username = value; } }

だから私はそれを次のように変更しました:

protected String _username;

public String Username { get { return _username;} set { _username = value; } }

これもCLSに準拠していません(先頭にアンダースコアが付いています)。

clsコンプライアンスに違反しないメンバー/プロパティの一般的な命名スキームはありますか

4

4 に答える 4

5

バッキングフィールドを公開するのではなく、プロパティを仮想化して、継承者がバッキングフィールドの実装を公開せずに機能をオーバーライドできるようにします。

private String username;

public virtual String Username { get { return username;} set { username = value; } }

継承者は、クラスの実装について何も知る必要はありません。

保護されたフィールドを公開するための最良の方法を参照してください

于 2011-11-27T00:03:48.223 に答える
2

この一連のルールはVisualBasicに適用されますが、C#にも同様のルールが必要です。

Visual Basicの要素名は、次の規則に従う必要があります。

英字またはアンダースコア(_)で始まる必要があります。

英字、10進数、およびアンダースコアのみを含める必要があります。

アンダースコアで始まる場合は、少なくとも1つの英字または10進数を含める必要があります。

1023文字を超えてはなりません。

ただし、以下も適用されます。

アンダースコア(_)で始まる要素名は、Common Language Specification(CLS)の一部ではないため、CLS準拠のコードでは、そのような名前を定義するコンポーネントを使用できません。ただし、要素名の他の位置にあるアンダースコアはCLSに準拠しています。

上記はMSDNドキュメントからのものです。

これは、MSDNのCommon Language Specificationドキュメントへのリンクです。これは、CLS命名規則の最終的な決定者を参照しています。UnicodeStandard3.0のテクニカルレポート15のAnnex7です。

于 2011-11-27T00:05:23.230 に答える
1

MFCが救いの手を差し伸べます。古いm_プレフィックスを使用するだけです。

private string m_Username;
public string Username ...
于 2011-11-27T05:55:27.033 に答える
0

これで何を達成しようとしていますか?

public String Username {get; protected set};

また

private String _username;

protected void setUserName(String argUsername);
{
  if (_username != Username) // an overload of String.Compare would be better here
  {
    _username = value;
    // Do the stuff you have to do because username has changed
  }
}

public String Username {get {return _username;} protected set {setUsername(value);}}

あなたのやり方では、CLSに準拠するには、pulicバージョンとprtectredバージョンを異なる名前で呼び出す必要があります。これは混乱を招きます。

于 2011-11-27T00:28:49.907 に答える