2010-02-21 2 views
1

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

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

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

Спасибо!

+0

возможно дубликат [Когда вы используете «это» ключевое слово?] (Http://stackoverflow.com/questions/23250/when-do-you-use-the-this-keyword) – nawfal

ответ

1

Я пишу 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; 
    } 
} 
11

Лично я только использовать его, когда я должен что:

  • Конструктор цепочки:

    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); 
    } 
    

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

+1

ключевое слово также используется для методов расширения. – masfenix

+0

@ Jon, меня интересуют ваши мысли по вашему второму примеру. Лично я просто назвал бы поле поддержки чем-то другим, чтобы избежать столкновения, и устранить необходимость в ключевом слове «this». (Обычно что-то вроде «_name» для полей частных членов) –

+1

@masfenix: Спасибо, добавим это. @Simon: Нет, мне это нравится. Мне не нравятся префиксы (я нахожу, что мешает моему чтению), и если я выбрал название для концепции, то, по-видимому, это лучший, о котором я могу думать. Боль в написании «этого». время от времени относительно невелико. –

0

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

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

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

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

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

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

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

2

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

A1101: Вызов {метод или свойство имя} должно начинаться с„это“. , чтобы указать, что элемент является членом класса.

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

+1

Я думаю, что это один из самых тупых правил StyleCop, второй только для того, чтобы комментировать все частные поля. –

0

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

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(); 
     } 
    }