2010-09-11 4 views
10

MSDN категоризация var под № Types.var: a Тип или ключевые слова

переменные, объявленные в метод объема может иметь неявный тип вар

что означает «неявный тип вар» означает в данном контексте?

Строго сказано, если у меня есть это, чтобы объяснить товарищам-программистам.

Могу я сказать; var is a Тип, или я должен сказать; var - это ключевое слово, которое инструктирует компилятор определить сам тип.

примечание: Это не предназначение, чтобы начать обсуждение о var, а также узнать об использовании var. Для раз и навсегда я хочу знать, как это описать, и msdn немного запутанно, вот и все.

ответ

14

var является contextual keyword - наряду с yield, add и get, например.

Другими словами, вы можете использовать его как идентификатор без префикса его с помощью @, но он по-прежнему имеет особое значение для компилятора в некоторых местах (т. Е. Где ожидается имя типа для объявления локальной переменной).

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

var list = new List<string>(); 
var anon = new { Foo = "bar" }; 

Тип list является List<string>; тип anon - это анонимный тип, также представленный на C# 3. Часть причины для введения var в C# 3 заключалась в том, чтобы разрешать строго типизированные переменные с использованием анонимных типов - переменная по-прежнему имеет соответствующий тип времени компиляции, даже хотя вы не можете явно указать этот тип.

Есть несколько случаев, когда var не работает, однако, если компилятор не имеет достаточно информации:

var cantUseNull = null; 
var cantUseLambda = x => x.Length; 

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

<plug>
Подробнее об этом можно прочитать в документе C# in Depth. К счастью, глава, посвященная этому, по-прежнему доступна бесплатно из first edition page (вам нужна глава 8). Я не помню, насколько я изменил эту главу во втором издании ...
</plug>

+0

и можете ли вы объяснить мне, что означает «неявный тип var» в статье msdn, как я цитировал? Бит, потерянный в переводе здесь;) Слишком отредактированный вопрос, вы, где слишком быстро ... –

+0

@Caspar: Это означает, что вы можете использовать 'var' для объявления типа переменной, и в этом случае тип времени компиляции переменной является типом выражения в правой части. –

+1

Важно не потерять форматирование, это «неявный тип ** var **». Var является неявной типизацией в том, что фактический тип определяется компилятором из того, что ему назначено, то есть 'var i = 10;', в отличие от явно типизированной переменной, то есть 'int i = 10;' Implicit действительно означает подразумеваемый или предполагаемый тип. Это помогает? – Lazarus

0

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

0

вар имеет тип, как INT это ... но какой тип это точно ??

Ну, компилятор работает для вас (что неявно означает) на основе остальной части строки.

например.

var b = "ahjhsad"; 

Во время компиляции, вар будут заменены строки.

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

List<string> myList = new List<string>(); 

программист может написать

var myList = new List<string>(); 

и это означает то же самое.

+0

Dang, вы не можете победить в скирте ... – CVertex

+0

" Какой именно тип? Хороший вопрос. Спецификация C# фактически не определяет * слово «тип». Предполагается, что вы знаете, что это такое! –

11

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

Это зависит от того, как вы на это смотрите. Шутки в сторону!

Компилятор C# выполняет три вида анализа программ, каждый последующий анализ потребляет результат предыдущего. Первый вид анализа, который мы делаем, - лексический анализ; мы берем текст и превращаем его в ряд жетонов. Предположим, у вас есть

class C { static void Main(){ var x = 123; } } 

Сначала определить, что эти маркеры являются идентификатор класса (C) LEFTBRACE STATIC VOID IDENTIFIER (Main) LEFTPAREN RIGHTPAREN LEFTBRACE IDENTIFIERTHATMIGHTBEAKEYWORD (вар) IDENTIFIER (х) РАВНО INTEGER (123) SEMICOLON RIGHTBRACE RIGHTBRACE.

На этом этапе анализа «var» является идентификатором с примечанием на нем, в котором говорится, что это может быть ключевое слово var, а не идентификатор var.

Следующий анализ - грамматический анализ, где маркеры организованы в группы, которые образуют «дерево разбора». В этом случае маркеры будут организованы в этом дереве (отступа указывает на уровень вложенности в дереве)

declaration of class: CLASS 
    class name: IDENTIFIER(C) 
    class body begins: LEFTBRACE 
    declaration of method: 
     method modifier: STATIC 
     return type: VOID 
     method name: IDENTIFIER(Main) 
     formal parameter declarations: 
      formal parameter declarations begin: LEFTPAREN 
      formal parameter declarations end: RIGHTPAREN 
     method body: 
      method body begins: LEFTBRACE 
      local declaration statement: 
       type: IDENTIFIERTHATMIGHTBEAKEYWORD(var) 
       local name: IDENTIFIER(x) 
       initializer: 
       assignment operator: EQUALS 
       integer literal expression: INTEGER(123) 
       statement ends: SEMICOLON 
      method body ends: RIGHTBRACE 
    class body ends: RIGHTBRACE 

На данный момент вар был классифицирован как тип, грамматически. Это в том месте, где мы ожидаем объявления типа, если это грамматически-правовая программа.

Но на данный момент мы не знаем, относится ли «var» к типу или используется как ключевое слово. Для этого требуется семантический анализ.

Когда мы выполняем семантический анализ дерева синтаксического разбора, мы говорим «ОК, есть класс C, у него есть метод Main, который объявляет локальную переменную x. Каков тип этой локальной переменной?»

На данный момент есть две возможности. Первая возможность заключается в том, что в глобальном пространстве имен есть класс, структура, перечисление, интерфейс или тип делегата с именем «var». (В этом фрагменте программы нет «использования» директив, поэтому нам не нужно проверять какие-либо другие пространства имен, а тип не является частичным, поэтому нам не нужно проверять какие-либо другие объявления типа). Мы ищем глобальное пространство имен всех ссылочных ассемблеров, которые ищут тип, называемый «var». Мы также выполняем семантический анализ объявлений типов во всех других файлах, опять же, ищем тип, называемый var.

Если мы найдем один, то «var» относится к этому типу.

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

Таким образом, чтобы ответить на ваш вопрос:

лексический кода фрагмент «вар» является лексемой идентификатора с отметкой о нем говорится, что «кстати, это может быть на самом деле ключевым словом».

грамматической, маркер «вар» тип , когда он появляется в месте, в грамматике, где тип ожидается.

семантический, синтаксис типа «переменный» является типом , когда существует тип в области видимости называется переменной; если такого типа нет, а «var» используется как тип локального объявления, тогда синтаксис типа «var» не относится к типу. Скорее, это инструкция для компилятора вывести фактический тип локального.

+0

Спасибо за ответ, я действительно видел, что открытый класс var {} перегружает ключевое слово var, как вы описали, поэтому ваше объяснение действительно имеет смысл для меня, спасибо! PS: Означает ли это, что мне нужно понизить голос Джона? ;) –

+0

и в коде IDENTIFIERTHATMIGHTBEAKEYWORD - это то, что делает это, что в var x = 123 var может быть ключевым словом –

+0

Я понятия не имел, что вы можете создать тип 'var', который переопределит ключевое слово, но я полагаю, это необходимых для сохранения обратной совместимости. Из любопытства, есть ли способ по-прежнему использовать «var» в качестве ключевого слова, даже если такой тип находится в области видимости? –