Що називати Конвенцією для використання для параметрів функції C #


14

Бувають ситуації, коли ім'я, передане в Параметрі, буде Cast в новий тип, але ім'я пройденого об'єкта має залишатися подібним. У випадку з класовими атрибутами ми можемо використовувати цей оператор, а як щодо локальної змінної у функціях. Що таке кодування, що використовується широко.

наприклад,

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

або навпаки

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

або будь-яка інша конвенція


1
Незалежно від інших відповідей, які ви отримаєте нижче, є невеликий інструмент для аналізу та виконання стилістичних правил: archive.msdn.microsoft.com/sourceanalysis
Патрік Хьюз

Відповіді:


11

Префіксація параметрів або локальних змінних із підкресленням не дуже ідіоматична в C #, її не дуже легко читати і не часто використовувати (хоча це законно, тому ви можете це зробити, якщо хочете).

Найкраще ім'я параметра і змінної - описове ім'я. Вам потрібно подумати, чому ви змінюєте тип, що є причиною акторського складу. Тоді ви повинні мати можливість придумати 2 різних імені. Наприклад, якщо ви передали "особу" і перетворили її на "клієнта", то, можливо, ви можете використовувати особу та / або клієнта в іменах змінної.

Якщо ви дійсно не можете придумати 2 різних імені, то я б використав "як" у своєму імені ( на цьому сайті кілька днів тому було питання про це ). Наприклад, ви б використовували "myParaAsDerived" для локальної змінної.

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


Просто подвійна перевірка (я не такий знайомий із C #). Провідне підкреслення дійсно є "належним чином" легальним у C #? У C і C ++ ідентифікатори з провідними (або подвоєними) підкресленнями зарезервовані, тому, хоча вони є легальними в певному сенсі, не слід визначати подібні власні ідентифікатори. csharp.comsci.us/etymology/identifiers.html припускає, що C # може бути подібним (див. нижню частину останнього з "обмежень"), але насправді не говорить "зарезервовано".
Steve314

провідні підкреслення повністю легальні в C # і не зарезервовані жодними умовами, про які я знаю.
Стів

9

По-перше використання

void MyFunc(BaseClass _myPara)
{
} 

Явно помиляється! Оскільки багато стандартів кодування c # використовують префікс "_" для всіх імен полів ! Код повинен бути легким для розуміння іншим програмістом, тому код не повинен писатися таким чином, що вводить в оману багато програмістів C #.

Враховуючи всі переваги малих методів, я особисто не бачу необхідності в конвенції про іменування для відокремлення локальних змінних від параметрів. Якщо у вас методів так багато параметрів і локальних змінних, що ви не можете сказати, що відбувається без домовленості про іменування, у вас є більші проблеми. (Це добре висвітлено в Книзі чистого коду , Java-книзі, але я все-таки вважаю це великою користю як програміст C #)


4

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

Хороше загальне правило зі змінними іменами так само;

  • Якщо у вас є лише один тип об'єкта, назви його за його функцією:

    var builder = new PizzaBuilder();
  • Якщо у вас є декілька назв їх за їх функцією та спеціальністю:

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();

Параметр p_ (або просто p) - це стара умовна умова, яка багато використовується в C ++ і C. Це має тенденцію використовувати l_ для локальної та (у C ++) m_ для змінної member. Я бачив це також у Pascal, Modula 2 та Ada, тому це не лише річ C-сім'ї. Хоча це якась любов - це чи ненависть. Я використовував це майже нав’язливо, моє виправдання, що Стів Хайгс міркував для "Ас". Напр. Методи сеттера часто роблять m_Whatever = p_Whatever;- давати двом ідентифікаторам значущо різні імена було б незручно. Але я почав сумніватися, чи є ці випадки досить поширеними, щоб виправдати послідовну конвенцію.
Steve314

4

Конвенції про іменування C # матимуть:

  • Використання PascalCasing для методів, загальнодоступних властивостей та назв класів
  • Використання IPascalCasing (помітьте I на початку) для імен інтерфейсу
  • Використання camelCasing для параметрів методу та локальних змінних
  • Використання _underscoredCamelCasing для приватних полів широкого класу

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


приватні поля є паскальним, якщо вони статичні.
сара

2

Підкреслення під час іменування змінних може бути непотрібним, оскільки у нас є ключове слово "це", щоб конкретно посилатися на змінні рівня класу. Якщо ви хочете дізнатися більше про конвенції про іменування змінних від експертів, я б запропонував вам поглянути на сумнозвісний документ під назвою "Правила Оттінгера щодо змінних і класових імен" Тіма Оттінгера, статтю, яку підтримує наставник з чистого кодування Роберт С. Мартін .

Оттінгер зазначає, що ваш код повинен залишатися максимально читабельним, як добре написана проза, так що ...

public void Function(string p_Parameter1, string p_Parameter2)

... було б читабельніше, як ...

public void Function(string parameter1, string parameter2)

... де параметри1 та 2 - описові назви відповідних змінних.

Ось посилання, безумовно, варто переглянути: Посилання


-3

Я вірю в суфікс параметрів: string s_, int i_ тощо

Я також вважаю, що назви парм повинні бути максимально короткими та загальними.

Тепер з причин:

  • У функції ви не хочете жодним чином змінювати параметр, якщо вам потрібна змінена версія, створіть нову змінну, щоб її вставити. Іменування пар з суфіксом дозволить вам не призначати їх, якщо ви платите уваги.
  • Винятки з цього правила трапляються, коли парм виправляється або вимикається. Хоча я все ще використовую суфікс на цих.
  • Чому короткі родові назви? Ви повинні документувати свою функцію, щоб ви знали, що насправді s_ є в описовому сенсі. Тож з цим не виходить використання коротких дженериків зручно, коли ви створюєте групи подібних функцій або відсікаєте тіло функції для транспортування до іншої функції в якості початкової точки модифікації.
  • Справжня перевага загальних імен полягає в тому, що ви не повинні згадувати те, що ви викликали цей параметр у більшості випадків. Ви знаєте, що ви отримуєте рядок, тому її s_ і т. Д. І не потрібно замислюватися, чи це "ім'я файлу", чи це "filepath", чи це "fullpath", його єдиний рядок, тому його "s_".

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


6
-1: а) Ви маєте префікс, а не суфікс; б) це угорська нотація і повинна йти шляхом виконання справ .
Пітер К.

1
Чи не безпечний тип C #?
pyvi

1
@Peter K. - Мені це здається sі iє короткими іменами, тому що це лише приклад. IOW Я взагалі не думаю, що це угорська мова - я думаю, ви неправильно трактуєте коротке ім’я, яке є просто класичним, string sабо int iя не можу придумати краще слово, але з підкресленими суфіксами, наклеєними на .
Steve314

@ Steve314: Ах, ти можеш мати рацію! Подивимось, чи відповідає Марк.
Пітер К.

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