Зачем нужен const, если можно не менять int

258
17 декабря 2018, 15:00

Не понимаю, зачем во многих языках используется тип данных const, если можно создать int и не менять его? Прошу объяснить и привести пример.

Answer 1

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

Самый банальный пример - число "пи", константа, которую можно объявить один раз и быть уверенным, что она не поменяется.

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

Тут кстати хорошо напомнить вот о чём. Константы вшиваются сразу в код (при этом достигается копеечная, но всё же выгода) и это в .Net приводит к тому, что если вы меняете константы в одной сборке - то нужно перекомпилировать весь проект. Об этом написано во многих учебниках по шарпу, но случается забывают и наступают на эти грабли.

С точки зрения компилятора меняется следующее. Если у нас переменная - мы ей выделяем место в стеке/куче под хранение:

void Main()
{
    var i = 10;
    i.Dump();
}

Если мы объявляем константы - то места под хранение не выделяется, во всех местах, где нам нужна константа - подставляется её конкретное значение:

void Main()
{
    const int i = 10;
    i.Dump();
}

Здесь ldc - это load constant, а работа со стеком исчезла - нет этой переменной.

Answer 2

"можно создать int и не менять его"

Идея, конечно, хорошая, но никаких гарантий не даёт. С таким же успехом можно не надевать шлем при езде на мотоцикле, мотивируя это тем, что "я просто не буду попадать в аварии". К сожалению одного обещания, данного самому себе, как правило недостаточно. Вы можете забыть, что ваша переменная не должна меняться, и изменить её. Хуже того, очень часто код пишется сразу несколькими разработчиками, которые могут не знать, что переменную x менять нельзя, а переменную y - можно. Модификатор const подскажет это. Явно объявленный const облегчает понимание кода, делает его чуть более декларативным.

Кроме того, константные значения вычисляются на этапе компиляции, и это тоже неплохо. Помимо небольшой, но всё же имеющей место выгоды в плане производительности, очень серьёзным доводом в пользу const может оказаться тот факт, что ошибку, связанную с изменением константы вы увидите при компиляции, а ошибку, вызванную изменением переменной, которая должна быть константой, вы увидите только в рантайме, когда она уже (возможно) наделала бед.

Answer 3

Интересный вопрос как по мне. Вас никто не заставляет объявлять переменную типа const потому-что это только для вашего удобства и для общего понимания. Для небольших проектов, как отметил @AK, это не столь заметное применение, но все же удобно. Просто представьте ситуацию где у вас в проекте переменных одного типа штук 200, и вам их иногда но нужно изменять. Но есть пару значений которые изменять в крайне опасно, например для вычислений кредитов там где например проценты для всех сумм одинаковые и их менять ненужно. Было бы нехорошо если бы с вашим кодом работал бы не совсем опытный пользователь, и попытался изменить проценты из 5% например на 0.0001% если не меньше. Представьте какие бы компания потерпела убытки. А в случае с применение keyword const, у него бы указалась ошибка связана с изменением значение КОНСТАНТЫ, значение которой изменить нельзя.

Подробнее о данной сущности тут

READ ALSO
WPF обработка нажатия клавиш вне окна

WPF обработка нажатия клавиш вне окна

Делаю приложение на WPFМне нужно, чтобы даже если окно не в фокусе, то оно все равно могло реагировать на нажатие клавиши Ctrl

249
Соединить списки

Соединить списки

Есть коллекция объектов A в каждом из объектов A есть коллекция объектов B и есть просто объект BКак с помощью LINQ получить коллекцию объектов...

220
Событие - Когда добавляется что либо в StackPanel

Событие - Когда добавляется что либо в StackPanel

Я прикрутил к StackPanel скролл, но он не так пока работает как мне хотелось быОн стоит на месте, когда содержимого больше чем высота StackPanel

165
Записать в log.txt о Mixed Content на странице?

Записать в log.txt о Mixed Content на странице?

Я использую ssl но иногда на страницах сайта встречаются внешнее изображения, добавлены пользователями, с протоколом http, как записать в logtxt...

228