Здравствуйте, VladD2, Вы писали:
VD>Извини, но это глупость. Они в принципе разные! У них только синтаксис похож. Попробуй передать свойство по ссылке.
И это плохо, что нельзя.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, VladD2, Вы писали:
VD>>Извини, но это глупость. Они в принципе разные! У них только синтаксис похож. Попробуй передать свойство по ссылке. GZ>И это плохо, что нельзя.
Учитывая что свойство это в сущности обычный метод, что ты в данном случае понимаешь под передачей метода по ссылке? Нечто подобное в принципе предоставляет delegate
Re[9]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Учитывая что свойство это в сущности обычный метод, что ты в данном случае понимаешь под передачей метода по ссылке? Нечто подобное в принципе предоставляет delegate
Обычный метод? И как его вызвать без рефлекшона простому индийцу?
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
ВВ>>Учитывая что свойство это в сущности обычный метод, что ты в данном случае понимаешь под передачей метода по ссылке? Нечто подобное в принципе предоставляет delegate GZ>Обычный метод? И как его вызвать без рефлекшона простому индийцу?
Ну а во вторых, сами делегаты штука неудобная и нудная. Лямбды не зря начали вводить.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали: GZ>Обычный метод? И как его вызвать без рефлекшона простому индийцу?
Тот факт, что компилятор скрывает от нас его, еще не делает метод необычным Скажем, если объявить на MC++ свойство с параметрами, то из С# его можно (и нужно) будет вызывать через set_XXX.
То, о чем говорит, Василий -- в код, работающий с ссылками (т.е. с managed pointerами в терминологии MSIL), нельзя передать свойство -- по крайней мере в текущей реализации виртуальной машины.
Можно, конечно, пойти на хитрость -- если передача свойства по ссылке происходит, то завести локальную переменную, скопировать туда значение, вызвать метод, а потом вызвать setter. Но это путь очень опасный, т.к. свойства могут иметь весьма нетривиальные зависимости между собой.
Re[10]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Mab, Вы писали:
GZ>>Обычный метод? И как его вызвать без рефлекшона простому индийцу? Mab>Тот факт, что компилятор скрывает от нас его, еще не делает метод необычным Скажем, если объявить на MC++ свойство с параметрами, то из С# его можно (и нужно) будет вызывать через set_XXX.
Ага. А операции в VB через реализовывать через op. Одно дело язык, другое подпорки.
Mab>То, о чем говорит, Василий -- в код, работающий с ссылками (т.е. с managed pointerами в терминологии MSIL), нельзя передать свойство -- по крайней мере в текущей реализации виртуальной машины.
Да все можно Вопрос насколько хакерские методы будут использоваться. Делегаты и рефлекшон ведь действительно хаком не назовешь.
Недавно сделал вывод, если ты встретил то чего нельзя сделать, значит ты плохо знаешь namespace Emit.
Mab>Можно, конечно, пойти на хитрость -- если передача свойства по ссылке происходит, то завести локальную переменную, скопировать туда значение, вызвать метод, а потом вызвать setter. Но это путь очень опасный, т.к. свойства могут иметь весьма нетривиальные зависимости между собой.
Я вообще-то в действительности имел ввиду именно указатель на функцию как функциональный тип. То есть взял ссылку на свойство или метод, и присвоил куда-то. А вот в это куда-то уже думают что с этим делать. С делегатами получается еще та песня. Ну жутко неудобно и тормозно.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Воронков Василий, Вы писали:
GZ>>Обычный метод? И как его вызвать без рефлекшона простому индийцу?
ВВ>Delegate.CreateDelegate — надеюсь простой индус догадается реальное название метода указать?
Обломс. Думал что он затрагивает рефлекшон. Ан нет. Хотя и проверки нехилые при создании но работает не через reflection.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: Хорошо ли, что свойство нельзя передать по ссылке
GZ>Да все можно
Как именно?
GZ>Вопрос насколько хакерские методы будут использоваться. Делегаты и рефлекшон ведь действительно хаком не назовешь. GZ>Недавно сделал вывод, если ты встретил то чего нельзя сделать, значит ты плохо знаешь namespace Emit.
Боюсь, одним эмитом тут не обойтись. Придется как минимум изучать IL-код существующих методов, получающих ссылки, и генерировать новый, работающий со свойством. В общем, ерунда какая-то.
Mab>>Можно, конечно, пойти на хитрость -- если передача свойства по ссылке происходит, то завести локальную переменную, скопировать туда значение, вызвать метод, а потом вызвать setter. Но это путь очень опасный, т.к. свойства могут иметь весьма нетривиальные зависимости между собой. GZ>Я вообще-то в действительности имел ввиду именно указатель на функцию как функциональный тип. То есть взял ссылку на свойство или метод, и присвоил куда-то. А вот в это куда-то уже думают что с этим делать. С делегатами получается еще та песня. Ну жутко неудобно и тормозно.
1. Не очень понял, чем именно делегаты не устроили. То, что нельзя напрямую создать делегат для сеттера -- это ограничение C#, а никак не платформы.
2. Скорость вызова делегата по порядку величины сопоставима с вызовом виртуального метода. Не слишком быстро, но жить можно.
Здравствуйте, GlebZ, Вы писали:
VD>>Извини, но это глупость. Они в принципе разные! У них только синтаксис похож. Попробуй передать свойство по ссылке. GZ>И это плохо, что нельзя.
Курите ООП и инкапсуляцию, сударь.
Понимаеш ли, если передать ссылку на поле объекта, то ты уже не сможешь гарантировать, что состояние твоего объекта не будет нарушено внешними действями.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, GlebZ, Вы писали:
GZ>Ну а во вторых, сами делегаты штука неудобная и нудная. Лямбды не зря начали вводить.
Если бы ты еще за одно разобрался что такое лямбды и как они капеллируют с делегатами, то не говорил бы таких глупостей.
Лямбды это замена действительно избыточному синтаксису анонимных методов, а делегаты это то через что ссылку на этот самый анонимный метод (лямду или на обычный метод) можно передать в функцию или поместить в поле.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Mab, Вы писали:
Mab>Можно, конечно, пойти на хитрость -- если передача свойства по ссылке происходит, то завести локальную переменную, скопировать туда значение, вызвать метод, а потом вызвать setter. Но это путь очень опасный, т.к. свойства могут иметь весьма нетривиальные зависимости между собой.
И это правильно, так как не нарушет инкамсуляции объекта. Точно так же правильно пользоваться делегатами для установки или считывания свойств, так как это тоже не нарушает инкапусляции. А вот передавать ссылки на поля — это грубейшее нарушение инкапсуляции и слава богу, что его в дотнете нет.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, GlebZ, Вы писали:
ВВ>>Delegate.CreateDelegate — надеюсь простой индус догадается реальное название метода указать? GZ>Обломс. Думал что он затрагивает рефлекшон. Ан нет. Хотя и проверки нехилые при создании но работает не через reflection.
Чуть-чуть захватывает. На время создания делегата. Но дальше получается прямой делегат приводящий к вазову сеттера или геттера свойства. Так что проблем с производительностью тут не будет.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>>>Извини, но это глупость. Они в принципе разные! У них только синтаксис похож. Попробуй передать свойство по ссылке. GZ>>И это плохо, что нельзя.
VD>Курити ООП и инкапсуляцию, сударь.
VD>Понимаеш ли, если передать ссылку на поле объекта, то ты уже не сможешь гарантировать, что состояние твоего объекта не будет нарушено внешними действями.
Внимательнее Влад. Здесь подразумевается свойство, то есть проперть. Никакого нарушения
Здравствуйте, VladD2, Вы писали:
GZ>>Ну а во вторых, сами делегаты штука неудобная и нудная. Лямбды не зря начали вводить. VD>Если бы ты еще за одно разобрался что такое лямбды и как они капеллируют с делегатами, то не говорил бы таких глупостей.
В терминах языка. Есть лямбда. Есть делегат. Есть анонимный метод.
VD>Лямбды это замена действительно избыточному синтаксису анонимных методов, а делегаты это то через что ссылку на этот самый анонимный метод (лямду или на обычный метод) можно передать в функцию или поместить в поле.
Именно это я и имел ввиду. Синтаксис делегатов(не анонимов и не лямбд) мне кажется слишком сложным а эффективность не очень.
Здравствуйте, GlebZ, Вы писали:
GZ>Именно это я и имел ввиду. Синтаксис делегатов(не анонимов и не лямбд) мне кажется слишком сложным а эффективность не очень.
Вот-вот, и как раз напрашивается риторический вопрос: почему делегаты не стали распространённым явлением в программах на C++.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
Mab>>Можно, конечно, пойти на хитрость -- если передача свойства по ссылке происходит, то завести локальную переменную, скопировать туда значение, вызвать метод, а потом вызвать setter. Но это путь очень опасный, т.к. свойства могут иметь весьма нетривиальные зависимости между собой.
VD>И это правильно, так как не нарушет инкамсуляции объекта. [...] А вот передавать ссылки на поля — это грубейшее нарушение инкапсуляции [...]
Это правильно только в том случае, если речь идёт о закрытых полях. Нарушение же инкапсуляции состоит в самом по себе открытии поля объекта, неуместном открытии, разумеется.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Mab, Вы писали:
Mab>1. Не очень понял, чем именно делегаты не устроили. То, что нельзя напрямую создать делегат для сеттера -- это ограничение C#, а никак не платформы.
На заголовок посмотри. Mab>2. Скорость вызова делегата по порядку величины сопоставима с вызовом виртуального метода. Не слишком быстро, но жить можно.
Виртуальный метод быстрее. Хотя бы потому что он зачастую оптимизируется в простой(в отличие от того же делегата). Делегат в алгоритм с высокой повторяемостью помещать надо с опаской.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, GlebZ, Вы писали:
GZ>>Ну а во вторых, сами делегаты штука неудобная и нудная. Лямбды не зря начали вводить.
VD>Если бы ты еще за одно разобрался что такое лямбды и как они капеллируют с делегатами, то не говорил бы таких глупостей.
1. Лямбды — это не просто делегаты. Лямбды это отдельные скрытые объекты.
2. Знаешь что самое интересное. У лямбд больше возможностей чем у простых делегатов. Лямбды, в некоторой степени, более подходят под определения функций высшего порядка как это сделано в Lisp или SML, которых можно уточнять. Вот если бы это было сделано явно для делегатов и в более простой манере, как это делается у функциональщиков.
VD>Лямбды это замена действительно избыточному синтаксису анонимных методов,
Именно это и имелось ввиду.
Здравствуйте, Геннадий Васильев, Вы писали:
GZ>>Именно это я и имел ввиду. Синтаксис делегатов(не анонимов и не лямбд) мне кажется слишком сложным а эффективность не очень. ГВ>Вот-вот, и как раз напрашивается риторический вопрос: почему делегаты не стали распространённым явлением в программах на C++.
Ну это кому как. Я пользую(правда не бустовые а свои). Тут вопрос только в реализации. В Net делегаты множественные, в результате прямой ссылки на функцию не долждешься. В С++ у меня все компилируется в простой вызов функции.
Что касается эффективности, то эффективности функциональных языков конечно ожидать не стоит. Но было бы хоть что-то.
Здравствуйте, Геннадий Васильев, Вы писали:
GZ>>Именно это я и имел ввиду. Синтаксис делегатов(не анонимов и не лямбд) мне кажется слишком сложным а эффективность не очень.
ГВ>Вот-вот, и как раз напрашивается риторический вопрос: почему делегаты не стали распространённым явлением в программах на C++.
Потому как понятие "функциональный объект" используется более широко в С++. Делал как-то свое GUI на С++, там делегаты работали на всю катушку, в остальных случаях всегда проще подать целевой функциональный объект (или ссылку на оный), чем непонятно для каких целей нужный делегат-посредник.
Что удобно (для тех кто не в С++), что функциональный объект — это или ф-ия сама по себе, или статический метод, или экземпляр класса/структуры/объединения, тип которого содержит operator()(...).
В дотнете мы можем некие действия/алгоритмы помещать только лишь в методы классов, причем эти методы не могут быть "функциональными объектами". Потому и нужен адаптер-переходник к некоему универсальному функциональному виду, то бишь делегат.
Re: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, VladD2, Вы писали:
VD>>Извини, но это глупость. Они в принципе разные! У них только синтаксис похож. Попробуй передать свойство по ссылке. GZ>И это плохо, что нельзя.
Блин, хотел по-быстрому накатать ссылку на св-во как объект (С# struct) из пары делегатов и переопределенного оператора implicit().
Однако, компилятор ругается на такой синтаксис:
PropRef<int> pr = new PropRef<int>(p1.get_P1, p1.set_P1);
Error 1 'ConsoleApplication1.Probe1.P1.get': cannot explicitly call operator or accessor
Блин, нельзя обратиться напрямую к акцессорам!
А через CreateDelegate — это надо PropertyInfo подавать, а получать его через рефлекшен, в общем статическая безопасность и типизация идет лесом... так же как и рефакторинг впоследствии...
А счастье было так близко...
Re[2]: Хорошо ли, что свойство нельзя передать по ссылке
Вопрос не в статической безопасности. Создать делегат указывающий на свойство, а будет ли это выглядеть "красиво" или нет — уже совсем другой вопрос.
Вопрос же скорее в следующем:
1. Что понимается вообще под _ссылкой_ на метод (и на свойство в частности)? Мне это не очень ясно. Более того сдается мне что делегат это совсем не ссылка.
2. Указатель на свойство создать вполне можно, хотя и используя менее удобный синтаксис чем в случае с обычным методом.
Re[3]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Вопрос не в статической безопасности. Создать делегат указывающий на свойство, а будет ли это выглядеть "красиво" или нет — уже совсем другой вопрос. ВВ>Вопрос же скорее в следующем: ВВ>1. Что понимается вообще под _ссылкой_ на метод (и на свойство в частности)? Мне это не очень ясно.
А что такое вообще — ссылка? В дотнете любая переменная ссылочного типа — уже ссылка (масло маслянное). Т.е. ссылка — это способ некоего коссвенного обращения к чему-либо.
Применительно к методам — это некоторый унифицированный адаптер, позволяющий единообразно обращаться к любому методу с подходящей сигнатурой. Делегат — вполне себе ссылка на метод экземпляра (или просто статический метод). Я понимаю, что на оное понятие не натягивается ссылка из С++, давай предположим, что физическое представление ссылки — это необязательно группа байт размером в адресную шину. Для делегата представление ссылки — это не только данные (ссылка на целевой объект), но и код, адаптирующий вызов конкретного метода
ВВ>Более того сдается мне что делегат это совсем не ссылка.
Почему? По целям/задачам/функциональности — похож...
ВВ>2. Указатель на свойство создать вполне можно, хотя и используя менее удобный синтаксис чем в случае с обычным методом.
Как? Мож я чего-то упустил? Или все-таки через PropertyInfo?
Re: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
GZ>И это плохо, что нельзя.
Естественно плохо. Сделать такое в принципе можно, но тогда все ссылки тормозить начнут. Так что невозможность передачи свойства по ссылке — это просто решение в пользу производительности.
Re[2]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, vdimas, Вы писали:
V>А через CreateDelegate — это надо PropertyInfo подавать, а получать его через рефлекшен, в общем статическая безопасность и типизация идет лесом... так же как и рефакторинг впоследствии...
Можно по typeof от подходящего делегата.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, GlebZ, Вы писали:
VD>Если бы ты еще за одно разобрался что такое лямбды и как они капеллируют с делегатами, то не говорил бы таких глупостей.
пардон, что лямбды делают с делегатами ?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[9]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Учитывая что свойство это в сущности обычный метод, что ты в данном случае понимаешь под передачей метода по ссылке? Нечто подобное в принципе предоставляет delegate
Свойство — это, очень часто, два метода.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>Естественно плохо. Сделать такое в принципе можно, но тогда все ссылки тормозить начнут. Так что невозможность передачи свойства по ссылке — это просто решение в пользу производительности.
Это еще почему?
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
VD>>Если бы ты еще за одно разобрался что такое лямбды и как они капеллируют с делегатами, то не говорил бы таких глупостей. GZ>В терминах языка. Есть лямбда. Есть делегат. Есть анонимный метод.
Ага. В терминах, есть. Вот только анонимный метод и лямда это одно, а делегат совсем другое. Не жужно путать функцию не имеющую имени и средство позволяющее сослаться на них или на именованный метод.
VD>>Лямбды это замена действительно избыточному синтаксису анонимных методов, а делегаты это то через что ссылку на этот самый анонимный метод (лямду или на обычный метод) можно передать в функцию или поместить в поле. GZ>Именно это я и имел ввиду. Синтаксис делегатов(не анонимов и не лямбд) мне кажется слишком сложным а эффективность не очень.
Я не знаю, что ты пытался иметь в виду, но получилась ерунда. Ну, а что там тебе не нравится в "синтаксисе делегатов" вообще осталось не ясным. Не ясен даже сам термин "синтаксис делегатов".
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, GlebZ, Вы писали:
GZ>1. Лямбды — это не просто делегаты.
Ага. Это вовсе не делегаты.
GZ> Лямбды это отдельные скрытые объекты.
Ну, делегаты это действительно объекты. А вот лямбды, как бы есть абстракция безымянного метода позволяющего делать или не делать синтаксические замыкания на контекст методов в которые они вложены. Никакой реализации это не определяет. Что же касается реализации в дотнете, то она бывает разная. Когда действительно создается скрытый объект, а когда всего лишь создается скрытй метод. Причем ничто не мешает в будущем изменить это поведение. Например, нет особых проблем заинлайнить передачу ссылки на лямбду и вообще избавиться от необходимости создавать какие-то методы или классы.
GZ>2. Знаешь что самое интересное.
Да все твои слова про делегаты так интересны, что я даже предположить боюсь.
GZ> У лямбд больше возможностей чем у простых делегатов.
Ага. А полей больше чем ссылок на неих.
GZ> Лямбды, в некоторой степени, более подходят под определения функций высшего порядка как это сделано в Lisp или SML, которых можно уточнять.
Во как? А мужики то и не знали (с). Ты определение функции высшего порядка то знашь? Понимаш ли, любая функция принимающая делагат еею является. Лбда же в Шарпе — это просто анонимный метод. И к функциям высшего порядка он имеет отношение только если сам принимает или возрващает функцию.
GZ> Вот если бы это было сделано явно для делегатов и в более простой манере, как это делается у функциональщиков.
Что сделано?
VD>>Лямбды это замена действительно избыточному синтаксису анонимных методов, GZ>Именно это и имелось ввиду.
Что имелось в виду? Ты почитай что ты пишешь? Ты препутал все на свете и несешь натуральную ахинею. Или так выражашь свои мысли, что тебя просто невозможно понять.
Запомни на будущее. Делегат — это ссылка на метод. Лямбда и анонимные методы — это методы не имеющие имени которые можно объявлять внутри других методов или в местах инициализации делегатов. Ссылаются на лмбду через делегат, но сама лямба оным не яявляется.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Nose, Вы писали:
N>пардон, что лямбды делают с делегатами ?
То же что и любые другие методы — что хатят.
Лямбда == новый синтаксис для анонимных методов.
Анонимные методы — это метода не имеющие имени и которые можно обявлять внутри других методов или в месте инициализации делегатов.
Делегат — это ссылка на любой, в том числе и на анонимый, метод.
Единственная связь между делегатом и лямбдой — то то что она объявляется всегда в том месте где требуется делегат, так как на нее можно сослаться только по средствам делегата. Однако лямбда != делегат.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Это правильно только в том случае, если речь идёт о закрытых полях.
Создание публичных полей в объектах уже нарушает инкапсуляцию.
ГВ>Нарушение же инкапсуляции состоит в самом по себе открытии поля объекта, неуместном открытии, разумеется.
Согласен, но тем не менее возможность получения ссылки на внтрении поял объекта может привести к нарушению инкапсуляции и без создания публичных полей. По этому предлагаемая механика передачи свойств по ссылке является абсурдом.
Т.е. я пытался объяснить товарищам почему поля не тоже самое что свойства.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, GlebZ, Вы писали:
GZ>Внимательнее Влад. Здесь подразумевается свойство, то есть проперть. Никакого нарушения
Я понимаю. О том тебе и говорю. Ты несешь околесицу. Предача свойства по ссыле — это абсурд! Вместо ссылка на свойство можно передать один/два делегата или некий объект-обертку.
Ссылка это фактически типизированный указатель на память повзоялющий менять эту память.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Воронков Василий, Вы писали:
ВВ>1. Что понимается вообще под _ссылкой_ на метод (и на свойство в частности)? Мне это не очень ясно. Более того сдается мне что делегат это совсем не ссылка.
+1
ВВ>2. Указатель на свойство создать вполне можно, хотя и используя менее удобный синтаксис чем в случае с обычным методом.
-1
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, vdimas, Вы писали:
V>Блин, хотел по-быстрому накатать ссылку на св-во как объект (С# struct) из пары делегатов и переопределенного оператора implicit().
А приведение типов то тут зачем?
V>Однако, компилятор ругается на такой синтаксис: V>
V>PropRef<int> pr = new PropRef<int>(p1.get_P1, p1.set_P1);
V>
V>
V>Error 1 'ConsoleApplication1.Probe1.P1.get': cannot explicitly call operator or accessor
V>Блин, нельзя обратиться напрямую к акцессорам!
V>А через CreateDelegate — это надо PropertyInfo подавать, а получать его через рефлекшен, в общем статическая безопасность и типизация идет лесом... так же как и рефакторинг впоследствии...
V>А счастье было так близко...
Да сделать то это можно. Толко подключние будет в ранмайме:
using System;
class PropertyHolder<T>
{
private delegate T Getter();
private delegate void Setter(T value);
public PropertyHolder(object obj, string propertyName)
{
try
{
_getter = (Getter)Delegate.CreateDelegate(
typeof(Getter), obj, "get_" + propertyName);
}
catch (ArgumentException ex)
{
throw new ArgumentException(
"Неудается подключить PropertyHolder к getter-у свойства "
+ propertyName, "propertyName", ex);
}
try
{
_setter = (Setter)Delegate.CreateDelegate(
typeof(Setter), obj, "set_" + propertyName);
}
catch (ArgumentException ex)
{
throw new ArgumentException(
"Неудается подключить PropertyHolder к setter-у свойства "
+ propertyName, "propertyName", ex);
}
}
private Getter _getter;
private Setter _setter;
public T Property
{
get { return _getter(); }
set { _setter(value); }
}
}
class A
{
private int myVar = 10;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
}
class Program
{
static void Main()
{
PropertyHolder<int> holder1 = new PropertyHolder<int>(new A(), "MyProperty");
Console.WriteLine(holder1.Property);
holder1.Property++;
Console.WriteLine(holder1.Property);
}
}
Вот только зачем это нужно? Хоть раз в жизни бы такое потребовалось? Нафига нужно искуство ради искуства?
Это ведь все равно будет не ссылк, а объект посредник. Ссылка то будет на сам объект. А свойство точно так же будет вызваться как и раньше. Проще тогда или ввести интерфейс или просто пользоваться исходным объектом.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>Естественно плохо. Сделать такое в принципе можно, но тогда все ссылки тормозить начнут. Так что невозможность передачи свойства по ссылке — это просто решение в пользу производительности.
Блни, сегодня что магнитные бури? Ну, как можно передать сылку на два метода? Тут только объект-посредник поможет. Но это не ссылка! Или тогда что по вашему означет "ссылка"?
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, AndrewVK, Вы писали:
VD>>Лямбды это замена действительно избыточному синтаксису анонимных методов
AVK>Не совсем. Не забывай про expression tree.
Просто уверен, что для компилятора будет пофигу что сувать в expression tree лябду или анонимный метод. Так что expression tree это еще одно расширение. Не более того.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Просто уверен, что для компилятора будет пофигу что сувать в expression tree лябду или анонимный метод.
Анонимный метод засунуть в expression на порядок сложнее — допустимых конструкций несопоставимо больше. А чисто теоретически да — однофигственно. В любом случае — де факто в expression tree можно запихать только лямбду.
VD> Так что expression tree это еще одно расширение. Не более того.
Но тем не менее оно работает только с лямбдами, так что линковская лямбда по факту все же не просто упрощенный способ записи анонимного метода.
... << RSDN@Home 1.2.0 alpha rev. 624 on Windows XP 5.1.2600.131072>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Анонимный метод засунуть в expression на порядок сложнее — допустимых конструкций несопоставимо больше. А чисто теоретически да — однофигственно. В любом случае — де факто в expression tree можно запихать только лямбду.
Интересно с чего же их больше? По спецификации анонимные методы и лямбды функционально идентичны. Просто в текущей версии компилятора лямбды ограничены выражениями.
Возможно, деревья выражений как раз ограничат лямбдами которые представляют только выражения. Но пока никаких упоминаний об этом нет.
VD>> Так что expression tree это еще одно расширение. Не более того.
AVK>Но тем не менее оно работает только с лямбдами, так что линковская лямбда по факту все же не просто упрощенный способ записи анонимного метода.
Линковская Лябда ограничена выражениями. Причем это не соотвествует опубликованной спецификации.
Ну, да если даже ты окажешся прав. И они не позволят преобразовывать анонимные методы в деревья выражений, то это будет исключительно из-за того, что анонимные методы не повзяоляют записать чистое выражение, а всегда записывают хотя бы одно предложение (statment). Но учитывая, что по спецификации и лямбды должны это делать, думаю к релизу они устранят разницу. Иначе получается некая непоследовательность.
В любом случае если отбросить возможность преобразования к деревьям выражений разницы между семантической лямбдами и анонимными методами нет.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Nose, Вы писали:
N>>пардон, что лямбды делают с делегатами ?
VD>То же что и любые другие методы — что хатят.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, GlebZ, Вы писали:
GZ>>Внимательнее Влад. Здесь подразумевается свойство, то есть проперть. Никакого нарушения
VD>Я понимаю. О том тебе и говорю. Ты несешь околесицу. Предача свойства по ссыле — это абсурд! Вместо ссылка на свойство можно передать один/два делегата или некий объект-обертку.
Ну да. Правда почему абсурд? Если ссылку реализовать как обращение к переменной, то что тут абсурдного.
VD>Ссылка это фактически типизированный указатель на память повзоялющий менять эту память.
Ссылка или типизированный указатель неважно. Насчет менять память, верно только частично. В терминах процессора, нет понятия ссылки и типа. В менеджед MSIL, нет понятия памяти. Ссылка — это понятие компиляторов. Что тип тебе скажет, то компилятор и сделает. Даже для данных ссылка может быть на константную переменную(что уже не подпадает под твое определение).
Мне интересно иметь возможность сохранять ссылку на любую облать программы. Независимо от того что это, метод, type, field, property или ссылка на экземпляр.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Хорошо ли, что свойство нельзя передать по ссылке
.
Здесь я вообще-то имел ввиду методы класса. Но и это тоже. Только в данном случае есть некоторое различие между данной проксей, и желательным результатом. Наличие сеттера и геттера проверяется компилятором при наличии операции присваивания и т.п. VD>А зачем?
Мне нравится идея что я могу адресовать все и вся в рамках инкапсуляции. Нужно меньше думать о подпорках.
Здравствуйте, VladD2, Вы писали:
VD>Запомни на будущее. Делегат — это ссылка на метод. Лямбда и анонимные методы — это методы не имеющие имени которые можно объявлять внутри других методов или в местах инициализации делегатов. Ссылаются на лмбду через делегат, но сама лямба оным не яявляется.
Ты Влад опять ударяешься в разъяснение технических моментов, которые все давно знают (тут неоднократно проскакивали листинги декомпиляции анонимных методов)
Оппонент рассуждал об общей природе вещей, что-ли. Какая фиг разница, как они имплементированы прямо сейчас? Ты уверен, что в будущем в том же дотнете не будет расширено понятие "функциональный объект"?
Экземпляр делегата имеет метод Invoke() с параметрами. Я не удивлюсь, если в будущем мы сможем использовать в качестве функциональных объектов не только делегаты.
Я экспериментировал с делегатами, интересные вещи оказались возможны.
Прямо в С# нелья наследоваться от System.Delegate или System.MulticastDelegate, но это можно в IL, либо динамически.
Т.е. представь ситуацию, что вполне возможно типа так:
// тип-хелпер функционального объектаpublic class Func1<RET, P1> {
// интерфейс вызова функционального объектаpublic interface Delegate {
public RET invoke(P1 param1);
}
public static Delegate Create(object target, IntPtr method) {}
public static Delegate Create(object target, MethodInfo methodInfo) {}
public static Delegate Create(Type type, MethodInfo methodInfo) {}
public static Delegate Create(object target, string methodName) {}
public static Delegate Create(Type type, string methodName) {}
public static Delegate Create(System.Delegate delegate) {}
}
public class SqrFunc : Func1<double, double>.Delegate {
public double Invoke(double d) { return d*d; }
}
public class SqrStaticFunc {
public static double Invoke(double d) { return d*d; }
}
public delegate double Func1D(double p1);
void Main() {
Func1<double, double> func = new SqrFunc();
double d1 = func.Invoke(10);
func = Func1<double, double>.Create(SqrStaticFunc.Invoke); // typeof(SqrStaticFunc), "Invoke"
d1 = func.Invoke(10);
func = Func1<double, double>.Create(new Func1D(SqrStaticFunc.Invoke));
d1 = func.Invoke(10);
}
Т.е. суть в том, что мы можем создавать динамически через Emit типы-делегаты, которые наследуют некоторые интерфейсы и затем мы можем юзать все это совместно, как делегаты, так и сами функциональные объекты.
Я вообще не понимаю, почему компилятор C# генерирует типы делегатов как sealed. Если бы не sealed, можно было бы создавать наследников делегатов, т.е. собственные функциональные объекты, благо метод Invoke у сгенерированного компилятором делегата виртуальный.
Re[3]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, VladD2, Вы писали:
V>>Блин, хотел по-быстрому накатать ссылку на св-во как объект (С# struct) из пары делегатов и переопределенного оператора implicit().
VD>А приведение типов то тут зачем?
а для такого синтаксиса:
int value = propRef;
вместо
int value = propRef.Property;
Хотя это и не обязательно
VD>Да сделать то это можно. Толко подключние будет в ранмайме:
Да понятно дело, что через рефлекшен можно, и кстати, не только так как ты показал. Просто хотелось статически проверяемого кода.
VD>Вот только зачем это нужно? Хоть раз в жизни бы такое потребовалось? Нафига нужно искуство ради искуства?
VD>Это ведь все равно будет не ссылк, а объект посредник. Ссылка то будет на сам объект. А свойство точно так же будет вызваться как и раньше.
Суть в том, что мы будем обращаться единообразно к разным св-вам. Например в RFD у IT аналогичное делается через emmit, т.е. генерируются объекты-дескрипторы-посредники доступа к св-вам сущностей. Так вот, в случае описанного тобой типизированной через дженерики имплементации ссылки на св-во мы можем обойтись БЕЗ emmit для дескрипторов св-в, и не потеряем в быстродействии.
Т.е. создание делегата — это же тоже некий emmit внутренний в run-time, только более шустрый. К тому же — задача одноразовая, т.е. подобные дескрипторы св-в создаются одноразово, а затем просто используются.
Re[3]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, VladD2, Вы писали:
VD>Блни, сегодня что магнитные бури? Ну, как можно передать сылку на два метода? Тут только объект-посредник поможет. Но это не ссылка! Или тогда что по вашему означет "ссылка"?
Да, хотелось бы услышать. Что же такое ссылка?
Неужели только последовательность байт шириной в адрессную шину?
Re[3]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
S>>Естественно плохо. Сделать такое в принципе можно, но тогда все ссылки тормозить начнут. Так что невозможность передачи свойства по ссылке — это просто решение в пользу производительности. GZ>Это еще почему?
Ну как, в слуае передаи параметра по ссылке на стек ложится обычный указатель на переменную, с которым и работает метод, а если делать возможность передачи свойства, то надо класть что-то типа:
И соответственно постоянно анализировать isVarRef. Можно конечно и для переменной передавать псевдо getter/setter, и таким образом работать однообразно без флага, но вызов метода вместо работы по указателю — это уже тормоза.
Re[11]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, GlebZ, Вы писали: GZ>>Обычный метод? И как его вызвать без рефлекшона простому индийцу? Mab>Тот факт, что компилятор скрывает от нас его, еще не делает метод необычным Скажем, если объявить на MC++ свойство с параметрами, то из С# его можно (и нужно) будет вызывать через set_XXX.
Mab>То, о чем говорит, Василий -- в код, работающий с ссылками (т.е. с managed pointerами в терминологии MSIL), нельзя передать свойство -- по крайней мере в текущей реализации виртуальной машины.
Mab>Можно, конечно, пойти на хитрость -- если передача свойства по ссылке происходит, то завести локальную переменную, скопировать туда значение, вызвать метод, а потом вызвать setter. Но это путь очень опасный, т.к. свойства могут иметь весьма нетривиальные зависимости между собой.
Я считаю, что вполне достаточно было бы иметь возможность легко кастить свойство к двум типам делегатов. Вот простой пример:
public class C1
{
private int _i;
public int I1
{
get { return GetI(); }
set { SetI(value); }
}
public int GetI() { return _i; }
public void SetI(int value)
{
if (_i % 2 == 0)
_i = value;
else
throw new ArgumentException("value must be an odd number", "value");
}
public int I2;
}
public class C2
{
public delegate void SetInt(int value);
public delefate int GetInt(int value);
public static void Test1(ref int value)
{
value++;
value++;
}
public static void Test2(GetInt in, SetInt out)
{
out(in()+1);
out(in()+1);
}
}
Итак, мы подготовили сцену. В старом шарпе можно было делать вот так:
С1 с1 = new C1();
С2.Test1(ref c1.I2);
C2.Test2(new C2.GetInt(c1.GetI), new C2.SetInt(c1.SetI));
В С# 2.0 мы можем эксплуатировать С2 вот так:
С1 с1 = new C1();
С2.Test1(ref c1.I2);
C2.Test2(c1.GetI, c1.SetI);
Это работает благодаря автоматическому кастингу методов к делегатам. На первый взгляд, можно было бы сделать также автоматический кастинг пропертей к аналогичным делегатам:
С1 с1 = new C1();
С2.Test1(ref c1.I2);
C2.Test2(c1.I1, с1.I1);
Тогда не нужно было бы выносить код свойства в публичные методы. Это уже было бы достаточно удобно. Хотя тут явно есть подводные грабли вот с чем:
public class C3
{
public C2.SetInt I { get { return SetK; } }
public void SetK(int k) { Console.Write(k);}
}
...
C3 c3 = new C3();
C2.Test2(c3.I, null); // что мы имели здесь в виду? Вычисляем c3.I или кастим один из его методов к делегату?
Хотя не исключен вариант с тем, что это все можно разрулить.
Стоит отметить, что IL методов C2.Test1 и C2.Test2 существенно отличается. Это означает, что все трюки должны осуществляться на стороне вызывающего кода. В принципе, компилятор шарпа делает некоторые такие трюки. В частности, я нередко пишу код типа:
StringBuilder sb = new StringBuilder();
...
if(sb.Length > 0)
sb.Length--; // фактически, я делаю sb.Length = sb.Length - 1;
IL будет существенно отличаться от кода для
int i = 0;
i--;
но об этом заботится компилятор. В принципе, можно было бы сделать и так, чтобы семантика ref и out обеспечивала требуемое поведение автоматически:
// варнинг! Компилируется только под C#8.0!
C1 c1 = new C1();
C2.Test1(ref c1.I);
// компилятор строит следующий код позади сцены:int temp$$_882133 = c1.I;
C2.Test1(ref temp$$_882133);
c1.I = temp$$_882133;
Есть единственная махонькая грабля, которую я вижу. Если внутри метода производятся множественные обращения к параметру, то семантика кода отличается. В частности, в моем примере сеттер I не пропускает нечетные числа. Честно реализованный метод Test2() упадет сразу же при первом инкременте, а Test1() отработает нормально. Потому что выполнится ровно одно чтение и одно присваивание. В некоторых обстоятельствах это может оказаться важно.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>И соответственно постоянно анализировать isVarRef. Можно конечно и для переменной передавать псевдо getter/setter, и таким образом работать однообразно без флага, но вызов метода вместо работы по указателю — это уже тормоза.
Не обязательно. Вводим в JIT новый тип — propertyType. При компиляции в asm — переменная этого типа переводится в реальный адрес.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
GZ>Не обязательно. Вводим в JIT новый тип — propertyType. При компиляции в asm — переменная этого типа переводится в реальный адрес.
В реальный адрес чего? И какое конкретно содержание у propertyType. И самое главное как метод поймет разницу между тем что ему передали: ссылку на переменную или ссылку на свойство?
class A
{
public int Var;
public int Prop { get { return x + y; }
set { x = value - y; } }
private int x;
private int y;
};
class B
{
public void P(ref int i)
{
int j = i; // Читаем.
i = j * 2; // Пишем.
}
public void M()
{
A a = new A();
P(ref A.Var);
P(ref A.Prop);
}
}
Ы?
Re[6]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>Здравствуйте, GlebZ, Вы писали:
GZ>>Не обязательно. Вводим в JIT новый тип — propertyType. При компиляции в asm — переменная этого типа переводится в реальный адрес. S>В реальный адрес чего? И какое конкретно содержание у propertyType. И самое главное как метод поймет разницу между тем что ему передали: ссылку на переменную или ссылку на свойство?
Сравнивай не с полями. Сравнивай с делегатами. Тогда все на месте.
S>
S> P(ref A.Var);
//Ссылка на проперть - reference type объект. Компилятором должа быть выведена ошибка.
S> P(ref A.Prop);
S>
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
GZ>Не будет работать. ref на reference type применять нельзя.
Как всегда всё в куче.
Во-первых, где ты увидел "ref на reference type".
Во-вторых, мы обсуждаем как сделать чтобы работало. А ты говоришь "не будет". Дык, значит твой алгоритм не правильный. Так? Тогда чего его обсуждать...
Re[10]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, GlebZ, Вы писали:
GZ>>Не будет работать. ref на reference type применять нельзя. Mab>Что за новости? С чего ты это взял?
Обломс. Ошибки не будет.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>Во-первых, где ты увидел "ref на reference type". S>Во-вторых, мы обсуждаем как сделать чтобы работало. А ты говоришь "не будет". Дык, значит твой алгоритм не правильный. Так? Тогда чего его обсуждать...
Вобщем штука примерно получится такая. У нас есть некоторый тип делегат который может ссылаться на несколько методов. Хороший или он плохой — вопрос второй. Делегат сущность типизированная. Вместо типизированного метода, типизируем проперть.(ну информация о типе будет типа есть setter/getter, какой тип). Желательно чтобы компилятор C# делал это сам, как и статическую проверку при использовании. На входе в JIT у нас будет переменная и ее тип(а может так-же как и в делегате объект). Его задача — просто подставить вызов сеттера или геттера. Вот и все.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
S>>Во-первых, где ты увидел "ref на reference type". S>>Во-вторых, мы обсуждаем как сделать чтобы работало. А ты говоришь "не будет". Дык, значит твой алгоритм не правильный. Так? Тогда чего его обсуждать... GZ>Вобщем штука примерно получится такая. У нас есть некоторый тип делегат который может ссылаться на несколько методов. Хороший или он плохой — вопрос второй. Делегат сущность типизированная. Вместо типизированного метода, типизируем проперть.(ну информация о типе будет типа есть setter/getter, какой тип). Желательно чтобы компилятор C# делал это сам, как и статическую проверку при использовании. На входе в JIT у нас будет переменная и ее тип(а может так-же как и в делегате объект). Его задача — просто подставить вызов сеттера или геттера. Вот и все.
Ну, лык это для передачи свойства по ссылке. А есть же еще и передача просто переменной.
Метод с параметром-ссылкой, например:
void P(ref int i)
{
i = 7; // ???
}
должен ведь уметь работать с обоими случаями. Т.е. в этот метод я могу передать как ссылку на свойство, так и ссылку на переменную. В случае со свойством, хорошо пусть будет твой делегат. А в случае с переменной?
Re[12]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>должен ведь уметь работать с обоими случаями.
А теперь понял что ты имел ввиду. Извини плохо прочитал предыдущий текст. Нет функциональный тип и тип данных не могут и не должны быть одинаковыми. Может использование и может быть похожим, но не одинаковый тип — это точно. Компилятором такая вещь просто нереализуемая(как ты уже описал). Тут нужна другая конструкция(или объект) для описания таких типов.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, stalcer, Вы писали:
S>>должен ведь уметь работать с обоими случаями. GZ>А теперь понял что ты имел ввиду. Извини плохо прочитал предыдущий текст. Нет функциональный тип и тип данных не могут и не должны быть одинаковыми. Может использование и может быть похожим, но не одинаковый тип — это точно. Компилятором такая вещь просто нереализуемая(как ты уже описал). Тут нужна другая конструкция(или объект) для описания таких типов.
То есть вместо существующего сейчас ключевого слова ref, сделать два слова, например, vref и pref (для переменных и свойств, соответственно). Это да, реализуемо. Только мне не нравится. Плохо это.
Хотя vref нам нужен только для оптимизации производительности, поскольку pref будет работать медленнее. Но, в принципе, реализуемо, чтобы переменные можно было передавать и через pref (посредством фиктивного делегата). Таким образом получим vref только для переменных, зато быстро, а pref — для обоих случаев, пусть не так быстро, зато универсально. Вот .
Re[14]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, stalcer, Вы писали:
S>То есть вместо существующего сейчас ключевого слова ref, сделать два слова, например, vref и pref (для переменных и свойств, соответственно). Это да, реализуемо. Только мне не нравится. Плохо это.
Нельзя.
int и ссылка на проперть это два разных типа. Такое даже языки типа JavaScript не пропустят.
Примерно так
PropertyRef myProperty=new PropertyRef<int>(a.Prop);
int func(PropertyRef<int> myProp)
{
Prop=10;
}
S>Хотя vref нам нужен только для оптимизации производительности, поскольку pref будет работать медленнее. Но, в принципе, реализуемо, чтобы переменные можно было передавать и через pref (посредством фиктивного делегата). Таким образом получим vref только для переменных, зато быстро, а pref — для обоих случаев, пусть не так быстро, зато универсально. Вот .
не пройдет
void v(pref int a)
{
v1(a);//и что здесь компилировать? Вызов проперти или передачу значения?
}
void v1(int a){};
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: Хорошо ли, что свойство нельзя передать по ссылке
GZ>void v(pref int a)
GZ>{
GZ> v1(a);//и что здесь компилировать? Вызов проперти или передачу значения?
GZ>}
GZ>void v1(int a){};
GZ>
Компилировать вируальный вызов getter'а. В случае свойства вызовется getter свойства, а в случае переменной — специальный фиктивный getter, который возвратит значение переменной.
А передавать в метод в любом случае нужно делегат, только это будут два разных делегата, но совместимых по интерфейсу.
Re[4]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, vdimas, Вы писали:
V>Да, хотелось бы услышать. Что же такое ссылка? V>Неужели только последовательность байт шириной в адрессную шину?
В общем, Влад не отвечает, отвечу сам. ИМХО ссылка — это proxy по терминологии GoF.
-----------
Как там в классике, переменная — это именованная ячейка памяти (или группа ячеек).
Переменные ссылочного типа (в .Net, например) хранят не сам объект, а ссылку на оный. Как именно представлена эта ссылка — не суть важно. Для некоторых реализаций GC ссылочные переменные хранят ссылку не на объект, а на дескриптор, который фиксирован в памяти в отличие от блуждающего целевого объекта.
Так что, если отнести ссылку к прокси (заместителю), то, на мой взгляд, у нас нет никаких ограничений на физическую реализацию механизма этого прокси.
Здравствуйте, GlebZ, Вы писали:
GZ>Ну да. Правда почему абсурд? Если ссылку реализовать как обращение к переменной, то что тут абсурдного.
Какой переменной? Ты не забыл что речь шла о свойстве?
VD>>Ссылка это фактически типизированный указатель на память повзоялющий менять эту память. GZ>Ссылка или типизированный указатель неважно. Насчет менять память, верно только частично. В терминах процессора, нет понятия ссылки и типа. В менеджед MSIL, нет понятия памяти.
Куда же оно делось?
GZ> Ссылка — это понятие компиляторов.
Ссылка — это общечеловеческое поняите. И в МСИЛ оно тоже есть.
GZ>Мне интересно иметь возможность сохранять ссылку на любую облать программы. Независимо от того что это, метод, type, field, property или ссылка на экземпляр.
Ссылка может быть только на ячейку памяти. Ты же придумал себе некую локальную абстракцию и пыташся обсуждать ее с теми кто не так хорошо владеет телепатией.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
GZ>Не обязательно. Вводим в JIT новый тип — propertyType. При компиляции в asm — переменная этого типа переводится в реальный адрес.
Адрес чего? Ты не забыл, что свойство — это набор методов?
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, vdimas, Вы писали:
V>>Да, хотелось бы услышать. Что же такое ссылка? V>>Неужели только последовательность байт шириной в адрессную шину?
V>В общем, Влад не отвечает, отвечу сам. ИМХО ссылка — это proxy по терминологии GoF.
Прокси и есть прокси, т.е. посредник/агент. А ссылка в C#, да и в 99% других языков означает указатель на память. В Шарпе есть ссылка на объект и ссылка на поле объекта.
Ну, а прокси — это скорее делегат.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, VladD2, Вы писали:
GZ>>Ну да. Правда почему абсурд? Если ссылку реализовать как обращение к переменной, то что тут абсурдного. VD>Какой переменной? Ты не забыл что речь шла о свойстве?
А что, у переменной не может быть тип свойство? Пока действительно нет. Но почему бы такой и не быть.
GZ>> Ссылка — это понятие компиляторов. VD>Ссылка — это общечеловеческое поняите. И в МСИЛ оно тоже есть.
А что MSIL больше не компилируется?
GZ>>Мне интересно иметь возможность сохранять ссылку на любую облать программы. Независимо от того что это, метод, type, field, property или ссылка на экземпляр. VD>Ссылка может быть только на ячейку памяти. Ты же придумал себе некую локальную абстракцию и пыташся обсуждать ее с теми кто не так хорошо владеет телепатией.
Не путай с указателем. Он действительно только на ячейку памяти. А ссылка — это типизированная абстракция. И типизация(поведение для типа) может подразумевать разное. Например указатель на метод с инициализацией this, или что-то еще.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, VladD2, Вы писали:
GZ>>Не обязательно. Вводим в JIT новый тип — propertyType. При компиляции в asm — переменная этого типа переводится в реальный адрес. VD>Адрес чего? Ты не забыл, что свойство — это набор методов?
Реальный адрес метода в зависимости от операции и this. Такое не так уж сложно.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, GlebZ, Вы писали:
GZ>>Мне нравится идея что я могу адресовать все и вся в рамках инкапсуляции. Нужно меньше думать о подпорках.
VD>Не можишь ты ничего адресовать кроме памяти.
Функции тоже имеют адрес.
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Хорошо ли, что свойство нельзя передать по ссылке
Здравствуйте, GlebZ, Вы писали:
VD>>Какой переменной? Ты не забыл что речь шла о свойстве? GZ>А что, у переменной не может быть тип свойство?
Для меня это звучит как бред.
GZ> Пока действительно нет. Но почему бы такой и не быть.
Потому-что не ясно, что ты хочешь и зачем.
GZ>>> Ссылка — это понятие компиляторов. VD>>Ссылка — это общечеловеческое поняите. И в МСИЛ оно тоже есть. GZ>А что MSIL больше не компилируется?
Ты утверждал что в MSIL-е нет понятия "ссылка".
VD>>Ссылка может быть только на ячейку памяти. Ты же придумал себе некую локальную абстракцию и пыташся обсуждать ее с теми кто не так хорошо владеет телепатией. GZ>Не путай с указателем.
Я ничего не путаю. Если мы ведем речь о C#, то в нем понятие "ссылка" четко специфицирована. То что ты пыташся назвать ссылкой называется делегатом.
Если бы ты сразу сказал, что хочешь иметь возможность создавать делегаты на свойства во время компиляции, то и вопросов бы не возникло.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
GZ>>>> Ссылка — это понятие компиляторов. VD>>>Ссылка — это общечеловеческое поняите. И в МСИЛ оно тоже есть. GZ>>А что MSIL больше не компилируется?
VD>Ты утверждал что в MSIL-е нет понятия "ссылка".
Нет. Я говорил что у процессора нет понятия ссылка.
VD>>>Ссылка может быть только на ячейку памяти. Ты же придумал себе некую локальную абстракцию и пыташся обсуждать ее с теми кто не так хорошо владеет телепатией. GZ>>Не путай с указателем. VD>Я ничего не путаю. Если мы ведем речь о C#, то в нем понятие "ссылка" четко специфицирована. То что ты пыташся назвать ссылкой называется делегатом. VD>Если бы ты сразу сказал, что хочешь иметь возможность создавать делегаты на свойства во время компиляции, то и вопросов бы не возникло.
Я хотел оставить детали реализации на потом. Говоря о делегатах, мы подразумеваем уже строгии детали реализации. Но в общем-то верно.
Здравствуйте, VladD2, Вы писали:
VD>Нет. Только в Linq-е.
Спасибо, почитал про это дело. Интересно.
Но я так понял, это будет реализовано в C#3.0, а вы о нём рассуждаете так, словно оно у вас под рукой. => Я чего-то не понял. Как-то можно (поставить?) этот Linq не дожидаясь C#3.0 или как?
Hello, "TS_Rus"
> Но я так понял, это будет реализовано в C#3.0, а вы о нём рассуждаете так, словно оно у вас под рукой. => Я чего-то не понял. Как-то можно (поставить?) этот Linq не дожидаясь C#3.0 или как?
Здравствуйте, TS_Rus, Вы писали:
TS_>Спасибо, почитал про это дело. Интересно.
TS_>Но я так понял, это будет реализовано в C#3.0, а вы о нём рассуждаете так, словно оно у вас под рукой.
Дык, а толку рассуждать о том, что уже нельзя изменить?
Что касается под рукой, то так оно и есть. Предварительная версия компилятора доступна для скачивания с сайта МС.
TS_> => Я чего-то не понял. Как-то можно (поставить?) этот Linq не дожидаясь C#3.0 или как?
ТК уже дал ссылку.
... << RSDN@Home 1.2.0 alpha rev. 628>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Sinclair, Вы писали:
VD>>>Нет понятия памяти? А каже ldfld, newobj и т.п.? С чем они по-твоему оперируют? S>>Со стеком.
VD>С каким на фиг стеком? Что делают эти инструкции, по твоему?
The ldfld instruction pushes onto the stack the value of a field of obj.
The newobj instruction creates a new object or a new instance of a value type...
...After the constructor has been called, the now initialized object reference is pushed on the stack.
Ты Влад, если чо, не стесняйся — спрашивай. Мне не влом открыть доку и процитировать
З.Ы. Единственное упоминание термина "память" в контексте этих команд встречается в описании OutOfMemoryException. Понятие памяти оказалось ненужным для объяснения семантики этих команд.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
VD>>С каким на фиг стеком? Что делают эти инструкции, по твоему?
S>
The ldfld instruction pushes onto the stack the value of a field of obj.
S>
The newobj instruction creates a new object or a new instance of a value type...
S>...After the constructor has been called, the now initialized object reference is pushed on the stack.
S>Ты Влад, если чо, не стесняйся — спрашивай. Мне не влом открыть доку и процитировать
Спрашивать можно у тех кто хочет обяснить. Ты же хочшь навязать свою мысль.
На всякий пожарный я выделил жирным все что связаны с памятью.
В контексе исходного вопроса совершенно понятно, что стек тут не причем. Главное что эти инструкции манипулируют объектами размещаемыми в управляемой памяти. И обойтись без понятия "ссылка" тут никак не удастся.
S>З.Ы. Единственное упоминание термина "память" в контексте этих команд встречается в описании OutOfMemoryException. Понятие памяти оказалось ненужным для объяснения семантики этих команд.
Память настолько базовое понятие, что оно подразумевается. Говорить это слово в слух явно не нужно. Достаточно понять, что объект нужно где-то разместить. И что значение копируется откуда-то.
ЗЫ
Вот кстати, понятие стэка явно выдуманное. Придумано для абстрактного объяснения. На самом деле в рантайме никако стэка нет. Но думаю, ты это и сам прекрасно знашь.
... << RSDN@Home 1.2.0 alpha rev. 628>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.