Як ви називаєте свої приватні змінні в C #? [зачинено]


25

Яка найкраща практика, найчастіше прийнята конвенція іменування приватних змінних у C #?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Таємничий інший варіант

Що ви використовуєте і чому? (Моя компанія досить нова в C #, і я хотів би вибрати найбільш "промислово прийнятий" метод, щоб спробувати потрапити в наш стандарт кодування.)


Чому б не використовувати властивості, реалізовані автоматично? msdn.microsoft.com/en-us/library/bb384054.aspx
Кайл Баллард

1
C # має стандарти на це, див. Stackoverflow.com/questions/14967/…
Tamara Wijsman

7
Не приємно публічно говорити про приватні змінні. Вибачте, просто довелося.
Марк C

Я використовую те саме, що і azheglov (m_someVariable) за винятком того, що я використовую лише метод _someVariable в локальному масштабі для методу.
лорд-фу

7
@Mark Я думаю, що це повинні бути "приватні члени", щоб це було сугестивно.
EpsilonVector

Відповіді:


44

Настанови щодо дизайну класу MSDN http://msdn.microsoft.com/en-us/library/ta31s3bc.aspx рекомендує варіант 1 - myInteger.

Я завжди використовував цей стиль. У мене є особиста неприязнь до характеру _.


1
Мені не сподобався символ _, поки resharper не додав середньої струни до інтелігенції. Тепер я можу набрати, myIntegerі це буде відповідати _myInteger. Але я не знав, що MSDS каже не використовувати _
Vaccano

4
Якщо ви використовуєте варіант 1, то як я можу визначити, чи myIntegerє змінною локальною метод чи приватний член класу?
Wizard79

4
@Lorenzo this.myInteger;)
TWith2Sugars

12
Але, але ... "це" 4 символи, а "_" - лише один! Насправді ця інструкція має багато сенсу, але в моєму кабінеті всі люблять підкреслювати і ненавидять бачити "це. Фау" з будь-якої причини. Іноді єдині важливі вказівки - це ті, які ваші робочі місця справляють на вас.
CodexArcanum

2
Аргумент про кількість символів є дискусійним. Вам не потрібно вводити thisкожен раз, лише в методах, де є локальна змінна з тим самим іменем. Однак, якщо ви вказуєте підкреслення, кожен раз потрібно писати додатковий символ. З тим, що я погоджуюсь, що дотримання вашої угоди про стиль місцевого коду завжди важливо.
Малькольм

25

Я використовую варіант №4 вище:

private int _myInteger;

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


5
Я не згоден, що це легко читати, особливо якщо вам доведеться оперувати кількома змінними.
Рестута

15

Я використовую таку схему іменування:

  • 1-й (myInteger) для локальних змінних
  • 2-й (MyInteger) для загальнодоступних об'єктів
  • 4-й (_myInteger) для приватних змінних

14

Я думаю, що варіант 4 - це дійсно найбільш читаний варіант. Це допомагає вам робити це:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

Це також робить усіх приватних членів більш помітними. У наступному прикладі, звідки чорт береться age? Без thisкласифікатора важче сказати.

private void Method()
{
    var x = 2;
    var y = age + x;
}

Це легше зрозуміти:

private void Method()
{
    var x = 2;
    var y = _age + x;
}

1
Раніше я клявся вашим першим прикладом, але, намагаючись варіант №4 деякий час, я вважаю за краще використовувати підкреслення як префікс для приватних полів.
Джеремі Вібе

2
Я кажу, використовуйте 1 для приватних змінних, використовуйте 4 для приватних змінних, що використовуються у властивостях.
Еван Плейс

2
Я маю згоду з ChaosPandoin. Для мене обидві реалізації Method () легко читати. Як тільки я бачу вікову змінну (або _age) і помічаю, що вона не задекларована в методі, я розумію, що вона повинна бути оголошена в інших місцях класу. Цей класифікатор жахливий, але принаймні обмежений методом конструктора.
Девід Кеннеді

10

По-перше, PascalCasing зазвичай зарезервований для публічних властивостей, consts, методів тощо класу. Тож я б пропустив 2 і 5.

По-друге, угорські позначення відсторонюються у світі .NET, так що (я думаю, 3) це правильно. Якщо припустити, що це відбувається з 3.

Це залишає разом з camelCasing та _camelCasing. Зазвичай я використовую _camelCasing для змінних класу, а звичайний старий camelCasing - для змінних, що відносяться до методу чи вужчим. Корпус верблюда - це прийнятий стандарт, який використовується для аргументів методу, захищених / приватних імен змінних та змінних у межах методу чи вужчих рамках.

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


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

1
@math ні, це не очевидно в intellisense. Пам’ятайте, що поля (змінні з урахуванням класу) мають (майже) той самий значок, що і змінні області методу, тому вони виглядають точно так само, якщо ви не придивитесь уважно. Підкреслення допомагає розрізнити їх візуально і з’єднує їх у групи, що допомагає, якщо ви їх не використовуєте часто (чого ви не повинні бути, оскільки держава - ворог програмування без помилок).
Зірвано

Я ніколи нічого не говорив про Intellisense. Я говорю про різницю між Color.ClassMethod () та myColor.InstanceMethod (), а саме про те, що повинно бути очевидним, що оскільки Color є класом, ClassMethod () - метод класу.
альтернатива

@math you before: I don't understand why you would use _camelCasing for class variables you after: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()Вибачте мене, коли я розгублений. Послухайте, я використовую змінні класу рідко, тому приємно нагадувати про їхні імена, натискаючи _ і змушуючи їх усіх спливати в інтеліссенсі, добре і згруповано.
Зірвано

2
@mathepic: Коли Вілл каже "змінні класу", він має на увазі (приватні) поля екземплярів. Ви, здається, інтерпретували те, що він сказав, щоб означати статичні члени; але це не те, що він сказав.
Дан Дао

4

private int integer

Якщо ви заплуталися між членами та локальними змінними в області застосування методу, вам, ймовірно, потрібно перефактурувати.


+1: я вважаю, що це справа. BTW: Я бачу його джерело, але integer, можливо, ім’я було б краще переформульовано, можливо value?
Вовк

2

Я вважаю, що найкращий спосіб зробити це (у будь-якій мережі C # /. Net) - це комбінація 2 та 6:

private int MyInteger { get; set; }

Теоретично тут немає змінної взагалі, але вона виглядає і діє як змінна приватна інстанція. Якщо нам потрібно додати до цього значення деяку логіку бізнесу (це цілком внутрішня цінність, тому ми можемо зробити все, що завгодно), то для нас це вже є власністю. Кубок гарячої пари на виграш!


2

Я роблю варіант №4, тому що так виглядає SSCLI, але, чесно кажучи, я не дуже переймаюся тим, як називати приватну змінну. Паблік - це інша історія.

До речі ви забули m_MyInteger


2

Я б нічого не називав це "моїм"!

Але я б сказав

class C
{
     int VariableName { get; set; }
}

досить часто це приємніше, ніж мати явні змінні. Якби у мене була явна приватна змінна, я б її назвавint _variableName;


1

У C ++ я, як правило, використовую _, коли я багато перемикаю редактори, що не дозволяє мені бачити, чи це приватне життя.

Що стосується C #, я схильний залишати _ геть, оскільки Visual Studio дозволяє мені бачити, чи є він приватним.

Я схильний використовувати для цього спосіб «Справа верблюда».


1

Я використовую 4 ( private int _myInteger;), оскільки:

private int myInteger;

Так я називаю свої локальні змінні.

private int MyInteger;

Так я називаю константи.

private int mMyInteger;

Це не стиль C #.

private int _MyInteger;

Це виглядає дивно.


1

з підкресленням.

Білл Вагнер пояснює, чому в « Ефективній C #» . Але я б ніколи не називав ціле число моїм Integer , краще щось на зразок _age або _length. Включення TypeName до імені екземпляра - жахлива практика. Імена повинні бути роз'яснювальними і тому, що C # є Type-Safe, типи можуть бути знайдені att весь час.


1
Так, це був приклад.
Ваккано

1

Вам потрібно навести більш конкретний приклад, але:

private int count, private int badFileCount,private static readonly int ReconnectAttemptsLimit

До речі, ви отримуєте все це БЕЗКОШТОВНО, коли встановлюєте та починаєте використовувати найновіші та найкращі MSFT Stylecop.


0

Я йду за варіантом 5: private int _MyFoo

Я не бачу реальних конкурентних переваг над _myFoo.


0

Використовуйте camelCasing для приватних змінних, таких як myInteger

Розглянемо попереднє, _чи змінна є резервною копією властивості для зменшення плутанини -
Змінна _myPropertyдля властивостіMyProperty


0

У мене ReSharper називає свої змінні, не тільки мої, але і всі інші це роблять також. Через проект існує велика послідовність.


0

Стандартний код кодування C # Juval Lowy є досить популярним. Цей стандарт рекомендує префіксування змінних приватних членів "m_" (Варіант 6). Ось що ми робимо в нашій команді.

private int m_myInteger;

Варіант 4 ( _myInteger) є прийнятним варіантом цього стандарту.

Мені не сподобалася рекомендація MSDN ( myInteger), оскільки це ускладнює повідомлення приватного члена з локальної змінної. Їх рекомендація, звичайно, вирішує цю проблему шляхом кваліфікації приватних членів this, що мені здається зайвим.

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