C#関数パラメーターに使用する命名規則


14

Parameterで渡された名前が新しい型にキャストされる場合がありますが、渡されたオブジェクトの名前は同じままである必要があります。クラス属性の場合、この演算子を使用できますが、関数のローカル変数についてはどうでしょう。広く使用されているコーディング規約。

例、

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

またはそれどころか

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

または他の慣習


1
他の回答が何であれ、スタイルルールを分析および実施するための小さなツールがあります。archive.msdn.microsoft.com
Patrick Hughes

回答:


11

C#では、パラメーターまたはローカル変数の前にアンダースコアを付けることはあまり慣用的ではありません。読みやすく、頻繁に使用されることはありません(ただし、合法であるため、必要に応じて自由に使用できます)。

パラメーターと変数の最適な名前は、わかりやすい名前です。なぜ型を変更しているのか、キャストの理由は何かを考える必要があります。その後、2つの異なる名前を思いつくことができるはずです。たとえば、「人」を渡して「顧客」に変換した場合、変数名に人や顧客を使用できます。

2つの異なる名前を本当に考えられない場合は、名前に「as」を使用します(数日前にこのサイトに関する質問がありました)。たとえば、ローカル変数に「myParaAsDerived」を使用します。

可能な限りこれを使用しない場合、解決しようとしている問題と使用できる意味のある名前について一生懸命に考えますが、他のすべてが失敗した場合はかなり読みやすいです。


ただダブルチェックするだけです(私はC#に精通していません)。先頭のアンダースコアは、C#で「適切に」合法ですか?CおよびC ++では、先頭に(または2重に)アンダースコアが付いた識別子が予約されているため、ある意味では有効ですが、そのような独自の識別子を定義しないでください。csharp.comsci.us/etymology/identifiers.htmlは、C#が類似している可能性があることを示唆しています(下の「制限」の最後を参照)が、実際には「予約済み」とは言いません。
Steve314

主要なアンダースコアはC#では完全に合法であり、私が知っている慣例では予約されていません。
スティーブ

9

はじめに

void MyFunc(BaseClass _myPara)
{
} 

明らかに間違っています!多くのc#コーディング標準では、すべてのフィールド名に「_」プレフィックスを使用しているため、!他のプログラマーがコードを理解しやすいようにする必要があるため、多くのC#プログラマーを誤解させるような方法でコードを記述しないでください。

小さなメソッドのすべての利点を考えると、個人的には、ローカル変数とパラメーターを分離するための命名規則は必要ありません。メソッドに非常に多くのパラメーターとローカル変数があるため、命名規則がないと何が起こっているのかわからない場合、より大きな問題が発生します。(これはJavaの本であるClean Code Bookで詳しく説明されていますが、C#プログラマーとしては非常に有益であることがわかりました)


4

それらに何かをプレフィックスしたい場合はp_、パラメータに使用する必要があります:一般的には、これを行うとおそらく多くの人を困らせると思います。ただし、一貫性を保つため、同じ名前を付けたい変数に2つの異なる名前が必要なという理由だけで、1か所でそれを行うのではありません。

変数の命名に関する適切な一般規則は次のようになります。

  • 関数によってオブジェクト名が1種類しかない場合:

    var builder = new PizzaBuilder();
  • 機能と専門性により複数の名前がある場合:

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();

パラメーターのp_(または単にp)は、C ++およびCでよく使用されている古い規則です。ローカル変数にはl_を、メンバー変数には(C ++では)m_を使用する傾向があります。Pascal、Modula 2、Adaでも見たことがありますので、Cファミリだけのものではありません。しかし、それちょっと好きですか、嫌いですか。私はそれをほとんど強迫観念で使ってきました。私の言い訳は「As」の理由であるSteve Haighsでした。例えば、セッターメソッドはしばしばそうです-2 m_Whatever = p_Whatever;つの識別子に意味のある異なる名前を与えることは厄介です。しかし、これらのケースが一貫した慣習を正当化するのに十分なほど一般的であるかどうかを疑問視し始めました。
Steve314

4

C#の命名規則には以下が含まれます。

  • メソッド、パブリックプロパティ、クラス名にPascalCasingを使用する
  • インターフェイス名にIPascalCasingを使用する(最初のIに注意)
  • メソッドのパラメーターとローカル変数にcamelCasingを使用する
  • クラス全体のプライベートフィールドに_underscoredCamelCasingを使用する

そして、ハンガリー記法に近づかないでください。意味がなく、C#の規則に準拠していません。


プライベートフィールドは、静的な場合はパスカルケースに入れられます。
サラ

2

クラス名の変数を具体的に参照するための「this」キーワードがあるため、変数の命名における下線は必要ありません。専門家から変数の命名規則について詳しく知りたい場合は、クリーンコーディングのメンターであるRobert C. 。

Ottingerは、あなたのコードは、よく書かれた散文のように、できるだけ人間が読めるようにしなければならないと述べています。

public void Function(string p_Parameter1, string p_Parameter2)

...より読みやすくなります...

public void Function(string parameter1, string parameter2)

...ここでparameter1と2は、対応する変数の説明的な名前です。

ここにリンクがあります、間違いなく一見の価値があります:リンク


-3

パラメータの接尾辞:文字列s_、int i_など

また、parm名はできるだけ短く一般的な名前にする必要があると考えています。

理由は次のとおりです。

  • 関数では、パラメーターを一切変更したくありません。変更されたバージョンが必要な場合は、新しい変数を作成してそれを保持します。注意。
  • このルールの例外は、parmがrefまたはoutの場合に発生します。私はまだそれらに接尾辞を使用していますが。
  • なぜ短い一般名ですか?関数を文書化して、s_が説明的な意味で実際に何であるかを理解する必要があります。そのため、同様の関数のグループを作成するとき、または変更の開始点として別の関数に転送するために関数本体をクリップするときに、短いジェネリックを使用すると便利です。
  • 総称名の本当の利点は、ほとんどの場合、そのパラメーターの名前を思い出す必要がないことです。あなたは文字列を取得していることを知っているので、そのs_などは、それが「filename」なのか「filepath」なのか「fullpath」なのかを疑問に思う必要はありません。

すべてにトレードオフがあり、何かを使用するかどうかは、現在のスタイルにどのように適合するかによって大きく異なります。


6
-1:a)接尾辞ではなく接頭辞です。b)ハンガリー語の表記法であり、do-doの方法を使用する必要があります
ピーターK.

1
C#型は安全ではありませんか?
pyvi

1
K. @Peter -それは次のように私には見えますsし、iこれは単なる一例ですので、短い名前です。IOWこれはハンガリー語だとはまったく思わない-単に古典的な名前、string sまたはint i私は名前を考えられないがアンダースコアの接尾辞が付いた短い名前を間違って解釈していると思う。
Steve314

@ Steve314:ああ、あなたは正しいかもしれません!マークが応答するかどうか見てみましょう。
ピーターK.

s_は匿名のHGであると推測されますが、これは例によるものではありません。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.