Явне визначення змінних типів даних та використання ключового слова 'var'? [зачинено]


35

Чи рекомендується мені в C # використовувати ключове слово var для будь-якого оголошення змінної? Якщо так, то чи повинен я згадувати такі спеціальні символи для буквальних значень у змінному оголошенні, як М для десяткової у наступному виписці:

var myDecimal = 14.5M;

Якщо це має значення, я намагаюся зробити деякі веб-розробки за допомогою C #.


7
Має дюжину мансарів на SO (де він належить ІМХО).

1
Ці самі питання стосуються C ++ з перестановкою C ++ 0x auto.
Девід Торнлі

5
Ерік Ліпперт із команди-компілятора C # нещодавно про це повідав
Тім Гудман

У цьому питанні є шість мільярдів оборонців.
DeadMG

@DeadMG, це складає шість мільярдів і один.
wassimans

Відповіді:


53

Було багато суперечок щодо вживання вар. Мої загальні правила такі.

  • Коли тип очевидний, наприклад, коли права частина завдання є конструктором, використовуйте var.
  • Коли тип є складним для запису, наприклад запит LINQ (причина в першу чергу для var), використовуйте var.
  • Для амбівалентних типів (ваш десятковий приклад), де ви хочете переконатися, що ваша змінна правильно введена, пропишіть її.
  • Анонімні типи повинні використовувати var.
  • У всіх інших випадках пропишіть тип.

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


9
Я також використовую "var" у foreachвисловлюваннях, де я дбаю лише про перерахування колекції, а не обов'язково про тип кожного елемента.
Адам Лір

1
І як Джессі зазначав анонімні типи;)
Майкл Браун

4
@AnnaLear іноді вам доведеться піклуватися. foreach (var рядок у datatable.Rows) у цьому випадку var - це об'єкт, не DataRow, як можна було б очікувати.
Танос Папатанасіу

@ThanosPapathanasiou Звичайно, так. Те саме стосується колекції Controls у Windows Forms та, мабуть, і в інших ситуаціях.
Адам Лір

Зазвичай я використовую var, за винятком випадків, коли я хочу бути впевненим у типі моєї змінної (наприклад, коли я хочу бути впевненим, що значення подвійне, наприклад)
eka808

14

Коли використовувати var- це програмування "свята війна". Існує саме одне місце, де це потрібно: коли результат операції створює анонімний тип, наприклад:

var result = new { Name = "John", Age = 35 };

У будь-якому іншому випадку це необов’язково, і це дійсно до вашого стандарту кодування, використовувати його чи ні в інших ситуаціях.

І так, вам знадобляться спеціальні символи для літералів, щоб повідомити компілятору, що це праворуч. У вашому прикладі без значень Mза замовчуванням doubleшвидше, ніж decimal.


1
забув усе про анонімні типи!
Майкл Браун

На моїй останній роботі мені сказали, що мене звільнять, якщо я продовжую використовувати ключове слово "var" ...
hanzolo

Це надзвичайно, але ініціатива вашої компанії. Рада, що це твоя "остання" робота, хоча! :)
Jesse C. Slicer

7

Від MSDN :

Однак використання var має принаймні потенціал, щоб зробити ваш код складнішим для розуміння для інших розробників. З цієї причини документація C # зазвичай використовує var лише тоді, коли це потрібно.

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

var myFloat=100f;

до

var myFloat=100;

або

var myFloat=100.0;

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

Неявне введення тексту також працює не скрізь (з того ж MSDN-посилання)

var може використовуватися лише тоді, коли локальна змінна оголошена та ініціалізована в тому самому операторі; змінна не може бути ініціалізована до нуля, або до групи методів або анонімної функції.

var не може бути використаний у полях із класом.

Змінні, оголошені за допомогою var, не можуть бути використані у виразі ініціалізації. Іншими словами, цей вираз є законним: int i = (i = 20); але цей вираз створює помилку часу компіляції: var i = (i = 20);

Кілька неявно введених змінних не можна ініціалізувати в одному операторі.

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

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

Оновлення 2017 року

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


Цікаво, що змінило вашу думку, @ 3Dave. Я все ще на 100% погоджуюся з вашим початковим моментом: "вар лінивий і не дає реальної користі, і вводить ще один потенційний момент невдачі у вже складному процесі".
День

@Dan Це дійсно прийшло до читабельності. Грамотний розробник може досить швидко визначити, що на стороні ініціалізації декларації без проблем. Так само, як не використовувати this.скрізь, або говорити System.Blah.SomeTypeзамість того using, що мені все ще здається неймовірно дратівливим, більш лаконічний код - принаймні для мене - зазвичай простіше візуально проаналізувати. Є ще багато сценаріїв, коли явний введення тексту є правильним вибором. Але в ці дні я менше мовний юрист, ніж хтось, хто просто намагається дістати чистий код у двері.
3Dave

@Dan (Зрозуміло, я також хлопець, який використовує using namespace std;файли .cpp. (Не заголовки, як я вважаю за краще, щоб я не
потрапив у тархети

3

Посилання на C # показує наступне, щоб проілюструвати хороше проти поганого використання цієї конструкції:

Наступний приклад показує два вирази запиту. У першому виразі використання var дозволено, але не потрібно, оскільки тип результату запиту може бути явно вказаний як IEnumerable. Однак у другому виразі var слід використовувати, оскільки результат - це набір анонімних типів, а ім'я цього типу недоступне, крім самого компілятора. Зауважте, що у Прикладі №2 елемент змінної ітерації випередження також повинен бути неявно введений.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

Ключове слово var запитує лише компілятор автоматично виводити тип змінної типу var. Отже, якщо ви хочете зберегти змінну типу десяткової у змінній var, вам потрібно використовувати m. Так само, якщо ви зберігаєте рядок, вам потрібно укласти її в лапки.


0

Для мене я не використовую var для таких випадків:

  • Коли я хочу бути впевненим у типі моєї змінної (наприклад, щоб бути впевненим, що тип, що використовується, є подвійним, а не десятковим, і це велика справа, довірте мені!)
  • Поліморфний код, як Fruit foo = new Apple();. У цьому випадку, я думаю, що var - уникати та використовувати батьківський клас (тут Fruit) - краще, дозволяючи краще розуміти логіку коду та обмеження ймовірних помилок (З var, не перевіряйте поліморфну ​​концепцію!)

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

Вам доведеться скласти свою особисту думку :)

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