С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 109
1

Содержимое интерфейса IEnumerable

31.08.2016, 12:38. Просмотров 869. Ответов 3
Метки нет (Все метки)

Всем привет, хочу спросить насчет интерфейса IEnumerable, который как я понял используется при работе с коллекциями(я их только начал изучать), но тема не о коллекциях, а о содержимом вышеупомянутого интерфейса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace System.Collections
{
    // Сводка:
    //     Предоставляет перечислитель, который поддерживает простой перебор элементов
    //     неуниверсальной коллекции.
    [ComVisible(true)]
    [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
    public interface IEnumerable
    {
        // Сводка:
        //     Возвращает перечислитель, осуществляющий итерацию в коллекции.
        //
        // Возвращает:
        //     Объект System.Collections.IEnumerator, который может использоваться для перебора
        //     коллекции.
        [DispId(-4)]
        IEnumerator GetEnumerator();
    }
Итак, по порядку, что мне не понятно:
строка
C#
1
[ComVisible(true)]
- как дает определение Visual Studio, когда навожу курсор настроку:
** class System.Runtime.Interop.Services.ComVisibleAttribute
Управляет доступгостьб отдельног управляемого типа или члена или всех типов в сборке для COM **
Итак, вопросы в студию:
  • InteropServices - ?
  • COM - это что вообще ?
  • ComVisibleAttribute - ?
  • что за ComVisible
    C#
    1
    
    [ComVisible(true)]
    - какую роль он выполняет
  • Управляемый тип\член ?
Умоляю дать подробный и развернутый ответ, без вот этого : "там есть некие механизмы, но так как ты сейчас только начал учить коллекции, то тебе это будет не нужно и даже мешать" - поверьте, мне нужно все. Отвечать на вопросы можно, даже нужно так, что бы эти разрозненные вопросы в итоге сформировали один комплексный ответ.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2016, 12:38
Ответы с готовыми решениями:

Двойной проход по IEnumerable
В общем на практике довольно часто приходится бить кол-ции на равные блоки, а...

Как использовать значения, возвращаемые IEnumerable
Здравствуйте. Ситуация следующая (программа просто для того, что бы...

System.Collections.IEnumerable; как его подключить?
int badhands ;//: System.Collections.IEnumerable; badhands =new...

Ошибка в логике реализации методов интерфейсов IEnumerator, IEnumerable
Здраствуйте. Програмирую на С# недавно. На данный момент изучаю книгу "C# и...

Переменная типа IEnumerable. Как в subset сохраняются данные?
string currentVideoGames = { "Morrowind","Uncharted 2","Fallout...

3
skilllab
211 / 185 / 50
Регистрация: 03.02.2011
Сообщений: 1,781
Записей в блоге: 1
Завершенные тесты: 1
31.08.2016, 12:56 2
Лучший ответ Сообщение было отмечено BadCats как решение

Решение

Цитата Сообщение от BadCats Посмотреть сообщение
[ComVisible(true)]
Скорее всего значит то, что его может унаследовать объект COM - тот же ActiveX или любой другой объект неуправляемой памяти (лист с эксэльками, лист со вкладками из адоба к примеру)

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

Добавлено через 31 секунду
Цитата Сообщение от BadCats Посмотреть сообщение
COM - это что вообще ?
https://ru.wikipedia.org/wiki/Component_Object_Model

Добавлено через 51 секунду
Цитата Сообщение от BadCats Посмотреть сообщение
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
Эта штука нужна для идентификации в системе. Штука обязательная как раз для COM объектов.
Другими словами и по американски
Interfaces are strongly typed. Every interface has its own unique interface identifier, named an IID, which eliminates collisions that could occur with human-readable names. The IID is a globally unique identifier (GUID), which is the same as the Universally Unique ID (UUID) defined by the Open Software Foundation (OSF) Distributed Computing Environment (DCE). When you create a new interface, you must create a new identifier for that interface. When a caller uses an interface, it must use the unique identifier. This explicit identification improves robustness by eliminating naming conflicts that would result in run-time failure.
ТУТ

Добавлено через 11 минут
Цитата Сообщение от BadCats Посмотреть сообщение
Interop
Оно же враппер (wrapper)
https://ru.wikipedia.org/wiki/COM_Interop
1
BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 109
31.08.2016, 13:12  [ТС] 3
Далее:
C#
1
 [DispId(-4)]
Опять же, оределение Visual Studio
** class System.Runtime.InteropServices.DispldAttribute
Задает идентификатор диспетчирезации COM(DISPID) для метода, поля или свойства. **
  • идентификатор диспетчирезации COM(DISPID) - что!?
  • диспетчирезация COM - ?
  • DISPID - ?
И значит захожу я в этот
C#
1
 [DispId(-4)]
А там вот такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public sealed class DispIdAttribute : Attribute
    {
        // Сводка:
        //     Инициализирует новый экземпляр класса DispIdAttribute, используя указанный
        //     идентификатор DISPID.
        //
        // Параметры:
        //   dispId:
        //     Идентификатор DISPID для этого члена.
        public DispIdAttribute(int dispId);
 
        // Сводка:
        //     Возвращает идентификатор DISPID для члена.
        //
        // Возвращает:
        //     Идентификатор DISPID для этого члена.
        public int Value { get; }
    }
и как я понял, этот
C#
1
 [DispId(-4)]
- это конструктор класса DispIdAttribute ?
0
skilllab
211 / 185 / 50
Регистрация: 03.02.2011
Сообщений: 1,781
Записей в блоге: 1
Завершенные тесты: 1
31.08.2016, 13:35 4
Лучший ответ Сообщение было отмечено BadCats как решение

Решение

Цитата Сообщение от BadCats Посмотреть сообщение
DISPID - ?
Тупо идентификатор. Используется в неуправляемых сборках. Для NET является избыточным.
IDispatch = Как и любой обычный интерфейс, он реализован с помощью виртуальной таблицы указателей на методы. VMT интерфейса IDispatch начинается с трех хорошо известных методов IUnknown, за которыми следуют методы GetlDsOfNames, GetTypelnfo, GetTypelnfoCount и Invoke.
• Invoke (метод времени выполнения) — используется для вызова других методов Чтобы это было возможным, разработчик объекта, реализующего IDispatch должен определить, какие в точности методы будут доступны. Это достигается определением дополнительного диспетчерского интерфейса (dispatch interface), часто называемого диспинтерфейсом (dispinterface). Для его реализации VMT не используется. Каждому методу диспинтерфейса ставится в соответствие целое число — диспетчерский идентификатор (Dispatch IDentifier — DispID), no которому и производится вызов. Фактически реализация объектом метода Invoke является большим оператором Case.
Цитата Сообщение от BadCats Посмотреть сообщение
поверьте, мне нужно все.
Вот прям точно всё?
Вы собрались писать свой COM сервер на C#?

Добавлено через 2 минуты
Ещё про IDispatch
Запомните, что вам нужно понимать, что означают вещи в контексте вопроса. К примеру, у интерфейса IActiveMovie3 есть метод get_MediaPlayer. Если вы посмотрите на этот метод в сферическом вакууме (без принятия во внимание контекста), то вы будете ожидать, что метод вернёт вам интерфейс IMediaPlayer, но в заголовочнике вы увидите, что вместо этого метод возвращает интерфейс IDispatch. Если вы посмотрите на общую картину, то вы увидите, почему это имеет смысл.

IActiveMovie3 - это Dispatch интерфейс. Как вы знаете, целевой аудиторией для интерфейсов IDispatch являются скриптовые языки, вроде Visual Basic и JScript. Классический Visual Basic является языком с динамической типизацией, что означает, что практически все типы данных являются просто "объектами", а их точный тип не известен до момента выполнения скрипта. Статически-типизированный язык (вроде Delphi - прим.пер.) пожалуется вам ещё на этапе компиляции, если вы вызовете несуществующий метод у объекта или передадите параметр не того типа в метод. А динамически-типизированный язык, с другой стороны, не проверяет всё это, пока строка кода не будет выполнена - вот только в этот момент будет произведена проверка, существует ли метод и правильно ли вы указали параметры.

Когда вы работаете с интерфейсами и языками с динамической типизацией, то естественной "валютой" становится IDispatch. Все объекты принимают форму IDispatch. Объекты, которые порождают другие объекты, будут возвращать интерфейсы IDispatch, потому что именно их ожидает увидеть скриптовый движок.

Вот почему метод get_MediaPlayer возвращает IDispatch. Потому что это то, что ожидает скриптовый движок. И то, что, если вы знакомы с контекстом вопроса, ожидаете вы.

Сигнальный знак этого контекста происходит от названия метода "get_MediaPlayer". Это название не соответствует соглашению наименования COM, а, скорее, имя построено так для его binding-а в C/C++ на свойство "get". C/C++ binding - это "ассемблерный язык" автоматизации OLE: вы работаете с гайками и болтами OLE Automation, и если вы хотите играть на этом уровне, то вы должны знать, как использовать отвертку.
То же но на американском
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2016, 13:35

Какой IEnumerable<T> лучше использовать для быстрого удаления элементов
Может кто-нибудь подсказать вид коллекции, которая позволяет быстро удалять...

Баги при сравнении текущего елемента IEnumerable с последним Last(), LastOrDefault
Дорого вечера уважаемые знатоки Кто мне объяснит почему при сравнении...

IEnumerable, foreach, LINQ, отложенное выполнение, передача параметров и возврат результата
Всем доброго времени суток) Недавно осознал, что я не так уж хорошо знаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru