Злой из 'var' в C#? [дубликат]

Современный способ возврата к определенному контроллеру:

[self.navigationController.viewControllers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    if ([obj isKindOfClass:[MyViewController class]]) {
        [self.navigationController popToViewController:obj animated:YES];
        *stop = YES;
    }
}];

MyViewController - это контроллер, к которому вы хотите вернуться.

9
задан 5 revs, 2 users 89% 23 May 2017 в 11:53
поделиться

11 ответов

var - прекрасная идея, помогающая реализовать ключевой принцип хорошего программирования: DRY , то есть, не повторяйся.

VeryComplicatedType x = new VeryComplicatedType();

- плохое кодирование , потому что он повторяет VeryComplicatedType , и все эффекты отрицательные: более подробный и шаблонный код, меньшая читабельность, глупая «подделка» как для читателя, так и для автора кода. Из-за всего этого я считаю var очень полезным усовершенствованием в C # 3 по сравнению с Java и предыдущими версиями C #.

Конечно, его можно слегка неправильно использовать, используя в качестве RHS выражение, тип не ясен и очевиден (например, вызов метода, объявление которого может быть далеко) - такое неправильное использование может снизить удобочитаемость (заставляя читателя искать метод ' s или глубоко задуматься о каком-нибудь другом тонком типе выражения) вместо того, чтобы увеличивать его. Но если вы будете использовать var , чтобы избегать повторений , вы окажетесь в его приятной зоне и не будете злоупотреблять.

25
ответ дан 4 December 2019 в 05:52
поделиться

I think it should be used in those situations where the type is clearly specified elsewhere in the same statement:

Dictionary<string, List<int>> myHashMap = new Dictionary<string, List<int>>();

is a pain to read. This could be replaced by the following with no loss of clarity:

var myHashMap = new Dictionary<string, List<int>>();
24
ответ дан 4 December 2019 в 05:52
поделиться

Популярная викторина!

Что это за тип:

var Foo = new string[]{"abc","123","yoda"};

Как насчет этого:

var Bar = {"abc","123","yoda"};

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

Ура.

9
ответ дан 4 December 2019 в 05:52
поделиться

Never say never. I'm pretty sure there are a bunch of questions where people have expounded their views on var, but here's mine once more.

var is a tool; use it where it's appropriate, and don't use it when it's not. You're right that the only required use of var is when addressing anonymous types, in which case you have no type name to use. Personally, I'd say any other use has to be considered in terms of readability and laziness; specifically, when avoiding use of a cumbersome type name.

var i = 5;

(Laziness)

var list = new List<Customer>();

(Convenience)

var customers = GetCustomers();

(Questionable; I'd consider it acceptable if and only if GetCustomers() returns an IEnumerable)

6
ответ дан 4 December 2019 в 05:52
поделиться

Прочтите о Haskell. Это статически типизированный язык, на котором вам редко нужно указывать тип чего-либо. Таким образом, он использует тот же подход, что и var, в качестве стандартного «идиоматического» стиля кодирования.

Если компилятор может что-то выяснить за вас, зачем писать одно и то же дважды?

Мой коллега сначала был очень против. to var, как и вы, но теперь начал его использовать. Он беспокоился, что это сделает программы менее самодокументированными, но на практике это вызвано в большей степени слишком длинными методами.

4
ответ дан 4 December 2019 в 05:52
поделиться
var MyCustomers = from c in Customers 
                  where c.City="Madrid" 
                  select new { c.Company, c.Mail };

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

3
ответ дан 4 December 2019 в 05:52
поделиться

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

РЕДАКТИРОВАТЬ: Чтобы немного расширить это (на случай, если это звучит так, как будто я не поддерживаю var):

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

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

Этот аспект SML (и других функциональных языков) кажется тем, что спрашивающий считает «хорошей вещью» - т.е. хорошо все, что помогает компилятору обнаруживать больше ошибок во время компиляции.

А вот и вещь с SML: он использует вывод типа исключительно при назначении. Так что я не думаю, что вывод типов может быть плохим по своей сути.

что все, что помогает компилятору улавливать больше ошибок во время компиляции, хорошо.

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

что все, что помогает компилятору улавливать больше ошибок во время компиляции, хорошо.

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

1
ответ дан 4 December 2019 в 05:52
поделиться

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

1
ответ дан 4 December 2019 в 05:52
поделиться

Как указал Эрвикер, есть несколько функциональных языков, одним из которых является Haskell, а другим - F #, где такой вывод типов используется гораздо более широко - аналогия C # будет объявлять возвращаемые типы и параметры типы методов как "var", а затем компилятор определит для вас статический тип. Статическая и явная типизация - две ортогональные проблемы.

На самом деле, можно ли вообще сказать, что использование «var» является динамической типизацией? Насколько я понял, для этого и предназначено новое ключевое слово «dynamic» в C # 4.0. "var" предназначен для вывода статического типа. Поправьте меня, если я ошибаюсь.

0
ответ дан 4 December 2019 в 05:52
поделиться

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

Однако это определенно простой способ сократить строки нового объявления, и я использую его для этого все время.

Однако когда я меняю тип базового метода и принимаю возвращаемый тип с помощью var . Я иногда получаю ошибку во время выполнения. Большинство из них все еще подбираются компилятором.

Вторая проблема, с которой я сталкиваюсь, - это когда я не уверен, какой метод использовать (и я просто просматриваю автозаполнение). ЕСЛИ я выберу неправильный и ожидаю, что это будет тип FOO, а это тип BAR, тогда потребуется время, чтобы понять это.

0
ответ дан 4 December 2019 в 05:52
поделиться

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

0
ответ дан 4 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

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