Я просматривал какой-то код, который я написал некоторое время назад, и понял, что сделал предположение о операторе присваивания в С#. Вот строка кода, о которой идет речь (она работает как ожидалось):
pointsChecked = pointsChecked ?? new List<Point>();
pointsChecked
- это список, указанный как параметр для рекурсивной функции. Это параметр по умолчанию со значением по умолчанию null
. То, что я хочу сделать, это инициализировать его один раз, а затем собрать коллекцию точек, которые я уже проверил, поэтому ее следует инициализировать только во время первой итерации.
Мое предположение заключалось в том, что С# защищен от самоопределения таким же образом, что С++ operator=
должен обеспечивать защиту при перегрузке (т.е. if(this == &rightHandSide) return *this;
). Однако я не смог найти какие-либо ресурсы, которые явно указывают, что это верно для С#.
Самый близкий пример, который я нашел, был этот вопрос о нулевом коалесцирующем операторе, где, как представляется, объект присваивается себе, если он не null
, В этом примере никто ничего не сказал о самоназвании, но я хочу быть уверенным, что это не плохая практика и что никаких отрицательных побочных эффектов нет.
Поиск в MSDN Я также обнаружил, что (перефразируя на основе моего понимания) значение с правой стороны копируется в значение с левой стороны и вернулся. Поэтому я снова не уверен, что плохо самонастраиваться.
Я знаю, что могу сделать следующее, чтобы быть более безопасным:
if(pointsChecked == null)
{
pointsChecked = new List<Point>();
}
Но я предпочел бы понять, что на самом деле происходит с самоназначением.