1. Константы
Константа — это "волшебная" переменная, значение которой нельзя (и не нужно!) менять после объявления. Представьте себе суперклейкую наклейку на вашей кружке с надписью "Только чай". Прилепив такую наклейку вы уже не сможете сменить чай на кофе (по крайней мере, в рамках C#).
const int DaysInWeek = 7;
const string HelloMessage = "Добро пожаловать!";
В этих примерах DaysInWeek всегда будет 7, а HelloMessage — неизменно приветственное. Как только значение константы определено, менять его уже нельзя.
Зачем нужны константы?
- Ясность кода: когда вы видите const double Pi = 3.14159;, нет сомнений, что это константа, а не переменная, которую кто-то может поменять посреди программы.
- Безопасность: никто (даже вы сами через пару месяцев) не сможет случайно переписать значение константы.
- Производительность: компилятор C# вставляет значение константы непосредственно в места вызова, поэтому программа работает чуть быстрее.
Синтаксис объявления
const тип имя = значение;
- Тип — любой примитивный тип (int, double, string, char, а также перечисления и литералы).
- Имя — принято использовать стиль CamelCase или PascalCase. Для "магических" констант иногда используют все заглавные буквы и подчеркивания (DAYS_IN_WEEK), но в C# это не обязательно.
Примеры:
const double GRAVITY = 9.81; // ускорение свободного падения, м/с^2
const char DELIMITER = ',';
const string DEVELOPER_NAME = "Иван Петров";
Особенности и ограничения констант
- Значение должно быть известно во время компиляции. Это значит, что нельзя объявить константу, чье значение вычисляется во время выполнения программы.
const int NowYear = DateTime.Now.Year; // ОШИБКА КОМПИЛЯЦИИ!
- Можно использовать только простые типы, string или перечисления.
- Нельзя сделать константой массив, объект, результат вызова метода и т.д.
- Даже выражения, которые математически кажутся "простыми", должны быть рассчитаны компилятором, а не во время работы программы.
Вот, например, так нельзя:
const string FullGreeting = "Привет, " + userName; // userName — это переменная, так нельзя!
А так — можно и нужно:
const string DefaultGreeting = "Привет, пользователь!";
Где константы обычно объявляют?
- В начале класса (или файла), над методами.
- В специальных классах с константами (например, public static class Constants).
- На уровне класса, если константа относится только к этому классу.
Пример для нашего консольного приложения:
class Program
{
const string Welcome = "Добро пожаловать в наше приложение!";
static void Main(string[] args)
{
Console.WriteLine(Welcome);
}
}
Константы и область видимости
Константы подчиняются тем же правилам области видимости, что и обычные переменные: их видят только в том диапазоне, где они объявлены.
2. Ключевое слово var
Ключевое слово var — это не новый тип переменной, а удобный способ позволить компилятору самостоятельно определить тип переменной из контекста.
Это чисто синтаксический сахар — никакой магии здесь нет, и после компиляции переменная становится обычного типа.
var age = 23; // компилятор понимает: age — это int
var name = "Анна"; // компилятор понимает: string
var price = 99.99; // компилятор понимает: double
Почему появился var?
- Читабельность: не нужно писать длинные типы (вроде Dictionary<string, List<int>>) вручную.
- Гибкость: позволяет легче менять типы в будущем: исправили справа — слева var уже подстроится.
- Современный стиль: практически все современные C#-проекты используют var там, где тип легко читается из инициализации.
Когда можно (и нужно) использовать var
- Когда справа однозначно видно, какой тип у переменной.
- Когда тип очевиден (var price = 100; — ясно, что это int).
- Когда тип слишком длинный или сложный (например, результат LINQ-запроса).
var numbers = new int[] { 1, 2, 3, 4 };
var input = Console.ReadLine(); // input — это string (метод возвращает string)
Когда лучше НЕ использовать var
Если тип неочевиден по правой части, код может стать менее понятным. И если через месяц вы даже с помощью коллег не поймёте, что там за тип был, лучше явно указать.
var mystery = DoSomethingVeryComplicated(); // КТО ТЫ, mystery???
Здесь лучше явно указать тип:
string result = DoSomethingVeryComplicated();
Золотое правило: используйте var только там, где он не ухудшает читаемость!
var — только для локальных переменных
Ключевое слово var работает только для локальных переменных — внутри методов. Нельзя использовать var для:
- параметров метода;
- свойств класса;
- констант.
Как работает var "под капотом"
- Компилятор C# при компиляции подставляет правильный тип.
- После компиляции никакого var не остается.
- Нет никакой потери в производительности: это удобство только для программиста.
var year = 2025; // на этапе компиляции становится: int year = 2025;
Типичные ошибки при использовании var
- Неинициализированная переменная:
var a; // ОШИБКА: Компилятору не из чего вывести тип!
- Неоднозначная инициализация:
var list = null; // ОШИБКА: Тип null не определён!
- Переиспользование переменной с разными типами:
var value = 5; // value — int
value = "Пять"; // ОШИБКА: value уже int!
Сравнение: явные типы и var
| Сценарий | Явный тип | var |
|---|---|---|
| Тип однозначен | |
|
| Метод возвращает сложный тип | |
|
| Массив | |
|
в большинстве случаев в современных проектах используется var для локальных переменных. Для параметров, свойств, констант — только явные типы.
3. Ловушки и советы
В C# часто пишут магические числа прямо в коде ("7", "3.14159", "0.15" и прочие загадочные цифры). Это плохо: если вдруг значение изменится, придется искать все упоминания по всему проекту. Используйте константы! И самому будет проще, и коллеги не проклянут...
С var другая крайность: если у вас весь код — это сплошной var, но нигде не видно, что за типы используются — код быстро становится непонятным. Поэтому используйте var там, где это логично и понятно из контекста, а в остальных случаях не стесняйтесь явно указывать тип.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ