Я объяснял какой-то модуль одному из моих друзей, и мне пришлось перейти в режим отладки для отображения некоторых значений некоторых переменных / свойств, установив точку останова.
Для нормального случая, если я установлю точку останова в сторону, получить / установить точку останова для нормального выполнения программы и будет показывать правильный результат.
Что мне показалось забавным, так это то, что VS-отладчик также будет использовать то же самое (то есть вызывать метод get), чтобы узнать значение свойства.
Как отладчик, он должен иметь возможность получить состояние программы, фактически не нарушая ее и не оказывая побочного эффекта.
Попробуйте приведенный ниже код, задайте несколько точек останова и наведите указатель мыши на счетчик свойств на console.write()
. Вы обнаружите, что количество изменений не изменяется, если точка останова на самом деле не попадет внутрь get
.
Просто наведя указатель мыши на свойство, оно извлекает из него значение, которое может быть трудно понять в какой-то странной сессии отладки.
Я знаю, что люди могут сказать, что get не должен изменять член или плохой дизайн, но в некоторых случаях лучше написать в get (), например, проверить на null и вернуть новый объект, если он равен null;
public class Test
{
int _count;
public int Count
{
get
{
_count++;
return _count;
}
}
}
public class Program
{
static void Main(string[] args)
{
Test tCount = new Test();
Console.Write(tCount.Count);
}
}
Считаете ли вы, что это правильное поведение VS? ,
Поскольку отладчик не должен изменять состояние программы.
Даже если он изменяет состояние, он должен проходить через точку останова.
Единственная причина, по которой я могу думать о том, почему отладчик не проходит через точку останова, заключается в том, что он должен остановить / разорвать сам поток отладки, чтобы достичь точки останова, которая остановит его.