Правильное использование «этого». ключевое слово в C #? - PullRequest
1 голос
/ 21 февраля 2010

Я работаю над книгой Head First C # (и до сих пор все идет хорошо), но у меня много проблем с тем, чтобы обернуть голову вокруг синтаксиса, связанного с использованием «this». ключевое слово.

Концептуально, я понял, что должен использовать его, чтобы избежать маскирования параметра одним и тем же именем, но у меня возникают проблемы с его отслеживанием в их примерах (кроме того, они, кажется, не имеют раздел, посвященный этому конкретному ключевому слову, они просто объясняют его и начинают использовать его в своих примерах).

Есть ли у кого-нибудь хорошие правила, которым они следуют, применяя «это»? Или какие-нибудь учебники онлайн, которые объясняют это иначе, чем Head First C #?

Спасибо!

Ответы [ 5 ]

11 голосов
/ 21 февраля 2010

Лично я использую его, только когда у меня есть:

  • Цепочка конструктора:

    public Foo(int x) : this(x, null)
    {
    }
    
    public Foo(int x, string name)
    {
        ...
    }
    
  • Копирование из имени параметрав поле (не так часто в C #, как в Java, как вы обычно используете свойство - но обычно в конструкторах)

    public void SetName(string name)
    {
        // Just "name = name" would be no-op; within this method,
        // "name" refers to the parameter, not the field
        this.name = name;
    }
    
  • Ссылка на этот объект без участия членов:

    Console.WriteLine(this);
    
  • Объявление метода расширения:

    public static TimeSpan Days(this int days)
    {
        return TimeSpan.FromDays(days);
    }
    

Некоторые другие люди всегда используют его (например,для других вызовов методов) - лично я нахожу, что это немного мешает.

2 голосов
/ 21 февраля 2010

Стиль кодирования по умолчанию StyleCop применяет следующее правило:

A1101: вызов {метода или свойства имя} должно начинаться с «это». префикс, чтобы указать, что элемент является член класса.

Это означает, что каждый метод, поле, свойство, принадлежащие текущему классу, будут иметь префикс этого. Первоначально я был устойчив к этому правилу, которое делает ваш код более многословным, но с тех пор оно выросло на мне, поскольку делает код довольно ясным. В этой теме обсуждается вопрос .

1 голос
/ 21 февраля 2010

Я пишу this. тогда и только тогда, когда это улучшает удобочитаемость, например, при реализации интерфейса Comparable (Java, но идея та же):

public void compareTo(MyClass other) {
  if (this.someField > other.someField) return 1;
  if (this.someField < other.someField) return -1;
  return 0;
}

Что касается затенения параметров (например, в конструкторах): я обычно даю им более короткое имя соответствующего поля, например:

class Rect {
  private int width, height;
  public Rect(int w, int h) {
    width = w;
    height = h;
  }
}
0 голосов
/ 09 октября 2014

Если у вас есть метод внутри класса, который использует поля того же класса, вы можете использовать это.

public class FullName
    {
        public string fn { set; get; }
        public string sn { set; get; }

        //overriding Equals method
        public override bool Equals(object obj)
        {
            if (!(obj is FullName))
                return false;

            if (obj == null)
                return false;

            return this.fn == ((FullName)obj).fn &&
            this.sn == ((FullName)obj).sn;
        }

        //overriding GetHashCode
        public override int GetHashCode()
        {
            return this.fn.GetHashCode() ^ this.sn.GetHashCode(); 
        }
    }
0 голосов
/ 21 февраля 2010

В основном, this дает вам ссылку на текущий объект. Вы можете использовать его для доступа к членам объекта или для передачи текущего объекта в качестве параметров другим методам.

Практически во всех случаях совершенно необязательно размещать его перед доступом к переменным-членам или вызовам методов, хотя некоторые рекомендации по стилю рекомендуют его по разным причинам.

Лично я проверяю, чтобы мои переменные-члены четко отличались от моих параметров, чтобы никогда не использовать «this». Например:

private String _someData;
public String SomeData
{
    get{return _someData;}
    set{_someData = value;}
}

Тем не менее, это очень индивидуальное предпочтение, и некоторые люди рекомендуют, чтобы вы называли свойство и переменную-член одинаково (только различие в регистре - 'someData' и 'SomeData') и используете ключевое слово this при доступе к закрытому члену для укажите разницу.

Так же, как правило: избегайте его использования. Если вы обнаружите, что используете его, чтобы различать локальные переменные / переменные параметров и переменные-члены, переименуйте одну из них, чтобы вам не приходилось использовать «this».

Случаи, когда я бы использовал его, - это множественные конструкторы, передающие ссылку на другие методы и методы расширения. (См. ответ Джона для примеров)

...