私は自分で少しのC#コードに取り組んでいますが、他の開発者を連れてきたり、コードをリリースしたり、コードを販売したりする場合に、最も広く受け入れられている命名規則に従っていることを確認したいと思います。現在、Microsoftが最も広く受け入れられているように設定している命名規則に従っています。彼らが言及していないことの1つは、プライベートフィールドの命名です。ほとんどの場合、保護フィールドのようなcamelCaseで名前が付けられていますが、パラメータ名はcamelCaseである必要があるため、問題が発生します。例として、次のコンストラクターを取り上げます。
public GameItem(string baseName, string prefixName, string suffixName)
{
//initialize code
}
プライベートフィールドにもcamelCaseを使用すると、クラスフィールドにアクセスするために「this」を使用しない限り、名前の競合が発生します(ほとんどの標準に反することは言うまでもなく、入力が増えることを意味します)。 1つの解決策は、パラメーターに異なる名前を付けることですが、同じデータに2つの異なる名前を付けることは論理的に意味がありません。私が知っている他の唯一の解決策は、C++コーディングでは一般的でしたが、最初にプライベートメンバーにアンダースコアを付けることです(_camelCase)。そのソリューションは、C#コーディングで一般的に受け入れられていますか?この問題に別の解決策がありますか(クラス自体でも、フィールドにアクセスするためにプロパティのみを使用する(PascalCaseを使用するなど))?
Microsoft Naming Guidelines に従ってください。 フィールドの使用に関するガイドライン は、キャメルケースであり、プレフィックスを付けないことを示します。一般的なルールには接頭辞がないことに注意してください。具体的なルールは、静的フィールドと非静的フィールドを区別するためにプレフィックスを付けないことです。
フィールド名または静的フィールド名にプレフィックスを適用しないでください。特に、静的フィールドと非静的フィールドを区別するために、フィールド名にプレフィックスを適用しないでください。たとえば、g_またはs_プレフィックスの適用は正しくありません。
および(from 一般的な命名規則 )
アンダースコア、ハイフン、またはその他の英数字以外の文字は使用しないでください。
[〜#〜] edit [〜#〜]:ドキュメントはprivateに関して特定のものではないことに注意してくださいフィールドですが、protectedフィールドはcamelCaseのみであることを示します。このことから、プライベートフィールドの規則はすべて受け入れられると推測できると思います。確かに、パブリックな静的フィールドは保護されたフィールドとは異なります(大文字です)。私の個人的な意見では、保護/プライベートのスコープは、命名規則の違いを保証するのに十分なほど異なっていません。つまり、保護フィールドのガイドラインに従う場合、パラメーターと区別するために、この点でプライベートフィールドとは異なる扱いをする必要があります。 区別を明確にするために、クラス内のクラスメンバーを参照するときにthis
を使用します。
EDIT 2
現在の仕事で使用されている規則を採用しました。これは、プライベートインスタンス変数の前にアンダースコアを付け、一般にPascalCaseを使用してプロパティとして保護されたインスタンス変数のみを公開します。それは私の個人的な好みではありませんでしたが、私が慣れてきたものであり、おそらくより良いものが出てくるまで続くでしょう。
フィールドの__camelCase
_は私が見たものから一般的です(私たちの場所で使用しているものであり、Microsoft 。NET Frameworkを優先します ) 。
この標準を使用する私の個人的な理由は、__
_よりも_this.
_と入力してプライベートフィールドを識別する方が簡単だということです
例えば:
_void Foo(String a, String b)
{
_a = a;
_b = b;
}
_
Versus
_void Foo(String a, String b)
{
this.a = a;
this.b = b;
}
_
最初の方がはるかに簡単に入力でき、_this.a
_の代わりにa
というパラメーターに誤って割り当てることを防ぎます。これは、 コード分析 により強化されています:
私の他の理由は、ローカル変数またはパラメーター名と衝突しない場合、_this.
_はオプションであるため(リシャーパーはそれらを削除するようプロンプトを表示します)、どの変数を使用しているかをより難しく認識します。すべてのプライベートフィールドの先頭に__
_がある場合、どのフィールドがローカルスコープであるかが常にわかります。
一般に、フィールドに名前を付けるために広く使用されている2つの方法があります(常にcamelCaseを使用):
アンダースコアプレフィックスを使用
void F(String someValue) {
_someValue = someValue;
}
this.
を使用してフィールドにアクセスし、名前の競合を回避する
void F(String someValue) {
this.someValue = someValue;
}
個人的には後者のほうが好きですが、私が働いている組織によって定められている慣習を使用します。
私たちの店では、Microsoftが推奨するプライベートメンバー向けのガイドラインを使用して、最初のC#プロジェクトを開始しました。
camelCaseFieldName
しかし、私たちはすぐにプライベートメンバーとパラメーターの間で混乱に陥り、
_camelCaseFieldName
それは私たちにとってはるかにうまく機能しています。
プライベートメンバーは通常、メソッド呼び出しの外で持続する状態を持ちます-先頭のアンダースコアはそのことを思い出させる傾向があります。
また、プロパティにAutoVariable構文を使用すると、プライベートバッキングフィールドの必要性を最小限に抑えることができます。
public int PascalCaseFieldName { get; set;}
(ほとんど)MSガイドラインに従うニースの簡潔な一連の標準については、 net-naming-conventions-and-programming-standards --- best-practices をチェックしてください。
短い答え:_privateField
を使用します。つまり、プライベートフィールドに先頭のアンダースコアを使用します。
長答:ここに行く...
ずっと前に、MicrosoftはcamelCase
をフィールドに使用することを提案していました。 here を参照してください。そのドキュメントが作成された日時、2008年10月22日に注意してください。かなり古い。
ただし、Microsoftの最近のコードベースは、異なる状況を描写しています。
内部フィールドとプライベートフィールドには
_camelCase
を使用し、可能な場合はreadonly
を使用します。
_privateField
のようなプライベートフィールドには先頭の下線を使用します。私の意見:私も個人的にはアンダースコアを先導することを好みます-this
を必要とせずに非常に簡単に区別できます。
StyleCop を使用して、コード全体で一貫性を強制します。 StyleCopは Microsoft内で使用 C#ソースコードのレイアウト、可読性、保守性、およびドキュメント化のためのベストプラクティスの共通セットを実施します。
ビルド時にStyleCopを実行し、スタイル違反の警告を生成することができます。
特定の質問に答えるには、プライベートフィールドをcamelCaseに入れ、接頭辞に「this」を付ける必要があります。
前述のように、 Microsoft Naming Guidelines dosenotはプライベートフィールドとローカル変数の命名をカバーしています。そして、Microsoft自体には一貫性がありません。 Visual Studioでクラスまたは使い捨てパターンを生成すると、次のようなものが作成されます。
public MyClass(int value)
{
this.value = value;
}
または
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
...
}
}
幸いなことに、Microsoftによってますます多くのコードが開かれたので、リポジトリを見てみましょう。 ASP.NET Core MVC
private readonly IControllerActivator _controllerActivator;
private readonly IControllerPropertyActivator[] _propertyActivators;
または 。NET Core
private T[] _array;
あなたは、それは実際にはMicrosoftではなく、.NET Foundationだと言うかもしれません。結構です、 Microsoftリポジトリ を見てみましょう。
private readonly MetricSeries zeroDimSeries;
しかし、これは MVCの古代Microsoft実装 です
private IActionInvoker _actionInvoker;
そのため、プライベートフィールドの命名に関する一般的な慣行や公式のガイドラインはありません。好みの1つを選択して、それに固執するだけです。
最も重要なことは、1つの標準を選択してそれに従うことです。 IDesign (右側のリンク)でiDesignのC#コーディング標準を確認してください。それは命名ガイドラインのようなものをカバーする素晴らしいドキュメントです。ローカル変数とメソッド引数の両方にキャメルケースを使用することをお勧めします。
Microsoftの命名規則に従って、プライベートフィールドの前にアンダースコアを付ける必要があります。
例えば:
private int _myValue;
幸運を!
プライベートクラス変数とメソッドパラメーターを区別するために使用する規則は次のとおりです。
private string baseName;
private string prefixName;
private string suffixName;
public GameItem(string baseName, string prefixName, string suffixName)
{
this.baseName = baseName;
this.prefixName = prefixName;
this.suffixName = suffixName;
}
ReSharperをご覧ください。それはあなたの名前が通常のガイドラインを確認しないすべての場所に下線を引くでしょう、そしてあなたはそれをカスタマイズすることができます。さらに、もちろん、他の生産性向上の負荷と負荷があります。
私はこれをします; MSDNとほぼ一致しています。
class MyClass : MyBaseClass, IMyInterface
{
public event EventHandler MyEvent;
int m_MyField = 1;
int MyProperty {
get {
return m_MyField;
}
set {
m_MyField = value;
}
}
void MyMethod(int myParameter) {
int _MyLocalVaraible = myParameter;
MyProperty = _MyLocalVaraible;
MyEvent(this, EventArgs.Empty);
}
}
詳細は次のとおりです。 http://jerrytech.blogspot.com/2009/09/simple-c-naming-convention.html
私はC#よりもVB=ではるかに多くのことをしたので、前者から後者にいくつかのプラクティス(偏見?)を引き継いでいると思います。
プロパティのプライベートフィールドにアンダースコアを付けるのが好きです-特に大文字と小文字を区別するためにC#で(その考えはthatとにかく?)そして、モジュール/クラス全体の変数の前に "mスコープを強化することもできます。
気に入らない場合は、本当にこのようなことはしません。通常、タイププレフィックスも使用します(プロパティフィールドを除く)-オブジェクトには「o」、文字列には「s」、整数などの「i」.
査読済みの論文などでこれを実際に防御することはできませんが、それは私たちにとっては有効であり、ケーシングやフィールド/パラメーターの混乱につまずかないことを意味します。
そう ...
Class MyClass
Private msClassVariable As String = ""
Private _classProperty As Integer = 0
Property Readonly ClassProperty() As Integer
Get
Return _classProperty
End Get
End Property
Sub New()
Dim bLocalVariable As Boolean = False
if _classProperty < 0 Then _classProperty = 0
msClassVariable = _classProperty.ToString()
bLocalVariable = _classProperty > 0
End Sub
End Class