15

再度質問して申し訳ありません。このキーワードについては既にいくつかの質問があります。しかし、それらはすべて「これ」の目的を示しています。

このキーワードをいつ使用しますか
C# このキーワードをいつ使用するか C#
の静的メソッドの仮パラメータでの「this」キーワードの使用 「this」
の適切な使用。C#のキーワード?

私の質問は、いつ「this」キーワードを使用しないかです。
または
、コードのような状況でこのキーワードを常に使用しても問題ありませんか

class RssReader
{
    private XmlTextReader _rssReader;
    private XmlDocument _rssDoc;
    private XmlNodeList _xn;

    protected XmlNodeList Item { get { return _xn; } }
    public int Count { get { return _count; } }

    public bool FetchFeed(String url)
    {
        this._rssReader = new XmlTextReader(url);
        this._rssDoc = new XmlDocument();
        _rssDoc.Load(_rssReader);
        _xn = _rssDoc.SelectNodes("/rss/channel/item");
        _count = _xn.Count;
        return true;
    }
}

ここでは、「_xn」および「_c​​ount」で「this」を使用していません。また、「_rssDoc.Load(_rssReader);」でも使用していません。大丈夫ですか?クラス内のクラス変数のすべての出現で「this」を使用する必要がありますか?

編集:クラスで独自の変数に「this」を使用するのは無意味ですか?

4

12 に答える 12

25

いつも使っていthisます。ローカル変数とプライベート フィールドに同じ命名規則を使用すると、使用される識別子がフィールドかローカル変数かが明確になるため、コードが読みやすくなります。

さらに、フィールドを非表示にする新しいローカル変数を追加することで、バグの発生を防ぎます。

internal sealed class Foo
{
    private Int32 bar = 42;

    private void Bar()
    {
        // Uncommenting the following line will change the
        // semantics of the method and probably introduce
        // a bug.  
        //var bar = 123;

        Console.WriteLine(bar);

        // This statement will not be affected.
        Console.WriteLine(this.bar);
    }
}

これは、フィールドとローカル変数に異なる命名規則を使用することで回避できますが、アンダースコアの接頭辞が付いた名前は本当に嫌いです。単語の最初の文字は読みやすさにとって非常に重要であり、アンダースコアは最悪の選択肢の 1 つです。

于 2010-05-15T21:40:47.410 に答える
18

this is almost always optional and does not need to be specified. If you want to be explicit that you are referring to a member, then use this. If you have a naming convention (such as naming all member fields something like _foo), then you really don't need to refer to them like this._foo.

It's a matter of personal taste (no performance penalty), but I find having the explicit this is harder to maintain and adds little value if you have a solid naming convention. Some people will only use this when calling a member method, e.g. this.Foo(_bar) instead of Foo(_bar), but again, I don't personally believe it adds much.

If you're working with existing code, follow the convention there, otherwise, pick whichever makes you the most productive and effective.

于 2010-05-15T21:30:24.420 に答える
14

私の経験則: 冗長な場合は「this」を使用しないでください。この場合、'this' は冗長なので避けます。ReSharper のようなツールは、このような場合に非常に優れています。

于 2010-05-15T21:25:36.213 に答える
9

私は常にthis.、ローカル変数ではなく、クラス メンバーを参照していることを明確にするために使用します。

于 2010-05-15T21:45:00.067 に答える
3

これを使わない理由は全くありません。冗長性でさえ、それを使用しない理由はまったくありません。インテリセンスボックスを利用すると、コードを安全に完成させ、キーボードを常に操作するのではなく、ダウンキーで適切な変数を選択することで時間を節約できます。

于 2010-05-15T21:59:06.233 に答える
3

私は一貫性を保つように努めます。これにより、(通常選択する方法とは別に) 別の方法で行ういくつかの方法に特別な意味があると人々が混乱しないようにすることができます。

フィールドに _whatever 命名規則を使用しない場合は、一貫して this.whatever を使用する必要があります。そうしないと、コンストラクターがwhateverパラメーターを取り、whateverフィールドに入れようとしたときに問題が発生するためです。

于 2010-05-15T21:25:02.123 に答える
3

それは結構です。特に、クラスには基本クラスがなく、プライベート フィールドには適切な名前が付けられているためです。ReSharper はthis、あなたの場合は冗長であると見なします。

于 2010-05-15T21:25:34.120 に答える
3

Should i use "this" with all occurrences of class variables within the class?

In your particular case, NO.

Consider however the following example:

class RssReader
{
    private String url;

    public bool FetchFeed (String url)
    {
        new XmlTextReader (url);

        // vs.

        new XmlTextReader (this.url);

        return true;
    }
}

Here you'll need to specify this to access the instance variable that has the same name as the method argument.

于 2010-05-15T21:27:49.533 に答える
2

You may, but don't need to unless it's a method that takes arguments with the same names as your class vars (to distinguish them).

于 2010-05-15T21:26:01.340 に答える
1

これが私がそれを見る方法です。クラスのメンバー (メソッド、プロパティ、フィールドなど) を呼び出すとき、DoMyThing();またはreturn Property;インスタンス スコープ内で呼び出す場合、インスタンス メンバーを呼び出す必要はありません。DoMyThingまたはProperty静的メンバーにすることもできます。

public class Abc
{
    public static void Static()
    {
    }

    public Xyz Instance;

    public void Test() //instance scope
    {
        var xyz = Instance; //calls instance member
        Static(); //calls static member
    }
}

それらの両方 (静的およびインスタンス) について、プレフィックスは何も付けていません。実際、私の選択肢は次のとおりです。

  1. 上記のように接頭辞を付けないでください

    public void Test()
    {
        var xyz = Instance;
        Static();
    }
    
  2. インスタンスメンバーのみの接頭辞

    public void Test()
    {
        var xyz = this.Instance; // prefixes 'this'
        Static(); 
    }
    
  3. 静的メンバーのみのプレフィックス

    public void Test()
    {
        var xyz = Instance; 
        Abc.Static(); //prefixes class
    }
    
  4. どちらの場合もプレフィックス

    public void Test()
    {
        var xyz = this.Instance; // prefixes 'this'
        Abc.Static(); //prefixes class
    }
    

この答えは、あるスタイルが他のスタイルより優れていると言っているわけではありません。これは単なる個人的な好みです。それぞれに、正確さと読みやすさに対する独自の主張があります。

私の見解:

を。私は 2. と 3. の一貫性のないスタイルが好きではありません。

b. 1.私にとってより読みやすいという利点があります。接頭辞を付けると、意図よりも定義が重要になります。

c. 4. 正しさがすべてです。とにかくある時点でインスタンス静的メンバーの両方にプレフィックスを付けることを余儀なくされることを特に考えると、非常に一貫性があるという利点があります。baseこれは、基本クラスメンバーのキーワードをプレフィックスとして付けない場合base、現在の派生クラスに同じ名前のメンバーを追加すると、以前の呼び出しがオーバーライドされ、ダイナミクス全体が変更されるキーワードに関して考慮することがさらに重要です。 .

個人的には、1 を使用します。必要に応じてthisorAbcを控えめに使用します。それは私にとってより読みやすく、それが引き起こすかもしれない小さな矛盾を補うのに十分な利点です.

于 2013-12-16T12:21:29.657 に答える
1

Well, as for me, 'this' looks really redundant when used with names starting with "_". This is absolutely legal in your example though.

于 2010-05-15T21:28:14.130 に答える