Когда Вы используете “это” ключевое слово? [закрытый]

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

Второй по величине элемент: возьмем пример: [1,5,4,2,3] в этом случае, Второй наибольший элемент будет 4.

  1. Сортировка массива в порядке убывания, после того, как результат сортировки будет равен A = [5,4,3,2,1]
  2. Получите второй самый большой элемент из отсортированного массива с использованием индекса 1. A [1] -> который даст второй наибольший элемент 4.

private static int getMostOccuringElement (int [] A) {Map occuringMap = new HashMap ();

    //count occurences
    for (int i = 0; i < A.length; i++) { 
        if (occuringMap.get(A[i]) != null) {
            int val = occuringMap.get(A[i]) + 1;
            occuringMap.put(A[i], val);
        } else {
            occuringMap.put(A[i], 1);
        }
    }

    //find maximum occurence
    int max = Integer.MIN_VALUE; 
    int element = -1;
    for (Map.Entry<Integer, Integer> entry : occuringMap.entrySet()) {
        if (entry.getValue() > max) {
            max = entry.getValue();
            element = entry.getKey();
        }
    }
    return element;
}
248
задан 8 revs, 7 users 47% 11 October 2018 в 19:12
поделиться

31 ответ

Существует несколько использований этот ключевое слово в C#.

  1. Для квалификации участников, скрытых аналогичным именем
  2. Для имения самой объектной передачи в качестве параметра в другие методы
  3. Для имения самого объектного возврата из метода
  4. , Чтобы объявить, что индексаторы
  5. объявляют дополнительные методы
  6. передать параметры между конструкторами
  7. , Чтобы внутренне повторно присвоить тип значения (структура) значение .
  8. Для вызова дополнительного метода на текущий экземпляр
  9. Для кастинга к другому типу
  10. цепочечным конструкторам, определенным в том же классе

, можно избежать первого использования, не имея участника и локальные переменные с тем же именем в объеме, например, следующими общими соглашениями о присвоении имен и используя свойства (Pascal-регистр) вместо полей (Camel-регистр), чтобы не сталкиваться с локальными переменными (также Camel-регистр). В C# 3.0 поля могут быть преобразованы в свойства легко при помощи автореализованные свойства .

217
ответ дан 9 revs, 5 users 49% 23 November 2019 в 02:59
поделиться

Вы не должны использовать "это", если Вы абсолютно не должны.

СУЩЕСТВУЕТ штраф, связанный с ненужным многословием. Необходимо бороться за код, который является точно, пока это должно быть, и больше.

-2
ответ дан dicroce 23 November 2019 в 02:59
поделиться

1 - Общая идиома метода set Java:

 public void setFoo(int foo) {
     this.foo = foo;
 }

2 - При вызывании функции с этим объектом в качестве параметра

notifier.addListener(this);
0
ответ дан slim 23 November 2019 в 02:59
поделиться

Я использую его для вызова Intellisense точно так же, как JohnMcG, но я возвращусь и сотру "это->", когда я буду сделан. Я следую соглашению Microsoft добавления префикса членских переменных с "m _", так отъезд его, поскольку документация просто была бы избыточна.

0
ответ дан 2 revs 23 November 2019 в 02:59
поделиться

Это зависит от стандарта кодирования, под которым я работаю. Если мы используем _ для обозначения переменной экземпляра тогда, "это" становится избыточным. Если мы не используем _ тогда, я склонен использовать это для обозначения переменной экземпляра.

0
ответ дан Dan Blair 23 November 2019 в 02:59
поделиться

'это'. помогает найти участников на 'этом' классе с большим количеством участников (обычно из-за глубокой цепочки наследования).

Удар, которому CTRL+Space не помогает с этим, потому что он также включает типы; тогда как 'это'. включает участников ТОЛЬКО.

я обычно удаляю его, как только я имею то, чем я был после: но это - просто мой прорывающийся стиль.

С точки зрения стиля, если Вы - одинокий рейнджер - Вы решаете; если Вы работаете на компанию, придерживаются политики компании (посмотрите на материал в управлении исходным кодом и посмотрите то, что другие люди делают). С точки зрения использования его для квалификации участников ни один не прав или неправ. Единственной неправильной вещью является несоответствие - который является золотым правилом стиля. Оставьте придирающихся к мелочам других. Проведите свое время, обдумывая реальные проблемы кодирования - и очевидно кодирование - вместо этого.

1
ответ дан Jonathan C Dickinson 23 November 2019 в 02:59
поделиться

this на компиляторе C++

компилятор C++ будет тихо поиск для символа, если это сразу не найдет его. Иногда, большую часть времени, это хорошо:

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

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

Для меня , те времена - когда в рамках метода я хочу получить доступ к членскому методу или членской переменной. Я просто не хочу некоторый случайный символ, взятый просто, потому что я записал printf вместо print. this->printf не скомпилировал бы.

Дело в том, что, с библиотеками прежней версии C (В§), унаследованный код несколько записанных годы назад (§§), или независимо от того, что могло произойти на языке, где копия/вставка является устаревшей, но все еще активной функцией, иногда, говоря компилятору не играть остроумие, является прекрасной идеей.

Это причины, которые я использую this.

(В§) это - все еще своего рода тайна мне, но я теперь задаюсь вопросом, включаете ли факт Вы < окна h> заголовок в Вашем источнике, причина, все символы библиотек C прежней версии загрязнят Ваше глобальное пространство имен

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

1
ответ дан paercebal 23 November 2019 в 02:59
поделиться

[C++]

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

A a;
a = a;

Ваш оператор присваивания будет записан:

A& A::operator=(const A& a) {
    if (this == &a) return *this;

    // we know both sides of the = operator are different, do something...

    return *this;
}
1
ответ дан Stacker 23 November 2019 в 02:59
поделиться

Я использую его только при необходимости, за исключением симметричных операций, которые из-за полиморфизма отдельного аргумента должны быть помещены в методы одной стороны:

boolean sameValue (SomeNum other) {
   return this.importantValue == other.importantValue;
} 
1
ответ дан Pete Kirkham 23 November 2019 в 02:59
поделиться

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

1
ответ дан akmad 23 November 2019 в 02:59
поделиться

Я склонен подчеркивать поля с _, так никогда не должны действительно использовать это. Также R# имеет тенденцию осуществлять рефакторинг их далеко так или иначе...

1
ответ дан JamesSugrue 23 November 2019 в 02:59
поделиться

Я привык использовать его подробно в Visual C++ начиная с выполнения, так инициирует IntelliSense, которые я поразил'>' ключ, и я ленив. (и подверженный опечаткам)

, Но я продолжил использовать его, так как я нахожу удобным видеть, что я называю функцию членства, а не глобальную функцию.

2
ответ дан JohnMcG 23 November 2019 в 02:59
поделиться

Любое время Вам нужна ссылка на текущий объект.

Один особенно удобный сценарий - когда Ваш объект вызывает функцию и хочет передать себя в нее.

Пример:

void onChange()
{
    screen.draw(this);
}
11
ответ дан Ryan Fox 23 November 2019 в 02:59
поделиться

В ответе turc's Jakub Е его № 5 о передающих данных между конструкторами, вероятно, мог использовать немного объяснения. Это находится в перегружающихся конструкторах и является одним случаем, где использование this обязательно. В следующем примере мы можем назвать параметризованного конструктора от конструктора без параметров с параметром по умолчанию.

class MyClass {
    private int _x
    public MyClass() : this(5) {}
    public MyClass(int v) { _x = v;}
}

я нашел, что это особенно полезная функция при случае.

3
ответ дан 2 revs, 2 users 78% 23 November 2019 в 02:59
поделиться

[C++]

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

Так, когда Вы использовали бы его? Я только что взглянул вокруг некоторого случайного кода и нашел эти примеры (я не сужу, являются ли они хорошими вещи сделать или иначе):

  • Передача "себя" к функции.
  • Присвоение "себя" к указателю или чему-то как этот.
  • Кастинг, т.е./вниз кастинг (безопасный или иначе), выбрасывание constness, и т.д.
  • Компилятор осуществил разрешение неоднозначности.
4
ответ дан Nick 23 November 2019 в 02:59
поделиться

Вот, когда я использую его:

  • Закрытые методы Доступа из класса (для дифференциации)
  • Передача текущего объекта к другому методу (или как объект отправителя, в случае события)
  • При создании дополнительных методов: D

я не использую это для полей Private, потому что я снабжаю префиксом частные полевые имена переменной подчеркивание (_).

4
ответ дан Vaibhav 23 November 2019 в 02:59
поделиться

Другое несколько редкое использование для этого ключевого слова состоит в том, когда необходимо вызвать явную интерфейсную реализацию из класса с реализацией. Вот изобретенный пример:

class Example : ICloneable
{
    private void CallClone()
    {
        object clone = ((ICloneable)this).Clone();
    }

    object ICloneable.Clone()
    {
        throw new NotImplementedException();
    }
}
5
ответ дан Paul Batum 23 November 2019 в 02:59
поделиться

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

5
ответ дан TheSmurf 23 November 2019 в 02:59
поделиться

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

7
ответ дан Philippe 23 November 2019 в 02:59
поделиться

Необходимо всегда использовать его, я использую его для diferantiate частных полей и параметров (потому что наши соглашения о присвоении имен указывают, что мы не используем префиксы для имен элемента и названий параметра (и они основаны на информации, найденной в Интернете, таким образом, я полагаю что лучшая практика))

3
ответ дан juan 23 November 2019 в 02:59
поделиться

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

28
ответ дан Ian Nelson 23 November 2019 в 02:59
поделиться

Я не могу верить всем людям, которые говорят использование, это всегда - "лучшая практика" и такой.

Использование "это", когда существует неоднозначность, как в пример Corey или когда необходимо передать объект в качестве параметра, как в пример Ryan . Нет никакой причины использовать его иначе, потому что способность разрешить переменную на основе цепочки объема должна быть достаточно ясна, что квалификация переменных с ним должна быть ненужной.

РЕДАКТИРОВАНИЕ: документация C# относительно "этого" указывает на еще одно использование помимо двух, которые я упомянул для "этого" ключевого слова - для объявления индексаторов

РЕДАКТИРОВАНИЕ: @Juan: Ха, я не вижу несоответствия в своих операторах - существует 3 экземпляра, когда я использовал бы "это" ключевое слово (как зарегистрировано в документацию C#), и те - времена когда Вы на самом деле потребность это. Засовывать "это" перед переменными в конструкторе, когда нет никакого продолжения затенения, является просто тратой нажатий клавиш и пустой тратой моего времени при чтении его, это не предоставляет преимущества.

35
ответ дан 7 revs, 3 users 56% 23 November 2019 в 02:59
поделиться

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

37
ответ дан Thomas Owens 23 November 2019 в 02:59
поделиться

Лично, я пытаюсь всегда использовать это при обращении к членским переменным. Это помогает разъяснить код и сделать его более читаемым. Даже если нет никакой неоднозначности, кто-то прочитывающий мой код впервые не знает, что, но если они видят это используемый последовательно, они будут знать, смотрят ли они на членскую переменную или нет.

53
ответ дан Brandon Wood 23 November 2019 в 02:59
поделиться

Я только использую его при необходимости, т.е., когда другая переменная является затенением другой. Такой как здесь:

class Vector3
{
    float x;
    float y;
    float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

Или поскольку Ryan Fox указывает, когда необходимо передать это в качестве параметра. (Локальные переменные имеют приоритет по членским переменным)

96
ответ дан 2 revs, 2 users 97% 23 November 2019 в 02:59
поделиться

Я не означаю это звучать придирчивым, но это не имеет значения.

Серьезно.

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

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

я не беспокоился бы о нем. Я просто удостоверился бы, что код максимально эстетически приятен согласно Вашим собственным вкусам. Если Вы спрашиваете 10 программистов, как к коду формата, Вы собираетесь получить приблизительно 15 различных мнений. Лучшая вещь сфокусироваться на состоит в том, как код учтен. Вещи абстрагированы право? Я выбирал понятные имена для вещей? Есть ли много дублирования кода? Есть ли способы, которыми я могу упростить материал? Разбирание в тех вещах, я думаю, окажет самое большое позитивное влияние на Ваш проект, Ваш код, Ваше задание и Вашу жизнь. По совпадению это, вероятно, также заставит другого парня ворчать меньше всего. Если Ваш код работает, легок читать и хорошо учтен, другой парень не собирается быть тщательным исследованием, как Вы инициализируете поля. Он просто собирается использовать Ваш код, чтобы поразиться это - величие, и затем идите дальше к чему-то еще.

243
ответ дан 3 revs, 2 users 90% 23 November 2019 в 02:59
поделиться

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

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

1
ответ дан 23 November 2019 в 02:59
поделиться

Я использую его каждый раз, когда могу. Я считаю, что это делает код более читабельным, а более читаемый код - меньше ошибок и удобнее в обслуживании.

1
ответ дан 23 November 2019 в 02:59
поделиться

Есть одно использование, которое еще не было упомянуто в C ++, и это не обращение к собственному объекту или устранение неоднозначности члена из полученной переменной.

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

template <typename T>
struct base {
   void f() {}
};

template <typename T>
struct derived : public base<T>
{
   void test() {
      //f(); // [1] error
      base<T>::f(); // quite verbose if there is more than one argument, but valid
      this->f(); // f is now an argument dependent symbol
   }
}

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

На этом этапе, без фактической замены типа, компилятор почти не имеет информации о том, что base может быть (обратите внимание, что специализация базового шаблона может превратить его в совершенно другие типы, даже undefined types), поэтому он просто предполагает, что это тип. На этом этапе независимый вызов f , который кажется программисту совершенно естественным, представляет собой символ, который компилятор должен найти как член , производный или во включающих пространствах имен - что не случится в примере - и он будет жаловаться.

Решение - превратить независимое имя f в зависимое имя. Это можно сделать двумя способами, явно указав тип, в котором он реализован ( base :: f - добавление base делает символ зависит от T , и компилятор просто предполагает, что он будет существовать, и откладывает фактическую проверку для второго прохода после подстановки аргументов.

Второй способ, намного более удобный, если вы наследуете от шаблонов, которые имеют более одного аргумента или длинных имен, - это просто добавить this -> перед символом. Поскольку реализуемый вами шаблонный класс зависит от аргумента (он наследуется от base ) this -> зависит от аргумента, и мы получаем тот же результат: this-> f проверяется во втором раунде, после подстановки параметров шаблона.

0
ответ дан 23 November 2019 в 02:59
поделиться

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

Например,

class AABB
{
  // ... members
  bool intersects( AABB other )
  {
    return other.left() < this->right() &&
           this->left() < other.right() &&

           // +y increases going down
           other.top() < this->bottom() &&
           this->top() < other.bottom() ;
  }
} ;

(vs)

class AABB
{
  bool intersects( AABB other )
  {
    return other.left() < right() &&
           left() < other.right() &&

           // +y increases going down
           other.top() < bottom() &&
           top() < other.bottom() ;
  }
} ;

С первого взгляда, к какому AABB относится right () ? this добавляет немного пояснения.

3
ответ дан 23 November 2019 в 02:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: