Який розглянутий найкращий досвід щодо ключового слова "це" перед полем та методами у c #?


14

Якщо не потрібно розмежовувати змінну і поле з тим самим іменем, я ніколи не ставлю this.перед полем або будь-яким членом доступу в C #. Я вважаю, що це не відрізняється від m_префікса, який раніше був загальним у C ++, і думаю, якщо вам дійсно потрібно вказати, що це член, ваш клас занадто великий.

Однак у моєму кабінеті є ряд людей, які категорично не згодні.

Що вважається найкращим поточним досвідом this.?

EDIT: Для уточнення, я ніколи не використовую m_і використовую лише this.тоді, коли це абсолютно необхідно.


Що m_має означати?
FrustratedWithFormsDesigner

2
@Frustrated Що змінна є членом класу.
Майкл Тодд

Вибачте, я припустив, що ніхто не може подумати, що я використовую угорські позначення. Я намагався сказати, я думаю, this.це майже так само погано, як і м_.
Енді Лоурі

3
Чувак, просто встановіть і запускайте StyleCop! Це, безумовно, є дурним питанням ЗУ.
Робота

3
Погодьтеся чи не погоджуйтеся зі своєю командою беззаперечно, вам все одно потрібна послідовність у команді. Тим більше, що більша команда отримує інакше, вона стає все вольово негідною, як дикий захід, і ви знаєте, що кажуть люди про ковбойські кодери. ;-)
Кріс

Відповіді:


14

Згідно з настановами Рамкового проектування , коли йдеться про публічні або захищені поля:

НЕ використовуйте префікс для імен полів.

Наприклад, m_є префіксом.

Отже, публічне опромінення поля піддається використанню thisключового слова, як пояснено в MSDN

Щоб кваліфікувати членів, захованих подібними іменами, наприклад: Копіювати

public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}

Коли ви посилаєтесь на приватні поля, ви можете скористатись, m_якщо хочете. Але для публічних сфер рекомендую дотримуватися найкращих практик.

Особисто мені не подобаються підкреслення в моїх назвах змінних. Я також намагаюся бути послідовним. Отже, this.name = name;є хорошим правилом роботи як в публічному, так і в приватному сценаріях.


+1: Це те, про що я мав на увазі у своїй відповіді, але ваша відповідь набагато більш описова.
Джоель Етертон

1
Погоджено - я бачив декілька сценаріїв, коли у вас є властивість, член та локальна змінна, все з тим самим іменем. Властивість - Паскаль (перша буква з великої літери), залишаючи вас з двома змінними, які містять верблюд у верблюді (перша літера нижче). Єдиний спосіб розрізнити - це "це". (рекомендовано) або префікс (не рекомендується). Я використовував і те, і на практиці це ключове слово полегшує його дотримання (IMO).
Майо

1
Найсмішніша порада рамки - це те, що джерело CLR засмічено m_префіксом. Я думаю, що "_" - це хороший префікс, тому що ви ніколи не турбуєтесь про проблеми стакковерфінгу з помилок друку
Chris S

@Chris S - На моєму досвіді Microsoft робить добре, документуючи та підтримуючи "еволюційний процес коду". Вони використовували багато практик, які зараз вважаються «поганою практикою». Швидше за все, тому, що вони вчилися на своїх помилках. Це не означає, що вони повернулися і змінили існуючий код, оскільки не завжди варто докладати зусиль. Просто не забудьте дотримуватися останніх рекомендацій у новому - не застарілому коді програми.
P.Brian.Mackey

11

У нашій команді ми прийняли стандарт використання класифікатора this.або Me.об'єкта у більших класах, щоб допомогти молодшим розробникам легше розрізнити точну / безпосередню область застосування змінної, просто подивившись на неї.

Що стосується коду, це абсолютно непотрібний афект, але він нічого не блокує, оскільки в кінцевому підсумку він генерує той самий точний код MISL. Ми прийняли його лише тому, що вирішили негайну проблему, яку ми виявили у деяких юніорів. Крім того, я не вважаю за корисне включити його.


Чудовий момент про молодші кодери.
Патрік Х'юз

2
Чи не повинні ваші заняття бути меншими? Або це питання спадщини?
Тярт

@Tjaart: Заняття такі великі або такі ж маленькі, як і потрібно. Навіть у невеликому класі можна легко забути область змінної так само, як вона з’являється на екрані.
Джоель Етертон

1
Чому у ваших юніорів проблеми @JoelEtherton? Юніори Python мають протилежну проблему, коли вони забувають додати себе. для доступу до приватних змінних. Невже юніори просто не забувають і псують конвенцію?
Тярт

1
@Tjaart: Іноді. У них проблеми, тому що вони юніори, а іноді вони просто не звертають уваги або ще не мають практикуючих очей. Ми використовували цю техніку скоріше як покажчик, ніж як стандарт або конвенцію. Тут насправді вийшло з ужитку з цього посту, коли всі наші юніори звикли до навколишнього середовища. Я думаю, якщо ми наймемо нових юніорів (навряд чи скоро), то це може повернутися.
Джоель Етертон

10

StyleCop примусить використовувати this.So, якщо ви вважаєте, що це найкраща практика (що я роблю), то використання this.найкращої практики.

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

Моє міркування полягає в тому, що, використовуючи this.виклики, той факт, що ви посилаєтесь на властивості екземплярів, так, наприклад, це допомагає виділити той факт, що ви мутуєте їх (якщо у вас є this.x = ...), про що ви могли б хотіти знати. Він також підкреслює той факт, що будь-який час, коли ви бачите this.ваш метод, ніколи не може бути статичним. Використання такої конвенції на зразок m_також зробить це, але це ручне зусилля, якщо ви зробите m_статичний або рефактор якийсь метод, щоб передати значення поза класом, тоді ви повинні пам'ятати, щоб змінити ім'я, якщо ви використовували thisтоді компілятор змусить вас внести зміни.

Простіше сказати, використання thisпростіше, тому що якщо ви помилитесь, ваш код не збирається, якщо ви використовуєте m_це ручне зусилля, і ви не використовуєте інструменти.


9
І Resharper запропонує зняти "це". Ваш пробіг може відрізнятися.
Carra

Так? Решарпер ніколи мені цього не пропонував. Може, це тому, що у мене плагін StyleCop?
Джессі К. Слікер

1
Правильно, встановивши StyleCop, вимкніть цю опцію в R #.
Стів

5

Одна з приємних речей щодо використання m_- це те, що як тільки ви вводите маленьку mінтелігенцію, ви отримуєте список усіх ваших приватних змінних, особисто я вважаю, що це плюс у її користі; Я б також пішов s_на приватну статику і c_на приватні константи з подібних причин. Це угорська позначення, але в сенсі це малося на увазі, оскільки він додає корисного значення імені змінної, щоб будь-який інший програміст міг розповісти про нього речі від свого імені, що може бути не зовсім очевидним.

Я, звичайно, не погоджуюся з тим, щоб не було ніякого способу розмежування змінних членів і не членів, тому що вони різні, і коли я читаю код, коли люди не роблять щось для того, щоб знецінити, це читати справді важче. Використовувати this.просто відчуває себе більше пластини котла, ніж потрібно. Але насправді це особистий смак, якщо ви кодуєте один спосіб на деякий час, ви в кінцевому підсумку думаєте, що це правильно, а все інше не так. Єдине, що дійсно має значення, якщо схема є розумною, - це те, щоб усі в колективі були послідовними.


4
Або введіть this.і нехай інтелісенс допоможе вам.
Стів

1
@Steve Haigh: вам не вистачає суті, він говорить, що він отримує групування всіх різних типів членів разом, оскільки список сортується за алфавітом, всі m_ з'являються разом, всі s_ разом тощо
gbjbaanb

2
використання this.дасть вам усе в класі, не потрібно вдаватися до застарілих угод про іменування. Я розумію сенс різних букв, я просто не думаю, що вони потрібні. Якщо у вас є стільки властивостей, констант тощо в одному класі, що вам потрібна ця умова, тоді ви проектуєте, в значній мірі порушені.
Стів

2
@Steve Haigh: Це чудово в теоретичному світі, коли всі в команді - чудовий програміст, і всі вони розділили свої класи на невеликі кусані шматки та рефактор, і встигли подумати про дизайн тощо. На моєму досвіді життя не має досить чихет так. Але я згоден у ідеальному світі, ти, мабуть, маєш рацію.

@Steve: Введення тексту m_дасть мені список всіх змінних членів. Введення тексту this.надасть мені список змінних членів та функцій членів.
Шон

4

thisє явним. Це оптичний знак, який ви не можете пропустити.

Я майже завжди віддаю перевагу явному коду над неявним кодом. Ось чому я thisчасто використовую . Я вважаю це найкращою практикою.


4

Я завжди використовую "це". Аргументація базується на двох простих фактах:

  • Читати код складніше, ніж писати код.
  • Ви читаєте код частіше, ніж пишете код.

Використання "цього" робить це абсолютно явним для всіх, хто читає (тобто не лише автора, але може включати автора через 6 місяців після того, як специфіка реалізації була повністю забута), що так, це член класу, який ми ' Ви знову тут говорили. "m_" і тому подібне - це лише умова, і як і будь-яка інша конвенція, її можна зловживати (або взагалі не використовувати) - не можна нічого застосовувати "m _" / тощо ні під час компіляції, ні під час виконання. "це" сильніше: ви можете поставити "m_" на локальну змінну, і компілятор не буде скаржитися; ви не можете зробити це з "цим".

Якщо що-небудь, я вважаю жалючим, що використання "цього" не стало обов'язковим у мовних специфікаціях.

Як приємний бонус, під час налагодження ви можете навести курсор на курсор (або додати годинник) на «це» та отримати перевірку і для всіх інших членів класу - цінна інформація.


3

thisКлючове слово використовується , в зокрема , щоб виділити 2 змінні , які існують, особливо при виконанні у вас є конструктор або метод зі змінною з тим же ім'ям , але можуть мати однаковий тип.

Приклад:

public class Example {

    string reason;
    string cause;

    Example (string reason, string cause) {
        this.reason = reason;
        this.cause = cause;
    }

    //<Setter> if you want to explicitly write your onw
    public void setReason(stirng reason) {
        this.reason = reason;
    }
}

Це (наприклад this.reason = reason) в основному присвоює значення параметрів змінним класу. thisв основному приймає клас reasonз блоку параметрів.


2

Я також про це цікавився деякий час. Зробивши обширне кодування в JavaScript, я запізнювався this.частіше, використовуючи свій c # код (до цього я майже ексклюзивно використовував його у конструкторах або подібних методах, щоб уникнути двозначності). Це робить код трохи зрозумілішим для невеликих додаткових зусиль, крім того, ви не закінчуєте пошкоджувати імена членів класу префіксами і все ще можете повернутися до використання членів «коротким шляхом», коли контекст зрозумілий або в особливо складних операторах. Я просто додаю this., коли у мене є довший метод, довший список аргументів або багато локальних змінних, декларується, і я думаю, що код може отримати прибуток від додаткової ясності, навіть якщо це вимушено.

Але я особисто абсолютно ненавиджу m_стиль префікса, не стільки через угорський, скільки через підкреслення - це біль;) Тому я не вважаю це альтернативою. Зізнаюся, у нього є сильні моменти, коли йдеться про інтелігенцію, однак ви знову можете стверджувати, що якщо ви не можете згадати перші кілька літер змінної члена, ваш клас - великий.


1

Я довіряю єдиний префікс підкреслення для членів класу. _someVar;

Чому? На перший погляд ви знаєте, що це член, а не змінна стека. Просто зручність під час швидкого огляду. І це займає менше скупчення в порівнянні з ключовим словом "це".


1

Використання речей, таких як this.префікс / ключове слово, які не є необхідними і не змінюють результат, завжди є суб'єктивним. Однак, я думаю, ми можемо погодитися, що більшість із нас хоче диференціювати поля від локальних змінних. Одні використовують префікс підкреслення (який я вважаю некрасивим і своєрідним угорським позначенням), інші використовують this.ключове слово. Я одна з останніх. Вся справа лише в читанні та зрозумілості. Я не заперечую, щоб набрати трохи більше, якщо це чіткіше чи легше для читання. Я хочу розрізнити поля та змінні у мить ока.

Я завжди визначаю поля, названі подібними до myFieldімен параметрів, а також імена локальних змінних, подібні до myField. Ні підкреслення, ні префіксів. Я використовую thisвсюди, де я посилаюся на поле. Таким чином я можу відрізнити поля від локальних змінних та аргументів без будь-якого префікса. Звичайно, у такому випадку thisпотрібне ключове слово:

public Person(string firstName)
{
    this.firstName = firstName;
}

Тому мої властивості виглядають приблизно так (так, я завжди ставлю поле з властивістю, а не десь не пов'язаним у верхній частині мого файлу):

private string firstName;
public string FirstName
{
    get { return this.firstName; }
}

Це гарно написано: поверніть це ім’я .


-2

EDIT: Моя відповідь явно не відповідь. Отже, ось редагування. У керівництві Microsoft щодо кодування зазначено:

2.6 Іменування

Не використовуйте префікс для змінних членів ( , m , s_ тощо). Якщо ви хочете розрізнити> між локальними та членами змінних, слід використовувати "це". в C # і "Я". у VB.NET.

Можна ознайомитись за посиланням: http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx

Тож здавалося б, що принаймні у MS немає чітких рекомендацій, хоча інша відповідь говорить про те, що StyleCop робить це керівним принципом. Немає повноважень щодо цих речей, тому я б запропонував вам подумати, або в цьому випадку поступитися своїй команді. Це не така вже й велика справа.

Мою оригінальну відповідь я особисто погоджуюсь з вами, але, можливо, тест на розуміння читання, що описує два методи один проти одного, був би цінним. Інакше ці стильові речі просто каламутні.

Моє зауваження: Моя думка полягає в тому, що люди надмірно ускладнюють свій стиль коду, і якщо їм потрібно вказати, що щось є змінною рівня класу, у коді можуть виникнути інші серйозні структурні проблеми, наприклад, віковий рецепт-метод розміщення приватних змінних у верхній частині класу, що змушує вас постійно прокручувати вгору та вниз.

це вважає мене однією з тих конвенцій "що це таке" проти правильних "іменувань" конвенцій. Стислість повинна надавати перевагу вище, ніж бути явною. Це урок, який часто повторюється динамічними мовами. Нам не потрібен весь пух!


1
-1. Замість того, щоб відповісти на питання, ви просто даєте свою думку, яка не відображає кращих практик.
Арсеній Муренко

Отже, відповідно до використання stylecop цього. найкраща практика @MainMa. Я абсолютно не згоден. Я відредагую відповідь, щоб відзначити це.
Тярт

@MainMa це краще зараз? Багато інших відповідей дають лише думку, але їх не оскаржують. Які найкращі практики та де їх можна знайти?
Тярт

-3

це. часто може призвести до небажаного шуму.

Ось моє рішення:

  • ім’я параметра_
  • local_variables
  • ANY_CONSTANT
  • _private_members
  • NonPrivateProperties
  • _NonPrivateProperty // Backer
  • приватна власність
  • _privateProperty // backer

2
Це дуже суперечить звичному стилю .Net. кожух верблюда і паскаль на всьому протязі. Ваш метод досить неузгоджений. Це також досить давнє правило стилю щодо капіталізації констант, і його, яке не використовується в загальній спільноті .Net.
Тярт

Я сподіваюся, що ви помістите коментар у верхній частині кожного файлу, в якому пояснюєте цю схему для непосвячених ... ;-)
JaySeeAre

Я не розумію, як ти думаєш додавати це. створить шум, але все це не буде
Травіс Вестон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.