c#のフィールドとメソッドの前にある「this」キーワードに関して、現在考えられているベストプラクティスは何ですか?


14

同じ名前の変数とフィールドを区別する必要がない限りthis.、C#でフィールドまたはメンバーアクセスの前に配置することはありません。これはm_、C ++で一般的に使用されていたプレフィックスと同じであり、メンバーであると指定する必要がある場合、クラスが大きすぎると思います。

しかし、私のオフィスには多くの人々が強く反対しています。

現在のベストプラクティスと見なされるものは何this.ですか?

編集:明確にするために、私は絶対に使用することはm_なくthis.、絶対に必要な場合にのみ使用します。


どういうm_意味ですか?
FrustratedWithFormsDesigner

2
@Frustrated変数がクラスのメンバーであること。
マイケルトッド

申し訳ありませんが、私はハンガリー語表記を使用していると誰も考えられないだろうと仮定していました。私はthis.m_とほぼ同じくらい悪いと思うと言っていました。
アンディローリー

3
おい、StyleCopをインストールして実行するだけです!これは確かにSOの質問のduでもあります。
ジョブ

3
チームに同意するかどうかは関係ありません。チームには一貫性が必要です。特に、チームが大きくなればなるほど、ワイルドウェストのようにすべてが意地悪くなり、カウボーイコーダーについて人々が言うことを知っています。;-)
クリス

回答:


14

フレームワークの設計ガイドラインに従って、パブリックフィールドまたは保護フィールドを参照する場合:

フィールド名にプレフィックスを使用しないでください

たとえばm_、プレフィックスです。

したがって、フィールドの公開は、thisMSDNで説明されているように、キーワードの使用に役立ちます。

同様の名前で非表示になっているメンバーを修飾するには、たとえば:コピー

public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}

プライベートフィールドを参照するm_場合、必要に応じて使用できます。ただし、パブリックフィールドについては、ベストプラクティスに従うことをお勧めします。

個人的には、変数名にアンダースコアが嫌いです。私も一貫性を保とうとします。だから、this.name = name;パブリック/プライベートの両方のシナリオで動作するのは良い経験則です。


+1:これは私が答えで言及したことですが、あなたの答えはもっと説明的です。
ジョエルイーサートン

1
合意-プロパティ、メンバー、ローカル変数がすべて同じ名前であるいくつかのシナリオを見てきました。このプロパティはPascal(最初の文字は大文字)で、キャメルケース(最初の文字は小文字)の2つの変数が残ります。区別する唯一の方法は「これ」です。(推奨)またはプレフィックス(非推奨)。私は両方を使用しましたが、実際には、このキーワードを使用するとフォローしやすくなります(IMO)。
メイヨー

1
フレームワークのアドバイスの面白い点は、CLRソースにm_プレフィックスが散らばっていることです。私は「_」だと思いますが、割り当てタイプミスからstackoverflowの問題を心配しませんように良いの接頭辞である
クリス・S

@Chris S-私の経験では、Microsoftは「進化的なコードプロセス」を文書化して維持することで成功しています。彼らは今では「悪い習慣」と見なされている多くの習慣を使用しています。彼らは間違いから学んだからでしょう。これは、彼らが戻って既存のコードを変更したという意味ではありません。常に努力する価値があるわけではありません。新しい-非レガシーアプリケーションコードの最新のガイドラインに従うようにしてください。
P.Brian.Mackey

11

私たちのチームでは、大規模なクラスでthis.or Me.オブジェクト修飾子を使用する標準を採用し、ジュニア開発者が変数を見ただけで変数の正確/即時スコープを簡単に区別できるようにしています。

コード面では、これはまったく不要な影響ですが、最終的にはまったく同じMISLコードを生成するため、何もブロックしません。一部のジュニアで発見された当面の問題に対処したためにのみ採用しました。それを超えて、私はそれを含めるのに役立つとは思わない。


ジュニアコーダーの素晴らしい点。
パトリックヒューズ

2
クラスを小さくすべきではありませんか?または、これはレガシーな問題ですか?
Tjaart

@Tjaart:クラスは必要な大きさと同じか小さいです。小さなクラスであっても、画面に表示される変数のスコープを忘れがちです。
ジョエルイーサートン

1
ジュニアが@JoelEthertonに問題を抱えているのはなぜですか?Pythonジュニアには、自己の追加を忘れるという逆の問題があります。プライベート変数にアクセスします。ジュニアは大会を忘れて台無しにしないでください。
Tjaart

1
@Tjaart:時々。彼らは後輩だから問題を抱えており、時には注意を払っていないか、まだ練習されていないことがあります。この手法は、標準や慣習としてよりも道標として使用しました。私たちの後輩のすべてが環境に慣れてきた今、この投稿以来、実際にはここで使用されなくなりました。私たちが新しい後輩を雇うと(おそらくいつかすぐに)戻ってくるかもしれないと思います。
ジョエルイーサートン

10

StyleCopはthis.So の使用を強制します。これをベストプラクティスと見なす場合(私はそうします)、使用this.はベストプラクティスです。

あなたが採用するスタイルはあなた次第であり、あなた自身のコーディング標準です。「ベスト」はあなたが定義するものです。ただ一貫してください。一貫性のない使い方をすると混乱を招くだけです。

私の理由は、使用するthis.とインスタンスプロパティを参照しているという事実が呼び出されるため、たとえば、(もしあればthis.x = ...)それらを変更しているという事実を強調するのに役立ちます。またthis.、メソッドを見るたびに静的になることはないという事実も強調しています。のようないくつかの規則を使用してm_もこれを行うことができますが、それを手動で行う場合はm_、静的にするか、クラスの外部から値を渡すメソッドをリファクタリングする場合、使用している場合は名前を変更することを忘れないでくださいthisその後、コンパイラーは強制的に変更を行います。

単純に使用する方thisが簡単です。間違えた場合はコードがコンパイルされず、使用するm_場合は手作業であり、ツールを活用しないためです。


9
そしてResharperは「this。」を削除することを提案します。あなたのマイレージは異なる場合があります。
カーラ

え?Resharperは私にそれを提案したことはありません。たぶん、StyleCopプラグインを持っているからでしょうか?
ジェシーC.スライサー

1
正しい、StyleCopをインストールすると、R#でそのオプションがオフになります。
スティーブ

5

使用することの良い点の1つは、m_小さなmインテリセンスを入力するとすぐにすべてのプライベート変数のリストが表示されることです。個人的には、それがプラスになると思います。同様の理由でs_、プライベート静的およびc_プライベート定数にも行きます。ハンガリー語の表記ですが、ある意味では、変数名に有用な意味を追加して、他のプログラマーがその名前からそれについて完全に明白ではないかもしれないことを伝えることができるという意味です。

メンバー変数と非メンバー変数は区別されるため、メンバー変数と非メンバー変数を区別する方法がないことに私は確かに同意しません。コードを読むとき、人々が区別するために何かをしないと、読むのが本当に難しくなります。使用するthis.ことは、必要以上にボイラープレートのように感じます。しかし、実際には、しばらくの間1つの方法でコーディングすると、それが正しいと考え、他のすべてが間違っていると思うようになると、個人的な趣味になります。スキームが正しければ、本当に重要なのは、チームの全員が一貫しているということだけです。


4
またはthis.、インテリセンスを入力して手伝ってください。
スティーブ

1
@Steveヘーグ:あなたはポイントを逃している、彼は一緒にすべてのS_など、すべて一緒に表示さM_、リストがアルファベット順にソートされるように彼は、一緒にグループにメンバーのすべての異なる種類を取得します言っている
gbjbaanb

2
を使用this.すると、古い命名規則に頼る必要なく、クラス内のすべてが提供されます。私は異なる文字の要点を理解していますが、それらが必要だとは思いません。1つのクラスに非常に多くのプロパティ、定数などがあり、この規則が必要な場合、設計はほとんど壊れています。
スティーブ

2
@Steve Haigh:それは、チームの全員が優れたプログラマーであり、クラスを小さな噛み砕かれたチャンクに分けてリファクタリングし、デザインについて考える時間がある理論的な世界では素晴らしいです...私の経験では人生はそうではありませんそのように非常にqhiteアウト。しかし、私はあなたがおそらく正しい理想的な世界で同意します。

@Steve:入力m_すると、すべてのメンバー変数のリストが表示されます。入力this.すると、メンバー変数とメンバー関数のリストが表示されます。
ショーン

4

this明示的です。これは見逃せない光のサインです。

私はほとんどの場合、暗黙のコードよりも明示的なコードを好みます。それが私がthis頻繁に使用する理由です。私はそれをベストプラクティスと考えています。


4

私はいつも「これ」を使用します。推論は、2つの単純な事実に基づいています。

  • コードを読むことは、コードを書くことよりも困難です。
  • コードを書くよりも頻繁にコードを読みます。

「これ」を使用すると、読んでいる人(つまり、作成者だけでなく、実装の詳細が完全に忘れられてから6か月後に作成者が含まれる場合)に非常に明確になります。ここで話します。「m_」などは単なる規則であり、他の規則と同様に誤用される(またはまったく使用されない)可能性があります。コンパイル時または実行時に「m_」などを強制するものはありません。「これ」はより強力です。「m_」をローカル変数に設定すれば、コンパイラは文句を言いません。「これ」ではできません。

どちらかといえば、言語仕様で「これ」の使用が義務付けられなかったことを残念に思います。

素敵なボーナスとして、デバッグ時に「this」の上にマウスを移動(またはウォッチを追加)し、他のすべてのクラスメンバーの検査も取得できます-貴重な情報です。


3

このthisキーワードは、特に同じ名前の変数を使用してコンストラクターまたはメソッドを作成するときに、存在する2つの変数を区別するために使用されますが、同じ型を持つことができます。

例:

public class Example {

    string reason;
    string cause;

    Example (string reason, string cause) {
        this.reason = reason;
        this.cause = cause;
    }

    //<Setter> if you want to explicitly write your onw
    public void setReason(stirng reason) {
        this.reason = reason;
    }
}

これは(例this.reason = reason)基本的にパラメータの値をクラスの変数に割り当てます。this基本的にreason、パラメータブロックからクラスを取得します。


2

私もしばらくの間、それについて疑問に思っていました。javascriptで大規模なコーディングを行った後this.、c#コードでより頻繁に使用することに気付きました(その前に、曖昧さを避けるためにコンストラクターまたは同様のメソッドでほぼ排他的に使用しました)。コードを少しだけ追加することでコードがより明確になります。さらに、クラスメンバー名をプレフィックスで切り詰めることなく、コンテキストが明確な場合や特に複雑なステートメントの場合は、メンバーを「短い方法で」使用することに戻ることができます。this.メソッドを追加したり、引数リストを長くしたり、多くのローカル変数を宣言したりした場合、コードを追加することで、コードが強制されたとしても、さらに明確になります。

しかし、個人的には、m_ハンガリー語のせいではなく、アンダースコアはタイプするのが苦手なので、接頭辞スタイルは絶対に嫌いです;)だから、私はそれを代替とは思わない。インテリセンスに関しては長所があることは認めますが、メンバー変数の最初の数文字を思い出せない場合、クラスは大きいと主張することができます。


1

クラスメンバーに単一の下線プレフィックスを優先します。_someVar;

どうして?最初は、スタック変数ではなく、メンバーであることを知っています。一目見ただけで便利。また、「this」キーワードに比べて混乱が少なくなります。


1

this.接頭辞/キーワードなど、必要でも結果を変更するものでもないものを使用することは、常に主観的です。しかし、私たちのほとんどはフィールドをローカル変数と区別したいということに同意できると思います。アンダースコアの接頭辞を使用するものもあります(これはいハンガリー語表記の一種です)、他のものはthis.キーワードをます。私は後者の一人です。それはすべて読みやすさと理解しやすさについてです。それがより明確であるか、より読みやすいなら、私は少し余分にタイプすることを決して気にしません。瞬く間にフィールドと変数を区別したい。

に似た名前のフィールドmyFieldと、パラメータ名およびローカル変数名も常に定義しますmyField。アンダースコアもプレフィックスもありません。thisフィールドを参照するすべての場所で使用します。このようにして、フィールドをローカル変数や引数と区別することができます。プレフィックスはありません。もちろん、このような場合にはthisキーワードが必要です:

public Person(string firstName)
{
    this.firstName = firstName;
}

したがって、私のプロパティは次のようになります(はい、ファイルの先頭にある無関係な場所ではなく、常にプロパティを持つフィールドを配置します)。

private string firstName;
public string FirstName
{
    get { return this.firstName; }
}

それはうまく読みます:この名を返します。


-2

編集:私の答えは明らかに答えではありません。ここに編集があります。Microsoftコーディングガイドラインには次のように記載されています。

2.6命名

メンバー変数にはプレフィックスを使用しないでください(、m、s_など)。>ローカル変数とメンバー変数を区別する場合は、C#で「this。」を使用し、VB.NETで「Me。」を使用する必要があります。

http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspxで見つけることができます

そのため、少なくともMSからは明確なガイドラインはないように思えますが、別の回答ではStyleCopがガイドラインになっていると述べています。これらのことには権限がありませんので、あなた自身の決心をするか、この場合はあなたのチームに屈することをお勧めします。それはそんなに大したことではありません。

私の最初の答え は個人的にあなたに同意しますが、おそらく2つの方法を相互に比較する読解テストは価値があるでしょう。それ以外の場合、これらのスタイルの物事は単なる混乱です。

私が従うべき大事なこと:私の意見では、人々はコードスタイルを不必要に複雑にしている。プライベート変数をクラスの一番上に配置して、常に上下にスクロールするようにします。

これは、「これが何であるか」という規則と、「何をする」という正しい命名規則の1つであると思います。明示的であることの上に簡潔さを優先すべきです。これは、動的言語で頻繁に繰り返されるレッスンです。すべての綿毛は必要ありません!


1
-1。質問に答える代わりに、ベストプラクティスを反映していない意見を述べているだけです。
アルセニムルゼンコ

このため、stylecopの使用によると。@MainMaがベストプラクティスです。私はまったく同意しません。回答を編集してそのことに注意します。
-Tjaart

@MainMaの方が良いですか?他の多くの答えは意見だけを与えますが、支持されません。ベストプラクティスとは何ですか。どこで見つかりますか。
Tjaart

-3

この。多くの場合、不要なノイズにつながる可能性があります。

私の解決策は次のとおりです。

  • parameter_names_
  • local_variables
  • ANY_CONSTANT
  • _private_members
  • NonPrivateProperties
  • _NonPrivateProperty //バッカー
  • 私有財産
  • _privateProperty //バッカー

2
これは、一般的な.Netスタイルとは非常に矛盾しています。ラクダとパスカルのケーシングがすべて通っています。あなたの方法は非常に矛盾しています。また、定数を大文字にするという非常に古いスタイルのルールであり、一般的な.Netコミュニティでは使用されません。
Tjaart

各ファイルの冒頭にコメントを入れて、そのスキームが未開始であることを説明することを願っています...
;

これを追加するとどう思うかわかりません。ノイズを作成しますが、そのすべてのジビリッシュはしません
トラビスウェストン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.