Подтвердить что ты не робот

Почему нужны декларации

В настоящее время я преподаю коллеге .Net, и он задал мне вопрос, который меня насторожил.

Почему мы должны объявлять?

если var является неявной типизацией, почему мы должны даже объявлять?

Animal animal = new Animal();

становится

var animal = new Animal();

может стать

animal = new Animal();

Неявное типирование все равно означает, что это статически типизированная переменная.

Если для переменной присваивается два разных типа, если они не разделяют базовый класс (кроме объекта), это может быть ошибкой компилятора.

Есть ли техническая причина, по которой это невозможно сделать или это стилистически нам нравится hasin

4b9b3361

Ответ 1

Конечно, это было бы возможно.

Я могу подумать о нескольких причинах, по которым вы этого не хотите:

  • Какова область вашей переменной? Не ясно, не сообщите ли вы компилятору. Будет ли animals в двух методах стать частной переменной или двумя переменными с областью действия?
  • Что делать, если это опечатка? Вы никогда не узнаете.
  • Что делать, если вы уже присвоили значение этой переменной, а затем попытаетесь присвоить новое значение, которое несовместимо с последним (например, стиль javascript) (кредиты Марио Стойлов)

Ответ 2

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

Предположим, вы хотите переназначить строку myString, чтобы получить новое значение:

myString = "New value";

Но вы случайно написали это:

myStrimg = "New value";

Это приведет к ошибке времени компиляции. Однако, если вы разрешаете неявно созданные переменные на ваш вопрос, это будет бесшумно создавать новую переменную с предсказуемо веселыми результатами...

Ответ 3

Как было предложено Брэдом Смитом http://www.brad-smith.info/blog/archives/336: -

Кажется, что некоторые программисты склонны использовать var для каждого   объявление переменной. Конечно, язык не мешает вам делать   это и, действительно, MSDN допускает, что это "синтаксическое удобство"...   Но он также очень сильно предупреждает, что:

     

использование var имеет, по крайней мере, потенциал, чтобы сделать ваш код более   трудно понять для других разработчиков. По этой причине С#   документация обычно использует var только тогда, когда это требуется.

     

Неявно типизированные локальные переменные (руководство по программированию на С#), MSDN

     

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

     

Используя var, вы заставляете себя больше думать о том, как вы   методы и переменные имен вместо того, чтобы полагаться на систему типов на   улучшить читаемость, что-то большее, чем деталь реализации...

     

var улучшает читаемость, Хади Харири

     

Я согласен с предпосылкой приведенной выше цитаты, но не с концом   результат. Напротив, чрезмерное использование и неправильное использование var может привести к   некоторые очень вредные привычки...

     

Давайте рассмотрим аргумент против широкого использования var (и для   его щадящее, правильное использование):

     

Неявно типизированные переменные теряют описательность

Имя типа предоставляет дополнительный слой описания в объявлении локальной переменной:

 // let say we have a static method called
 GetContacts() // that returns System.Data.DataTable  
 var individuals = GetContacts(ContactTypes.Individuals); 

 // how is it clear to the reader that I can do this?   
 return individuals.Compute("MAX(Age)", String.Empty);

Мое имя переменной выше описательно; он дифференцирует   между любыми другими переменными, заполненными с помощью GetContacts() и действительно   другие переменные типа DataTable. Когда я работаю с переменной, я   знайте, что его отдельные контакты, на которые они ссылаются, и что   все, что я получаю от них, будет в этом контексте. Однако без   указывая имя типа в объявлении, я теряю   описательность, которую он предоставляет...

   // a more descriptive declaration   
   DataTable individuals = GetContacts(ContactTypes.Individuals) 

Когда я прихожу к пересмотру этого кода, плохо знаю не только то, что   переменная представляет концептуально, но также и ее представление в терминах   структуры и использования; что-то отсутствует в предыдущем примере.

Дополнительные примечания: -

Вот несколько хороших/плохих примеров, основанных на разумном использовании объявления неявных переменных...

  • Хорошо:

     var numbers = new int[] {1, 2, 3, 4};
    
     var stringbuilder = new StringBuilder();
    
     var cars = new List();
    
     var orders = new Dictionary();
    

+/- OK с любым (но предпочитаем явное объявление):

 int pages = 10;
 string username = "john";
var username = "john";
var order = GetOrder(orderId); // ok if the type is Order, otherwise not
 for (var x = 1; x < 10; x++)
  • Плохо:

       var settings = GetInboxSettings(); // not obvious at all
    
      var userId = GetUserId(); // ambigous, is this guid, string, int or a custom UserId object?
    
       Dictionary orders = new Dictionary(); // redundant
    

Ответ 4

Когда мы объявляем переменную xxx, мы указываем следующее на наш инструмент

  • освободить место для объекта
  • которые будут жить в этой области
  • и иметь этот тип (необязательно)

То, что мы говорим нашим людям,

  • в этой области существует объект с именем xxx
  • этого типа (необязательно)

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

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

Итак, я бы сказал, что у нас есть одна хорошая причина для объявления переменных: рассказать людям, читающим наш код, что он существует. Объявление переменных повышает их видимость и разъясняет информацию, которая необходима для нашего понимания программы.

Ответ 5

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

Однако, возможно, команда компилятора С# все еще может создать такую ​​функцию. Но использование var упростило все. Мы сохранили проектные усилия, усилия по разработке, усилия по тестированию и усилия по техническому обслуживанию. Самое главное, это делает код более удобочитаемым.

Ответ 6

Хорошо, я не оспариваю факты, которые приводятся здесь в некоторых ответах. Скорее я хотел бы ответить по-другому:

int count;
if(someConditionIsTrue)
    count = 3;
else count = 1;

Я не могу использовать здесь "var count". Могу я? Теперь, какая из двух следующих строк выглядит красиво:

Tuple<int, string, bool, float> tuple = new Tuple<int, string, bool, float>(1, "p", true, 3.0f);

ИЛИ

var tuple = new Tuple<int, string, bool, float>(1, "p", true, 3.0f);