11

C# 拡張メソッドの最初のパラメーターは、拡張メソッドが呼び出されたインスタンスです。私は、その変数を「自己」と呼ぶ慣用句を採用しましたが、他では見ませんでした。他の人がそれを使っていても、私はまったく驚かないでしょう. 次に例を示します。

public static void Print(this string self)
{
   if(self != null) Console.WriteLine(self);
}

ただし、次のように、他の人がそのパラメーターに「@this」という名前を付けているのを見始めています。

public static void Print(this string @this)
{
   if(@this != null) Console.WriteLine(@this);
}

そして 3 番目のオプションとして、"self" と "@this" は何の情報も与えないと言って、イディオムをまったく好まない人もいます。「self」または「@this」よりも優れた、その目的に固有の明確で意味のあるパラメーターの名前がある場合があることに、私たちは皆同意していると思います。さらに進んで、もっと価値のある名前をいつでも思いつくことができると言う人もいます。したがって、これは別の有効な観点です。

他にどんなイディオムを見たことがありますか? 好きなイディオムとその理由は何ですか?

4

6 に答える 6

16

用途に基づいて、かなり普通に名前を付けます。したがって、LINQ 演算子のソース シーケンスの場合は「source」、パラメーター/引数のチェックなどを行う拡張機能の場合は「argument」/「parameter」などです。

「this」または「self」に特に関連する必要はないと思います-それは、パラメーターの意味に関する追加情報を提供しません。確かにそれが一番大事です。

編集:明らかな意味があまりない場合でも、意味がないより意味がある方がいいと思います。「self」または「@this」によって付与される情報は何ですか? それが拡張メソッドの最初のパラメーターであることだけです。その情報は、パラメーターが で装飾されているという事実によってすでに明らかです。/オプションが指定されている例では、代わりに使用します。これは、パラメーター IMO について知っておく必要があるすべてを伝えます。thistheStringToPrintselfoutputText

于 2009-04-04T06:26:53.087 に答える
4

単純な古い静的メソッドである場合に変数に名前を付けるのと同じように、変数に名前を付けます。その理由は、静的メソッドとして呼び出すことができ、コードでそのユースケースを考慮する必要があるためです。

これを確認する最も簡単な方法は、引数の検証です。null がメソッドに渡される場合を考えてみましょう。引数のチェックを行い、ArgumentNullException をスローする必要があります。適切に実装されている場合は、引数名として「this」を入力する必要があります。

public static void Print(this string @this) {
  if ( null == @this ) {
    throw new ArgumentNullException("this");
  }
  ...
}

現在、誰かがあなたのライブラリに対してコーディングを行っていて、突然「これは null です」という例外ダイアログが表示されます。彼らは最も混乱するでしょう:)

これは少し不自然な例ですが、一般に、私は拡張メソッドを普通の古い静的メソッドと同じように扱います。私はそれが彼らを推論しやすくすると思います。

于 2009-04-04T13:48:07.627 に答える
3

obj と val が使用されているのを見てきました。私はこれが好きではない。キーワードの使用は避けるべきです。私は自分自身を見たことがないが、私はそれが好きです。

于 2009-04-04T06:15:30.150 に答える
2

@thisは、これまでに見られた中で最も役に立たない言語固有の機能を利用するため、避けるべきだと思います(@)。実際、キーワードではない場所にキーワードが表示されるなど、混乱を引き起こしたり、読みやすさを低下させたりする可能性のあるものはすべて避ける必要があります。自己はPythonを思い出させますが、使用中のインスタンスを参照していることは明らかであり、厄介な構文上のトリックを必要としないため、一貫した命名規則に適している可能性があります。

于 2009-04-04T13:25:37.540 に答える
2

拡張メソッドがそのパラメーターで動作するため、これを「ターゲット」と呼びます。

于 2009-04-04T07:13:57.387 に答える
1

あなたはこのようなことをすることができます...

public static void Print(this string extended)
{
   if(extended != null) Console.WriteLine(extended);
}
于 2009-04-04T06:22:10.960 に答える