Pull to refresh
11
0

Пользователь

Send message
Reference Source уже как несколько лет существует. Также есть .NET Core RC1.
На reddit сотрудники пишут, что как минимум будет поддержка Linux.
На третий фрагмент мой решарпер говорит «Similar expressions comparison». Версия 9.2.
Андрей, а будет ли сравнение с R#? Понимаю, на данном этапе разработки (как вы говорите это даже не beta) может быть неуместным. Но к моменту релиза такое сравнение — must have.
Может привести хоть какой-то практический пример когда нужно вызвать метод у совершенно произвольного объекта?
Разумеется нормальный разработчик такой хренью страдать и не будет. Он одумается намного раньше.
Нет, в Java можно ещё использовать кодегенерацию на лету, для отдельного объекта это дольше, но для огромного потока разных объектов — быстрее.
Не знаю как в Java, но в C# такой способ так или иначе сводится к рефлексии, ведь нам нужно достать MethodInfo в качестве операнда для инструкции callvirt.
Они то здесь причем? И как их добавить в уже готовый бинарник?
А нормальный способ это создать общий интерфейс
Общий интерфейс мы можем сделать только для своего кода. В случае third-party бинарников или даже поделки коллег из соседнего отдела нужно или очень настойчиво попросить об этом автора или ildasm.

Чем она вас не устраивает?
Небольшая вырезка из моего предыдущего комментария:
Единственный способ вызвать метод Execute() у совершенно произвольного объекта — использовать рефлексию. Для обычных CLR объектов (которые не являются ExpandoObject) dynamic в конечном итоге приводит к рефлексии.
И только так. Если Borz считает иначе, пусть приведет пример. Для совершенно произвольного объекта, разумеется. Хоть буду знать, заслуженно ли я получил достаточно минусов (и в карму в том числе) за свою попытку проиллюстрировать его слова, или нет…
Нету же никакого IExecutable.
В статическом языке контракты просто прописаны явно (по правилу явное всегда лучше неявного).
Да, я про это и говорю. Нам нужно явно привести объект к необходимому типу. Но для этого нужно знать тип. Да, если операторы is/instanceOf в C#/Java, но они лишь позволяют проверить на объект на соответствие определенному типу (который мы опять же указываем явно). Единственный способ вызвать метод Execute() у совершенно произвольного объекта — использовать рефлексию. Для обычных CLR объектов (которые не являются ExpandoObject) dynamic в конечном итоге приводит к рефлексии.

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

Да, я про это и говорю. Нам нужно явно привести объект к необходимому типу. Но для этого нужно знать тип. Да, если операторы is/instanceOf в C#/Java, но они лишь позволяют проверить на объект на соответствие определенному типу (который мы опять же указываем явно). Единственный способ вызвать метод Execute() у совершенно произвольного объекта — использовать рефлексию. Для обычных CLR объектов (которые не являются ExpandoObject) dynamic в конечном итоге приводит к рефлексии.

Честно говоря я не понимаю, почему у кого-то сложилось впечатление (судя по минусам не у вас одного) о том, что я сторонник динамической типизации. Нет-нет, я как раз таки всеми руками за статическую типизацию, собственно по тем же причинам, которые вы указали в P.S.
Не понимаю при чем здесь сигнатуры, и как они вообще связаны с динамической типизацией. Судя по вашей ссылке, это те же самые интерфейсы, только с утиной статической типизацией. Ну а шаблоны в C++ появились еще раньше сигнатур.

В то же время dynamic — это такой же ассоциативный массив, как например объекты в JS. Та что сравнение совершенно неуместно.

Но в любом случае я так и не понял к чему вы написали этот комментарий, без обид :) Я рассуждал о том, что «приведение к Object никак не может заменить динамическую типизацию».
Так и есть. В результате, мы всегда приходим к явно прописанному контракту, и в конечном итоге получаем криво-использованную-статическую-типизацию. Так что такое нельзя назвать заменой динамической типизации. А вот, например, dynamic в C# — можно.
Совершенно разные интерфейсы могут иметь методы\поля с одинаковым названием. Этих самых интерфейсов может быть бесчисленное множество + пользователь может создавать свои.

Похоже не все понимают о чем идет речь, приведу пример. Пусть у нас есть 2 интерфейса:
interface IProgram
{
    void Execute();
}

interface IAction
{
    void Execute();
}

Если делать так, как предлагаете вы, то в конечном итоге мы просто будем пытаться одурачить статическую типизацию жуткой пеленой if'ов:
void Foo(object obj)
{
    if (obj is IProgram)
    {
        var program = (IProgram) obj;
        program.Execute();
    }
    else if (obj is IAction)
    {
        var action = (IAction) obj;
        action.Execute();
    }
    else ... // и т.д. 1000 раз для всех остальных интерфейсов с методом Execute()
}

А если програмист написал еще один интерфейс:
interface IPrisoner
{
    void Execute();
}

IPrisoner prisoner = ...;
Foo(prisoner); // ???

Динамической типизации абсолютно по барабану какой интерфейс у объекта, важно лишь то, что объект должен иметь метод\делегат\функтор\whatever Execute().
void Foo(dynamic obj)
{
    obj.Execute();
}
И как мы узнаем к какому именно интерфейсу приводить?
А как из этого Object вытащить данные\вызвать метод? Без рефлексии, разумеется.
Хрень какая-то.
Как-будто в 2010 вернулся
С opensource проще. Маркетологи над душой не стоят.

Каждый раз, когда кто-то путает free software с open source, в мире начинает плакать еще один Столлман…
Как всегда, я решил, что в Яндексе найдётся всё, но не тут то было — в интернете (вернее в РУнете) вообще ничего о DataGrid нет.

Все о DataGrid, без «прочтения двух-трех толстых книжек».
С появлением «гамбургера» в WP10 таких элементов стало на порядок больше.

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Registered
Activity