2015-02-27 4 views
1

После этого показано, что приложение консоли C# остановлено в точке останова. Переменная sln имеет тип Solution2. Из исследований, я определил, что Projects элемент в растворе использует 1 на основе индексации, так что, как я получить единственный проект в решении Visual Studio (линия, где расположена точка останова):Как определить тип индексации, используемый от отладчика

project = sln.Projects.Item(1); 

То, что я пытался сделать через отладчик, было попыткой выяснить, могу ли я определить, была ли коллекция 0-основанной или 1-й, , если бы я не имел эту информацию заранее. Но отладчик только показывает, что у коллекции Projects есть номер Count 1. Есть ли способ (не экспериментируя), чтобы получить эти знания, просмотрев коллекцию через отладчик?

Кроме того, вопросы, связанные:

Что такое Dynamic View элемент?

Расширение `[System .__ ComObject] приводит к кажущемуся рекурсивному дисплею, как показано ниже:

Почему это? Какой цели это служит?

ответ

1

Чтобы ответить на ваш первый вопрос, нет простого способа определить, основана ли сборка на основе COM на основе 0 или 1 на основе. Нет, если вы не захотите разобрать реализацию метода get_Item() объекта, реализующего COM-интерфейс. Это может быть либо 0, либо 1, и, в общем, даже не гарантировано, что индексы должны быть целыми. В самом деле, определение вашего Projects.Item method принимает System.Object в качестве параметра:

Project Item(
    Object index 
) 

--- 
Parameters 
    indexType: System.Object 

    Required. The index of the item to return. 

В вашем случае, вы можете избежать с помощью метода Item, потому что Projects коллекции IEnumerable, так что вы можете просто получить первый элемент из перечисление:

#using System.Linq; 
--- 
var firstItem = sln.Projects.First(); 

Ваш последний вопрос - это просто ошибка (или «функция») отладчика Visual Studio. COM-взаимодействие в VS-отладчике - не лучшая область. Если вы обнаружите, что вам нужно отлаживать COM-взаимодействие на нижнем рычаге, лучше всего использовать отладчик низкого уровня, например WinDbg, и вручную пройти через интерфейс vtable.

+0

спасибо. С этого момента начнем обращать внимание на тип аргументов Item. Доступ ли Linq медленнее, чем использование «Элемента»? (Не то, чтобы в этом случае это имело бы большое значение.) Спасибо. – Sabuncu

+1

@Sabuncu, вы правы, Linq сделает это медленнее, чем прямой метод 'Item'. Linq сначала получит объект перечисления, а затем начнет перечислять объект, используя его метод «Следующий», тогда ему придется уничтожить объект перечислителя. Для сравнения метод 'Item' просто возвращает указатель на существующий объект в коллекции, поэтому он должен быть намного быстрее. –

+0

Спасибо, что ответили подробно. – Sabuncu

 Смежные вопросы

  • Нет связанных вопросов^_^