Вопрос

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

Я также читал (но не использовал) Бу что, кажется, делает шаг вперед, делая его необязательно объявлять локальную переменную.В Boo могут подразумеваться как тип, так и объявление.

Это заставляет меня задаться вопросом: почему разработчики языка C# вообще потрудились включить ключевое слово var?

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

var anon = new { Name = "Terry", Age = 34 };

против

anon = new { Name = "Terry", Age = 34 };
Это было полезно?

Решение

Обновлять: На самом деле здесь есть два связанных вопроса:1.Зачем мне вообще объявлять переменные?2.Какая польза от «var» в языке, который требует объявления переменных?

Ответы на (1) многочисленны, и их можно найти в другом месте по этому вопросу.Мой ответ на (2) ниже:

Как говорили другие комментаторы, LINQ использует это для своих анонимных типов.Однако LINQ на самом деле является примером более общей проблемы, когда тип правой части выражения либо неизвестен программисту, либо является чрезвычайно многословным.Учитывать:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

Многословно и подвержено ошибкам, не так ли?Итак, теперь они позволяют вам сделать это:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

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

Другие советы

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

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name

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

Почти в каждом примере .net 3.5, который я вижу в последнее время, все переменные определены с помощью var.

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

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

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

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

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

var weight = GetExactWeightOfTheBrownYakInKilograms();

До сих пор не знаю, что вернется.Это объект типа int, decimal, float, Weight и что?Мне все равно придется тратить время на поиски...мне нужен костыль intellisense, чтобы спасти положение от моего ленивого программирования.Возможно, включите тип возвращаемого значения в имя функции.Хорошая идея, теперь использование var не спасло нас ни от чего, кроме того, что все мои функции стали иметь очень длинные имена.

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

Это немного субъективно, но я думаю, что разработка C# 3.0 с ключевым словом «var» для неявно типизированных переменных вместо отсутствия ключевого слова делает код более читабельным.Например, первый блок кода ниже более читабелен, чем второй:

Очевидно, где объявлена ​​переменная:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

Не очевидно, где объявлена ​​переменная:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

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

В вашем вопросе var добавляет ценность коду, сообщая компилятору слово anon теперь разрешено использовать везде, где вы ожидаете увидеть элемент типа, подразумеваемого в назначении.Требование введения имен в компилятор, подобное этому, позволяет компилятору отклонять вещи, о разрешении которых ему явно не было сказано, и тем самым улавливать определенные виды ошибок во время компиляции, чтобы они не взорвались во время выполнения.

Например, в разделе обновления вашего вопроса вы спросили об этом фрагменте:

anon = new { Name = "Terry", Age = 34 };

Проблема с таким разрешением заключается в том, что все, что находится в левой части любого присваивания, имя которого ранее не существовало, превращается в объявление переменной, даже если это действительно опечатка.Если позже в программе вы присвоите anon что-то еще, а затем еще дальше ссылаетесь на новое значение, но в среднем операторе будет опечатка, у вас возникнет проблема, которая не проявится до времени выполнения.

Вы отвечаете, что это делает Бу, поэтому это должно быть нормально или, по крайней мере, возможно.Но это отвлекающий маневр.Мы говорим о C#, а не о Бу.Одна из целей C# — создать язык, в котором компилятор сможет обнаружить как можно больше ошибок.Boo тоже хочет этого, но при этом хочет быть больше похожим на Python.Поэтому он жертвует некоторый (не все) безопасность времени компиляции C# в обмен на синтаксис, подобный Python.

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

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

bill=5;
bi11=bill+5

Какова стоимость счета?

Тем не менее, меня иногда несколько раздражает набирать:

DataOutputStream ds=new DataOutputStream();

Кажется излишним, но, честно говоря, в этом нет ничего плохого.Вам больше не потребуется набирать его дважды, и это чрезвычайно полезно.Время требуется, когда у вас есть вопросы, когда вы не знаете, как использовать тот или иной API.Если вас действительно утомляет ввод этого объявления типа дважды, то зачем вы тратите здесь свое время?Поскольку вы начали это читать, вы могли напечатать 30 или 40 деклараций, чего хватит на каждую декларацию, которая вам понадобится в течение следующих двух недель.

Думаю, я хочу сказать, что, хотя я понимаю эмоциональный стресс, который может вызвать повторение, последовательность, ясность и способность создавать более интеллектуальные инструменты делают это ХОРОШО стоящим.

И еще: в большинстве случаев код не должен быть таким, как в моем примере выше.Что вам следует делать, так это:

DataOutput ds=new DataOutputStream();

Это сразу скрывает тот факт, что вы используете конкретный класс в шаблоне.Этот шаблон должен иметь возможность выполнять все необходимые операции с вашим классом.Позже, если вы захотите заменить ds каким-либо другим типом выходного потока, простое изменение этой единственной строки исправит ситуацию.Если вы использовали функции, недоступные для DataOutput, путем приведения к DataOutputStream, редактор легко это выяснит и сообщит вам об этом.

Для анонимных типов, которые, помимо прочего, поддерживают LINQ.

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

Я считаю, что var (и несколько других новых ключевых слов) были добавлены специально для поддержки Linq.

var — это ключевое слово, используемое для создания анонимного типа — см. http://msdn.microsoft.com/en-us/library/bb397696.aspx

Анонимные типы можно использовать не только в Linq, но и в других местах.

var чрезвычайно полезен для Linq.Фактически, по словам одного эксперта-автора, «Без var использовать LINQ становится слишком сложно."

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top