Вывод типов

Вывод типов и ключевое слово var

Посмотрите на код ниже. Тип, указанный в начале объявления переменной, компилятор способен определить автоматически по инициализирующему значению справа от знака равно. Например, можно ли понять, что число 18 — это целый тип int, а Phone() относится к типу Phone?

static void Main( )
{
    int age = 18; // Значение 18 справа сразу определяется как int
    Phone p = new Phone(); // Конструктор справа возвращает объект типа Phone
}
Code language: C# (cs)

Значит ли это, что приведённый код можно упростить?

В языке C# предусмотрено ключевое слово var для сокращения записи вместо явного указания типа.

static void Main( )
{
    var age = 18;
    var p = new Phone();
}
Code language: JavaScript (javascript)

В этом коде для всех переменных слева используется var. Компилятор определяет подходящий тип по выражению справа. После компиляции оба фрагмента кода полностью эквивалентны.

Важные замечания

  1. var не является динамическим типом, это лишь синтаксическое сокращение. Компилятор фиксирует выведенный тип на этапе компиляции, изменить его позже нельзя; смысл двух фрагментов кода полностью одинаков.
  2. Обязательные правила при использовании var:
    • Допустимо только для локальных переменных, не подходит для полей класса
    • При объявлении обязательно задавать начальное значение, запись только var x; является ошибкой
    • Выведенный тип остаётся неизменным, позже переменной нельзя присваивать значения другого типа
  3. Важное различие: var в C# ≠ var в JavaScript. В JavaScript var реализует слабую динамическую типизацию, переменная может хранить значения разных типов. var в C# — просто сокращение для статической строгой типизации и не меняет свойства C# как строго типизированного языка.

Иными словами, во время компиляции компилятор по правой части выражения определяет, что тип age — int, а тип p — Phone. Конечный результат совпадает с первым примером кода.

Позже изменить типы этих переменных невозможно. Рассмотрим пример:

class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();
    }
}

class Phone
{
    public string Name { get; set; }
}Code language: C# (cs)

Такая запись вызовет ошибку в C#, но разрешена в других языках, например JavaScript и PHP, где допускается смена типа переменной.

JavaScript и PHP относятся к языкам со слабой динамической типизацией, у переменных нет фиксированного ограничения по типу.

Неверный пример


class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();

        var isBuy;
    }
}

class Phone
{
    var price = 1000;
    var model = "iPhone";

    int count = 12;
}Code language: C# (cs)

Вывод типов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *