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

Var: a Тип или ключевое слово

MSDN классифицирует var под Types.

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

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

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

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

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

4b9b3361

Ответ 1

var является контекстуальное ключевое слово - наряду с yield, add и get например.

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Сначала мы определяем, что эти жетоны являются КЛАССОМ ИДЕНТИФИКАТОРОМ (C) ЛЕВОСТОРОННИЙ СТАТИЧЕСКИЙ ИДЕНТИФИКАТОР ГОЛОСОВАНИЯ (основной) LEFTPAREN RIGHTPAREN LEFTBRACE IDENTIFIERTHATMIGHTBEAKEYWORD (var) ИДЕНТИФИКАТОР (x) РАВНОМЕРНЫЙ 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 классифицируется как тип, грамматически. Это в том месте, где мы ожидаем объявления типа, если это грамматически-правовая программа.

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

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

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

например.

var b = "ahjhsad";

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

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

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

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

var myList = new List<string>();

и это означает одно и то же.