Поведение C # получить член класса внутри отладчика VS2008 - PullRequest
3 голосов
/ 24 ноября 2011

Я объяснял какой-то модуль одному из моих друзей, и мне пришлось перейти в режим отладки для отображения некоторых значений некоторых переменных / свойств, установив точку останова.

Для нормального случая, если я установлю точку останова в сторону, получить / установить точку останова для нормального выполнения программы и будет показывать правильный результат.
Что мне показалось забавным, так это то, что 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? ,

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

Единственная причина, по которой я могу думать о том, почему отладчик не проходит через точку останова, заключается в том, что он должен остановить / разорвать сам поток отладки, чтобы достичь точки останова, которая остановит его.

Ответы [ 5 ]

3 голосов
/ 24 ноября 2011

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

1 голос
/ 24 ноября 2011

Конечно, это правильное поведение. Вы попросили его оценить Count так оно и было. Как это должно было узнать, что вы ДЕЙСТВИТЕЛЬНО хотели, чтобы он оценил _count?

Свойства и поля не всегда связаны друг с другом. Свойства гораздо больше похожи на методы, чем на поля. Хотели бы вы иметь возможность выполнять методы без побочных эффектов?

А как насчет свойств сеттера? Если бы вы использовали отладчик для преднамеренного изменения значения свойства, вы бы действительно хотели, чтобы значение оставалось постоянным?

1 голос
/ 24 ноября 2011

мне кажется, что это идеальный способ для себя. Если вы хотите, чтобы во всплывающей подсказке отображалось правильное значение, необходимо явно вызвать свойство. я, например, не хотел бы, чтобы отладчик сломался. это именно то, на что я бы надеялся.

1 голос
/ 24 ноября 2011

Отладчик - это просто еще один клиент вашего класса, и поэтому ему необходимо выполнить код вашего класса, чтобы представить вам значение. При этом отладчик может изменить состояние вашего класса.
Тем не менее, это действительно не должно быть проблемой, если вы придерживаетесь руководства по проектированию, чтобы сделать получателей максимально простыми. Если вы измените значение в вашем получателе, вы, скорее всего, нарушаете SRP .

0 голосов
/ 24 ноября 2011

Геттеры тихо украшены атрибутом [SpecialName].Это несколько меняет цель постов, и вот причина.Измените свой код на ...

    public class Test
    {
        int _count;
        public int Count
        {
            get
            {
                _count++;
                throw new Exception("hello");
                return _count;
            }
        }
    } 

и наведите курсор на файл console.writeline до его выполненияВы увидите, что отладчик сообщает, что произошло исключение!В противном случае у вас не будет такого типа отчетности.Так что да, это ожидаемое поведение.

...