Как неявная типизация делает код более понятным? - PullRequest
10 голосов
/ 06 августа 2010

В книге, которую я читаю, говорится, что неявная типизация делает следующий код более понятным, чем если бы вы не использовали ключевое слово var:

var words = new[] { "a", "b", null, "d" };

foreach (var item in words)
{
    Console.WriteLine(item);
}

Мне кажется, что все наоборотtrue: если вы использовали string вместо этого, то читатели кода сразу узнают, что это была строка в цикле foreach, вместо того, чтобы искать в коде, где определена переменная.

Как неявная типизация делает приведенный выше код более понятным?

Приложение

Книга C # 3.0 - Die Neuerungen.schnell + kompakt на немецком языке, фактический текст:

Das Schluesselwort var kann auch beim Durchlaufen von foreach-Schleifen verwendet werden, um somit den Code uebersichtlicher und einfacher zu.Besonders bei komplexen Typen kann man auf diese Art und Weise Programmierfehler verhindern.

вот мой перевод:

Ключевое слово var также может использоваться при итерации через циклы foreach, таким образомделая код проще и проще для создания.Особенно при использовании сложных типов, это может предотвратить ошибки программирования.

Хорошо, читая его более внимательно, он фактически заявляет, что var в цикле foreach делает код проще для создания но не обязательно легче читать.

Ответы [ 13 ]

0 голосов
/ 09 августа 2010

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

var светит, однако, когдаработа с большими иерархиями наследования и шаблонами.Вы также можете прочитать его как «Мне все равно - просто дайте мне данные» Хотя шаблоны в C # не обладают выразительной силой своего аналога C ++, они обладают большей выразительной силой, чем дженерики Java, и это означает, что люди могутСоздавайте конструкции, которые не просто неудобны, но и сложны для локации, если вам необходимо четко указать точный тип.

Например, представьте шаблонную оболочку вокруг нескольких типов DataReader-ов для общения с SQL - так что вы все еще можете быть эффективными (вызывать sproc, получать результаты, выполнено), но без бремени обслуживания (закрытиесчитыватель и подключение, повторные попытки или ошибки и т. д.).Код, который использует его, будет просто вызывать одну функцию, сделанную так, чтобы иметь как можно более короткий синтаксис, и он будет возвращать оболочку, которая будет действовать как интеллектуальный указатель в C ++ - действовать как DataReader для вашего кода, но также обрабатывать все побочные эффекты.Так что это выглядит так просто:

using (var r = S.ExecuteReader("[MySproc]", params))
{
    while ((+r).Read())
    (
       // get my data and be done
    )
} // at this point wrapper cleans up everything

В таком случае, не только то, что вам не важно, как называется и объявлена ​​оболочка, вам даже не важно знать, как это имя - дляваш код не имеет значения.Вы просто хотите получить свои проклятые данные и продолжать :-), не обращаясь к чьим-либо длинным объявлениям.

Буквально позволяет вам выбирать, когда вам небезразлично полное объявление типа, а когда нет. Это не все или ничего, и вы обнаружите, что используете оба стиля.

Еще одно место, где вы будете рады получить его, - это лямбда-выражения, если вы начнете их использовать.Если вы используете лямбда-выражения в C #, это почти всегда происходит потому, что вам нужен какой-то короткий, компактный код, который будет запускаться один раз, и не стоит тратить время на превращение в обычный метод, или это зависит от локальных переменных из метода host.

Да, и даже редактор VS выведет для вас полный тип, предложит автозаполнение и будет жаловаться, если вы попытаетесь использовать то, что он не может сделать, так что var вообще не нарушает безопасность типов (новый C ++ получил свой эквивалентный varтак же - давно пора).

0 голосов
/ 06 августа 2010

Основным преимуществом явной типизации является, на мой взгляд, то, что можно просто посмотреть в коде, какой тип имеет переменная. Так читаемость повышается.

И основные преимущества неявной типизации:

  • Сокращает текст программы, в частности, для длинных имен типов (классов, интерфейсов), таким образом улучшая читабельность
  • Вызывает меньшее количество изменений при изменении типа возвращаемого значения метода.

Похоже, что оба варианта улучшают читабельность.

Так что, я думаю, это зависит от ваших предпочтений и, возможно, также от правил программирования в вашей команде. Благодаря существующей поддержке (рефакторинга) инструментов в IDE стало намного проще менять имена типов (что понятно), поэтому причина неявной типизации, сокращающей изменения, практически исчезла с точки зрения усилий.

Я бы посоветовал: делать то, что лучше для вас. Там нет правильного или неправильного. Попробуйте каждый подход некоторое время (например, настраивая параметры вашего любимого инструмента рефакторинга), а затем используйте то, что облегчает вашу жизнь разработчика.

0 голосов
/ 06 августа 2010

Когда вам нужно изменить свой код, вам придется делать это в меньшем количестве мест. Нет больше словаря или больше объявлений типов, не больше Some.Very.Long.Class.With.Very.Long.Path<string> declaration = functionParameter[index] и т. Д.

Хотя я согласен с тем, что когда он используется в других ситуациях, кроме небольших методов, это может привести к путанице

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...