Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архитектура System.Collections, и наследование интерфейсов 
:(
    Опции темы
Madferit
Дата 4.11.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 11.7.2005
Где: Запорожье

Репутация: 1
Всего: 1



Смутил один момент:

Интерфейс IList наследует интерфейсы ICollection и IEnumerable. Хотя ICollection уже наследует IEnumerable.

Тоже самое с IDictionary - он тоже наследует и ICollection, и IEnumerable.

Тоже самое с интерфейсами в System.Collections.Generic.

Насколько я понимаю интерфейсы в .NET, наследовать ICollection было бы достаточно, а наследование IEnumerable уже избыточно. 

Тогда c какой целью явно указывается IEnumerable в предках? Для пущей ясности?
PM MAIL   Вверх
stab
Дата 4.11.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
tol05
Дата 4.11.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



smile Нет. Это делается для того, чтобы можно было в наследуемом классе явно реализовать интерфейс и обращаться к методам класса через ссылку на интерфейс.
Пример
Код

interface IMyInterface
{
    void InterfaceFunc(){}
}

class Base : IMyInterface
{
    public void MySimpleFunc(){}
   
    public void IMyInterface.InterfaceFunc(){}
}

class Inherited : Base
{
//Метод Base.MySimpleFunc() наследуется, а IMyInterface.InterfaceFunc() - нет
//Но тогда во внешнем коде можно использовать 
//Base b = new Base();
//((IMyInterface)b).InterfaceFunc();
//Но нельзя 
//Inherited i = new Inherited();
//((IMyInterface)i).InterfaceFunc();
}


Дело в том, что методы с явной реализацией не наследуется и в каждом дочернем классе нужно опять наследоваться от одного и того же интерфейса и снова и снова переопределять методы. Вот так работает:
Код

class Inherited : Base, IMyInterface
{
    public void IMyInterface.InterfaceFunc(){}
}

теперь будет работать
Код

Inherited i = new Inherited();
((IMyInterface)i).InterfaceFunc();


Рихтер, "наследование интерфейсов":
Цитата

Компилятор С# требует, чтобы метод, реализующий интерфейс, отмечался модификатором public. CLR требует, чтобы методы интерфейса были виртуальными. Если метод явно не определен в коде как виртуальный, компилятор сделает его таковым и, вдобавок, изолированным. Это не позволяет производному классу переопределять методы интерфейса. Если явно задать метод как виртуальный, компилятор сделает его таковым и оставит неизолированным, что предоставит производному классу возможность переопределять методы интерфейса. 
Производный класс не в состоянии переопределять методы интерфейса, объявленные изолированными, но может повторно унаследовать тот же интерфейс и предоставить собственную реализацию его методов. При вызове метода интерфейса объекта вызывается реализация, связанная с типом самого объекта. 



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 4.11.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



tol05
твой пример с классами - тут вопросов нет, все чинно с явной реализацией методов интерфейсов...

а вопрос-то в другом...
зачем при реализации IList явно прописывать наследование и от ICollection и от IEnumerable, ведь ICollection уже наследует IEnumerable...тут суть не в классах, а в самих интерфейсах...

лично мне это тоже не совсем понятно зачем так делают
PM MAIL ICQ   Вверх
tol05
Дата 4.11.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



да по тем же причинам.
Я же писал: реализация интерфейса наследнику не передается
допустим
Код

interface IMyInterface
    {
        void F1();
        void F2();
    }

    interface IMyTwoInterface : IMyInterface
    {
    }

    interface IMyThreeInterface : IMyTwoInterface
    {
    }

так можно
Код

class MyClass : IMyThreeInterface
    {
        void IMyInterface.F1() {}

        void IMyInterface.F2() {}
    }

так нельзя
Код

class MyClass : IMyTwoInterface
{
    void IMyThreeInterface.F1()
    {
    }

    void IMyThreeInterface.F2()
    {
    }
}

а если в каком-нибудь промежуточном интерфейсе повторить наследование, то
Код

interface IMyInterface
    {
        void F1();
        void F2();
    }

    interface IMyTwoInterface : IMyInterface
    {
    }

    interface IMyThreeInterface : IMyTwoInterface, IMyInterface
    {
        new void IMyInterface.F1();
    }

    class MyClass : IMyThreeInterface
    {
        void IMyThreeInterface.F1() { }

        void IMyInterface.F1() {}

        void IMyInterface.F2() {}
    }

видно, как показал реальный юзинг интерфейсов, иногда нужно F1() вызывать через ссылку на базовый интерфейс, а иногда - через ссылку на производный. 
В зависимости от того, к ссылке какого интерфейса в реальном коде приводится объект, будет зависеть интерфейс доступа у объекту (с любом случае ведь работа будет с объектом, а не с декларацией его возможностей), ну и сами функциональные возможности. 

Это сообщение отредактировал(а) tol05 - 4.11.2007, 22:02


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 4.11.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



Код

public class ClassX : IFace3
    {
        void IFace3.Action3()
        {
            Console.WriteLine("IFace3.Action3");
        }

        void IFace2.Action2()
        {
            Console.WriteLine("IFace2.Action2");
        }

        void IFace1.Action1()
        {
            Console.WriteLine("IFace1.Action1");
        }
    }
    public interface IFace1
    {
        void Action1();
    }
    public interface IFace2 : IFace1
    {
        void Action2();
    }
    public interface IFace3 : IFace2
    {
        void Action3();
    }

    public class Program
    {
        public static void Main()
        {
            IFace3 a = new ClassX();
            a.Action1();
            a.Action2();
            a.Action3();
            Console.ReadLine();
        }
    }



согласно твоей логике так делать нельзя???

или мы опять недопоняли друг друга??  smile 

может вопрос по разному поняли....хм..но ведь в реализации ArrayList никаких явных методов интерфейсов нет, если верить перехоту по "Go to definition"


Это сообщение отредактировал(а) 0000 - 4.11.2007, 22:38
PM MAIL ICQ   Вверх
0000
Дата 4.11.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



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

но...
в IList и ICollection вроде нет одинаковых
PM MAIL ICQ   Вверх
stab
Дата 5.11.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(tol05 @  5.11.2007,  02:01 Найти цитируемый пост)
 new void IMyInterface.F1();

'IMyInterface.F1': explicit interface declaration can only be declared in a class or struct, что вполне логично, т.к. new задаёт новую реализацию, а не новый интерфейс. интерфейс не может специфицировать необходимость реализации одного и тоже интерфейса более одного раза. в этом  просто нет смысла, интерфейс в каждом конкретном типе всегда имеет только одну реализацию.

Цитата(tol05 @  5.11.2007,  02:01 Найти цитируемый пост)
Я же писал: реализация интерфейса наследнику не передается

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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
tol05
Дата 5.11.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



я имел в виду явную реализацию интерфейса.
так нельзя
Код

    class D : IA
    {
        void IA.A()
        {
            
        }
    }

    class F : D
    {
        void IA.A()
        {
            base.A();
        }

        void A()
        {
            base.A();
        }
    }

так можно
Код

    class D : IA
    {
        public void A()
        {
            
        }
    }

    class F : D
    {
        public void A()
        {
            base.A();
        }
    }


а по поводу нескольких реализаций в одном типе... тут тонкий момент smile 
работа interface mapping :
Код

class D : IA
    {
        public void A()
        {
            Console.WriteLine("A()");
        }

        //void IA.A()
        //{
        //    Console.WriteLine("IA.A()");
        //}
    }

...

D d = new D();

d.A();

IA a = d;
a.A();

запускаем и получаем 
Код

A()
A()

раскомментируем, запускаем и получаем
Код

A()
IA.A()

т.е. оба метода, в принципе, являются реализацией интерфейса. Мы меняем сопоставление реализации с интерфейсом. И имеем две реализации одного и того же интерфейса.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 5.11.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



явная реализация интерфейса не передается в наследовании от класса к классу..но ведь если твой IA унаследовать от скажем IB, а тот от IC, то в классе D ты сможешь выполнить явную реализацию всех методов из всех трех интерфейсов...не обязательно при этом явно прописывая наследоание IA от IC..
PM MAIL ICQ   Вверх
Jlekc
Дата 5.11.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: 1
Всего: 4



Явная реализация интерфейсов, хмм.
Разговор начился с интерфейса IList, если посмотреть где он используеться - ArrayList например. 
При наследовании IList, также наследуеться и вся цепочка интерфейсов: ICollection, IEnumerable.
И почему-то невидно никакой явной реализации интерфейсов.

Похоже это замечание было самым верным
Цитата(stab @  4.11.2007,  14:26 Найти цитируемый пост)
для повышения выразительность - единственное что приходит в голову


Добавлено через 14 минут и 51 секунду
ЗЫ: Прошолся по сборке генератором доков Sandcastle.
В сборке два класса - один наследует IList, второй IList и всю цепочку его интерфейсов.
Как и ожидалось в хелпаке для первого класса видно только IList, для второго все интерфейсы.


--------------------
PM MAIL ICQ   Вверх
0000
Дата 5.11.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



Цитата(Jlekc @ 5.11.2007,  12:33)
Явная реализация интерфейсов, хмм.
Разговор начился с интерфейса IList, если посмотреть где он используеться - ArrayList например. 
При наследовании IList, также наследуеться и вся цепочка интерфейсов: ICollection, IEnumerable.
И почему-то невидно никакой явной реализации интерфейсов.

Похоже это замечание было самым верным
Цитата(stab @  4.11.2007,  14:26 Найти цитируемый пост)
для повышения выразительность - единственное что приходит в голову

вот я про то же и говорил, что при желании явно реализовать методы из IEnumerable можно, явно не наследуя..
PM MAIL ICQ   Вверх
tol05
Дата 5.11.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



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

Одним словом, написал в этом топике много, да большей частью, не по теме smile



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 6.11.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



народ..кажется разобрался я с этим вопросом..все выходные он меня мучал и тут прозвучала гениальная идея от одного чела - чтобы было быстрее!!!..начал копаться..
оператор foreach работает так, что в коллекции, для которой он вызывается должен содержаться метод 
Код

public IEnumerator GetEnumerator() 
{
    return ля-ля
}


так вот, самый медленный вариант - это просто когда компилятор получит список методов для нашей коллекции...самый быстрый, проверить, а не реализовывает ли наша коллекция интерфейс IEnumerable.. так вот если явно имплементировать IEnumerable, доступ к элементам колекции через foreach будет быстрее...а поскольку этот оператор используется очень часто для коллекций - вполне актуально, мто разработчики FCL вынесли явное наследование от IEnumerable...




Это сообщение отредактировал(а) 0000 - 6.11.2007, 12:16
PM MAIL ICQ   Вверх
tol05
Дата 6.11.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Поскольку любая коллекция содержит в себе массив, то для скорости было бы логичнее, чтобы каждая коллекция предоставляла открытое свойство типа Array. Но это огромная дыра в защите кода. Дырище просто... Поэтому IEnumerable используется для защищенности коллекции а не для скорости.

А во-вторых... Поскольку я влез в тему с агресивными опровержениями smile то для меня было делом чести протестить все варианты. Даже надуманные. И должен сказать, что где бы ни было заявлено наследование интерфейса (не в иерархии классов, реализующих интерфейс, а именно в иерархии наследования интерфейсов), доступ к этому интерфейсу одинаков...

А по поводу ре-имплементации интерфейса в иерархии наследования интерфейсов - ни ECMA, ни MVP с "русско-неговорящих" сайтов - никто ничего не говорит. А некоторые (и я в их числе  smile) - так и говорят: не знаем.


вот так вот-с smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 6.11.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



Цитата(tol05 @ 6.11.2007,  12:42)
Поскольку любая коллекция содержит в себе массив, то для скорости было бы логичнее, чтобы каждая коллекция предоставляла открытое свойство типа Array. Но это огромная дыра в защите кода. Дырище просто... Поэтому IEnumerable используется для защищенности коллекции а не для скорости.

а почему не может быть и для того, и для другого?
к тому же если бы речь шла только о защищенности легче было бы не делать foreach вовсе и оставить лишь оператор for для индексации


мож Гейтсу письмо написать - "Билл, зачем???"

Это сообщение отредактировал(а) 0000 - 6.11.2007, 13:03
PM MAIL ICQ   Вверх
tol05
Дата 6.11.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(0000 @  6.11.2007,  12:02 Найти цитируемый пост)
если бы речь шла только о защищенности легче было бы не делать foreach вовсе и оставить лишь оператор for для индексации

если код не подвергается риску, то так и делается. Используется for (внутри методов класса, для локальных или закрытых коллекций). Даже больше скажу: for не потерял актуальности, даже наоборот... Раньше в for можно было только через Array.Lenght работать, теперь  (для коллекций) специально введено свойтсво Count.
Зачем оно, если нужно работать только через foreach ?

Если же коллекция предоставляется наружу, то нужно максимально защитить и ее содержимое и содержимое всего объекта, содержащего коллекцию. ReadOnly не спасает. Get Property - не спасает. IEnumerator - спасает.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 6.11.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



фактически получается, что IEnumerator повяился для того, чтобы можно было пользоваться оператором foreach..
но тут суть-то в том, что IList явно наследует IEnumerator..если бы дело было только в надежности достаточно было бы того, что ICollection уже наследует IEnumerator и в IList лишний раз прописывать это наследование было бы не нужно
PM MAIL ICQ   Вверх
stab
Дата 6.11.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(tol05 @  6.11.2007,  16:42 Найти цитируемый пост)
ни MVP с "русско-неговорящих" сайтов - никто ничего не говорит


если не секрет, что за сайты? интересно было бы почитать дискуссию.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Jlekc
Дата 6.11.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: 1
Всего: 4





--------------------
PM MAIL ICQ   Вверх
0000
Дата 6.11.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



то есть получается для более быстрой компиляции?
PM MAIL ICQ   Вверх
Jlekc
Дата 6.11.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: 1
Всего: 4



мож попробывать, а ваще загадка М$


--------------------
PM MAIL ICQ   Вверх
0000
Дата 6.11.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



но все равно непонятно..ну даже если получаем мы список интерфейсов, но ведь для полного списка нам все равно нужно проверить ICollection, чтобы взять его интерфейсы..мож там еще и другие есть


PM MAIL ICQ   Вверх
stab
Дата 6.11.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Jlekc, понятно, похоже вопрос снят, это просто путаница при анализе метаданных. В аттаче один и тот же код, просматриваемый как проект и как внешняя сборка.

Код

public interface I1
{
}

public interface I2: I1
{
}

public interface I3: I2
{
}

public interface I4: I1, I2
{
}




Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ifaces.png 4,71 Kb


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
0000
Дата 6.11.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



имхо это лишь ответ на то, что происходит, но не на вопрос - ПОЧЕМУ ТАК?
PM MAIL ICQ   Вверх
tol05
Дата 6.11.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(stab @  6.11.2007,  14:37 Найти цитируемый пост)
если не секрет, что за сайты? интересно было бы почитать дискуссию.

да нет, не скерет. самая известная публикация после ECMA334 smile
или поиск по гуглу с ключом "re-implementation interface"
Только в том-то и дело, что не пишут... С классами - всем все давно понятно. Interface Mapping работает...

Jlekc, почитал... "для пущей понятности" и "для повышения быстродействия - уменьшения рефлексии" и т.п. ... как-то неубедительно. Если б я не знал как часто используется рефлекссия (практически везде) ... может быть и поверил бы. Но тогда с .Net на плюсы обратно переходить надо, если уж ТАК о быстродействии заботятся...

По поводу аттача - MSIL отличается, это в той ссылке, что я кидаю. упоминается.



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Jlekc
Дата 6.11.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: 1
Всего: 4



Цитата(tol05 @  6.11.2007,  16:56 Найти цитируемый пост)
Jlekc, почитал... "для пущей понятности" и "для повышения быстродействия - уменьшения рефлексии" и т.п. ... как-то неубедительно.

Да тоже не убидили, но другое напровление обсуждения. Решил последить за развитием, и тут запостил если кому интересно


--------------------
PM MAIL ICQ   Вверх
stab
Дата 6.11.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
0000
Дата 6.11.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



но ведь насколько я понимаю, метаданные должны представлять наиболее полное описание сборки.. какое-то несоответствие получается того, что относится к метаданным и того, как представляется в проекте...
PM MAIL ICQ   Вверх
stab
Дата 6.11.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(tol05 @  6.11.2007,  20:56 Найти цитируемый пост)
да нет, не скерет. самая известная публикация после ECMA334


это явный баг в jit-компиляторе, т.к. il-код валидный в обоих случаях, там вроде пишут, что уже поправили. вопрос в том, зачем это было делать таким запутанным, что даже стандарт ответа не может дать однозначного. здравствуй дядя Вирт со своим Обероном smile

Добавлено @ 17:27
0000, чёрт его знает, если задуматься, то из метаданных эту информацию можно вытянуть, например в рефлекторе всё нормально показывается. но, насколько я понимаю, это не будет однозначным ответом.

может быть это просто недочёт стандартного просмоторщика объектов студии.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.