Я новичок в C#. Я сталкивался с такой код-пример:Повторное использование сохранившейся локальной переменной в каждом вызове. UB?
namespace App1
{
delegate int Sum(int number);
class TestAnonymusMethod
{
static Sum m()
{
int result = 0; // is not zeroed between calls
Sum del = delegate (int number)
{
for (int i = 0; i <= number; i++)
result += i;
return result;
};
return del;
}
static void Main()
{
Sum del1 = m();
for (int i = 1; i <= 5; i++)
Console.WriteLine("Sum of {0} == {1}", i, del1(i));
Console.ReadKey();
}
}
}
результат:
Sum of 1 == 1
Sum of 2 == 4
Sum of 3 == 10
Sum of 4 == 20
Sum of 5 == 35
Как вы видите, локальная переменная result
не обнулить между вызовами. Это «неопределенное поведение»? Похоже, что это происходит из-за закрытия рамки result
, срок ее жизни не определен.
Но каковы правила повторного использования живых существ в C#? Является ли это правилом - «повторно использовать всегда», или есть некоторые случаи, когда новый будет создан вместо повторного использования сохранившегося старого?
Почему это должно быть обнулено? Вы вызываете метод «m()» только один раз, поэтому он инициализируется 0 только один раз. – Evk
@Evk, я переименовал вопрос. Поскольку 'result' не является' static', для меня это выглядит немного странно (после C++) - повторное использование той же переменной (с ее текущим значением) в каждом вызове. – user1234567