var: тип или ключевое слово - PullRequest
10 голосов
/ 11 сентября 2010

MSDN классифицирует var в Types.

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

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 11 сентября 2010

var является контекстным ключевым словом - наряду с 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 # в Depth . К счастью, глава, посвященная этому, по-прежнему доступна бесплатно со страницы первого издания (вам нужна глава 8). Я не могу вспомнить, насколько я изменил эту главу во втором издании ...
</plug>

11 голосов
/ 11 сентября 2010

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

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

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

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

Сначала мы определим, что эти токены являются ИДЕНТИФИКАТОРОМ КЛАССА (C) ИДЕНТИФИКАТОР СТАТИЧЕСКОГО ВИДА ЛЕВЫХ КЛАВИШ (Основной) ЛЕВЫЙ ПРЯМОЙ ПАРТЫ ЛЕВЫЙ КЛАВИШ ИДЕНТИФИЦИРУЮЩЕЙ ПЛОСКОЙ КЛАВИШИ (var) ИДЕНТИФИКАЦИОННЫЙ ПРАВО (правый) ПРАВОСЛУЖИВАНИЕ (var) ИДЕНТИФИКАЦИОННЫЙ ПРАВО (правая точка) (x).

На данном этапе анализа «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 классифицируется как тип, грамматически .В том месте, где мы ожидаем объявление типа, если это грамматически легальная программа.

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

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

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

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

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

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

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

Грамматически , токен" var "имеет тип , когда он появляется в позиции в грамматике, где ожидается тип .

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

0 голосов
/ 11 сентября 2010

var - это тип, например int - это ... но какой именно это тип ??

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

например,

var b = "ahjhsad";

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

var используется в качестве удобного сокращения для программиста вместо необходимости писать

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

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

var myList = new List<string>();

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

0 голосов
/ 11 сентября 2010

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

...