2016-09-13 9 views
0

, например:в Visual Studio: почему окно QuickWatch добавляет «Mscorlib_CollectionDebugView» в список <T> выражения элементов?

var p = new { 
    rg = new List<string> { 
     "one", 
     "two", 
    } 
}; 

QuickWatch p и нажмите на p.rg[0] в дереве.

выражение становится: new System.Collections.Generic.Mscorlib_CollectionDebugView<string>(p.rg).Items[0]

что это ерунда, и как я могу избавиться от него?

ответ

0

В текстовом поле «Выражение» отображается полное имя любого узла, который вы выбрали в дереве. Полное имя - это выражение, которое нужно оценить, если вы хотите увидеть только выбранное вами значение.
List<T> не является массивом и на самом деле не имеет члена с именем «[0]». Если вы посмотрите на «Raw View», вы увидите фактические элементы реализации List<T>. Большинство людей не заботятся о реализации и хотят видеть только элементы в списке. Из-за этого List<T> имеет DebuggerTypeProxy. Тип прокси позволяет настраивать представление объекта в отладчике. Для List<T> прокси-сервер типа Mscorlib_CollectionDebugView. Чтобы непосредственно оценить элемент 0, вам нужно создать экземпляр прокси-типа, а затем получить значение элемента 0 (TypeProxy.Items[0]).

+0

Да, но список реализует «this [int]», поэтому «p.rg [0]» является допустимым выражением для этого элемента. Я понимаю: «Большинство людей не заботятся о реализации», но кто, по вашему мнению, заботится о внутренних реализациях отладчика, таких как «DebuggerTypeProxy» ?. если вы идете на длину, чтобы скрыть внутренние элементы в дереве, не можете ли вы перейти к дополнительным, но и спрятать прокси в выражении combo? – Spongman

+0

@Spongman, Вы правы, что отладчик может использовать «это []» в теории. Проблема заключается в том, что «этот []» является синтаксическим сахаром C#. Он фактически сопоставляется с индексом, сгенерированным компилятором, который является членом списка . Отладчик архивирован, чтобы быть агностиком языка, поэтому использование этого «] было бы немного взломанным. С точки зрения скрытия отвратительного выражения, я согласен с тем, что уродливо видеть некоторые эти сгенерированные выражения. Тем не менее, как разработчик мне нравится иметь возможность принять выражение и внести изменения в него, прежде чем оценивать его снова. –

+0

, в котором используется прецедент полезно для просмотра DebuggerTypeProxies? единственное, о чем я могу думать, это то, что вы разрабатываете эти прокси или сам отладчик. для других 99,99% раз это шум. я понимаю, что существующий дизайн затрудняет их скрыть, но я не думаю, что это действительно оправдание. – Spongman