Re[4]: Краткий пересказ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.09.05 04:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот нарыл как можно:


VD>var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);


А как это работает? Рефлекшен?
... << RSDN@Home 1.2.0 alpha rev. 615 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[5]: Краткий пересказ
От: Belsen  
Дата: 17.09.05 16:32
Оценка: 33 (2) +1
Здравствуйте, AndrewVK, Вы писали:

VD>>Вот нарыл как можно:

VD>>var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);

AVK>А как это работает? Рефлекшен?


По идее, можно и без рефлекшена:
using System;
using System.Collections.Generic;

public delegate R Func<A,R> (A arg);

public static class Extensions
{
    public static Dictionary<K,T> ToDictionary<T,K>(this IEnumerable<T> collection, Func<T,K> func)
    {
        var dict = new Dictionary<K,T>();
        foreach (T elem in collection)
            dict.Add(func(elem), elem);
        return dict;
    }
}

public static class Program
{
    public static void Main(string[] args)
    {
        var dict = (new [] {"aaa", "b", "cccc", "dd"}).ToDictionary(s => s.Length);
        Console.WriteLine(dict[3]);
    }
}
I might be wrong...
Re[5]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.09.05 16:46
Оценка:
Здравствуйте, AndrewVK, Вы писали:

VD>>var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);


AVK>А как это работает?


Надо разбираться.

AVK> Рефлекшен?


Вряд ли. Это пример с сайта МС где примеры нововедений в языке демонстрируются.

Думаю, ToDictionary это расширяющая функция, а вот как они там значения выкалупывают .
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Краткий пересказ
От: GlebZ Россия  
Дата: 17.09.05 20:01
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Перекомпиляция пройдет без ошибок, но скомпилится с "родным" методом String.Split вместо старого StringExt.Split.

iT>И будет работать по-другому.
IMHO Так это в принципе нормально. Обратный ход, когда объект работает с одним методом, а пользователь с другим методом — по моему хуже. Аргументацию, примерно вижу такой:
1. Клиент может и не представлять, что некоторый namespace переопределяет данный метод. А следовательно, если он использует эту функциональность в совершенно других целях, то это должен быть родной метод. Если он использует синтаксис extension, то он вполне должен представлять что это синтаксический сахар. Просто удобство вызова методов связанных(не родных) с объектом. То есть, никакого обмана.
2. Можно явно вызвать метод extension, но вызвать переопределенный метод объекта нельзя. Тут уже более криминально, поскольку непонятно как можно определить синтаксис вызова родного объекта. А в связи с п.1, то вообще источник ошибок.
Ну например:
static class TestExtensions
{
      public static string ToString(this string str){return "Переопределено";}
}
static void Main(string[] args)
{
    string sss="sss";
    Console.WriteLine(TestExtensions.ToString(sss));//явно вызываем метод расширения
    Console.WriteLine(sss.ToString()); //тут вызов родного метода
}

выдаст

Переопределено
sss


Вообще, один способ держать метод с именем существующего это безусловно интерфейсы.
public interface IMyObject
{
    String MyMethod();
}
public class MyObject:IMyObject
{
    String IMyObject.MyMethod()
    {
        return "Real My Method";
    }
}

static class TestExtensions
{
    public static String MyMethod(this MyObject myObject){return "Extension";}
}
class Program
{
    static void Main(string[] args)
    {
        MyObject obj=new MyObject();
        Console.WriteLine(obj.MyMethod());
        IMyObject iface=new MyObject();
        Console.WriteLine(iface.MyMethod());
    }
}

выдает

Extension
My Real Method

Мне непонятно другое. Вот разделить статик метод и this — проблемы
public class MyObject
{
    static public string MyMethod()
    {
        return "My Static Method";
    }
}
static class TestExtensions
{
    public static String MyMethod(this MyObject myObject){return "Extension";}
}
class Program
{
    static void Main(string[] args)
    {
        MyObject obj=new MyObject();
        Console.WriteLine(obj.MyMethod());//Error Static member 
            //'LINQConsoleApplication1.MyObject.MyMethod()' cannot be accessed 
            //with an instance reference; qualify it with a type name instead
        Console.WriteLine(MyObject.MyMethod());
    }
}

Или то же самое но с помощью модификаторов доступа.
public class MyObject
{
    private string MyMethod()
    {
        return "My Static Method";
    }
}
static class TestExtensions
{
    public static String MyMethod(this MyObject myObject){return "Extension";}
}
class Program
{
    static void Main(string[] args)
    {
        MyObject obj=new MyObject();
        Console.WriteLine(obj.MyMethod());//Error Static member 
            //'LINQConsoleApplication1.MyObject.MyMethod()' cannot be accessed 
            //with an instance reference; qualify it with a type name instead
        Console.WriteLine(MyObject.MyMethod());
    }
}


В саму спецификацию, все это вписывается(если не выдавать ошибку сразу, а дойти до конца поиска с генерацией расширений, и уже если не найден "корректный" метод генерить ошибку компиляции).
Но возможно виноват пункт 3
3. Код работающий за пределами расширяемого класса, должен корректно работать в самом классе. Действительно, если мы при рефакторинге перенесем процедуру(код процедуры) в класс, разрешим namespace, совсем не факт что она заработает как она работала до этого. Скорее всего, это и есть реальная причина.

Ну и последнее, это из спецификации(там это написано красным, чтобы было видно):

Extension methods are less discoverable and more limited in functionality than instance methods. For those reasons, it is recommended that extension methods be used sparingly and only in situations where instance methods are not feasible or possible.


С уважением, Gleb.
Re: Краткий пересказ
От: _FRED_ Черногория
Дата: 19.09.05 15:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>3) Лямбда-выражения.

[...]
AVK>Пример:
AVK>delegate R Func<A,R>(A arg);
AVK>...
AVK>Func<int,int> f1 = x => x + 1;            // Ok
[...]


А зачем они делегат Func (из System.Query) назвали сокращённо? Есть же прекрасное слово Function
Надеюсь, поправят
<< RSDN@Home 1.2.0 alpha rev. 616 >> =07:45= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Краткий пересказ
От: TK Лес кывт.рф
Дата: 19.09.05 15:46
Оценка: -1
Hello, "_FRED_"
>
> А зачем они делегат Func (из System.Query) назвали сокращённо?
> Есть же прекрасное слово Function
> Надеюсь, поправят

А еще есть прекрасное слово "анонимный делегат". А то, понапридумывали
каких-то стрелочек...
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Краткий пересказ
От: GlebZ Россия  
Дата: 19.09.05 15:50
Оценка: 36 (2)
Здравствуйте, _FRED_, Вы писали:

_FR>А зачем они делегат Func (из System.Query) назвали сокращённо? Есть же прекрасное слово Function

_FR>Надеюсь, поправят
Поправляю. Судя по всему ты не любишь Visual Basic. Там уже давно забили это слово под себя.

С уважением, Gleb.
Re[3]: Краткий пересказ
От: _FRED_ Черногория
Дата: 19.09.05 15:55
Оценка:
Здравствуйте, TK, Вы писали:

>> А зачем они делегат Func (из System.Query) назвали сокращённо?

>> Есть же прекрасное слово Function

TK>А еще есть прекрасное слово "анонимный делегат". А то, понапридумывали

TK>каких-то стрелочек...

До этого, если не ошибаюсь, в именах типов не встречались сокращения (не путать с аббревиатурами).
Давай тогда и IsolatedStorageFileStream преобразуем в IsltStrgFileStrm
<< RSDN@Home 1.2.0 alpha rev. 616 >> =07:55= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Краткий пересказ
От: _FRED_ Черногория
Дата: 19.09.05 15:57
Оценка:
Здравствуйте, GlebZ, Вы писали:

_FR>>А зачем они делегат Func (из System.Query) назвали сокращённо? Есть же прекрасное слово Function

_FR>>Надеюсь, поправят
GZ>Поправляю. Судя по всему ты не любишь Visual Basic. Там уже давно забили это слово под себя.

Ага!
Спасибо, вопрос снят.
<< RSDN@Home 1.2.0 alpha rev. 616 >> =07:56= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Краткий пересказ
От: _FRED_ Черногория
Дата: 19.09.05 15:59
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>[...] Судя по всему ты не любишь Visual Basic. [...]


Не пользуюсь просто
<< RSDN@Home 1.2.0 alpha rev. 616 >> =07:58= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Краткий пересказ
От: Igor Trofimov  
Дата: 19.09.05 19:59
Оценка: +1 :)))
_FR>А зачем они делегат Func (из System.Query) назвали сокращённо?

Это маятник назад пошел... скоро вспомним itoa/atoi. Впрочем, любителей cdr/car/caddr уже хоть отбавляй.
Re[2]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 21:32
Оценка: +1
Здравствуйте, _FRED_, Вы писали:


_FR>А зачем они делегат Func (из System.Query) назвали сокращённо? Есть же прекрасное слово Function

_FR>Надеюсь, поправят

Это еще что. А вон зачем было запихивать делегаты общего назначения в пространство имен System.Query?
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Краткий пересказ
От: _FRED_ Черногория
Дата: 20.09.05 07:06
Оценка: +1
Здравствуйте, VladD2, Вы писали:

_FR>>А зачем они делегат Func (из System.Query) назвали сокращённо? Есть же прекрасное слово Function

_FR>>Надеюсь, поправят

VD>Это еще что. А вон зачем было запихивать делегаты общего назначения в пространство имен System.Query?


Я даже сперва подумал, что лямбды ни во что, кроме Func<x, ...> преобразовываться не умеют
Да и давно уже пора пользоваться CommonGenericsLibrary
Автор: VladD2
Дата: 27.08.05
<< RSDN@Home 1.2.0 alpha rev. 616 >> =11:04= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Краткий пересказ
От: GlebZ Россия  
Дата: 23.09.05 16:10
Оценка: 44 (1)
Здравствуйте, VladD2, Вы писали:

VD>Ты кстит, не понял как превратить это АСТ в МСИЛ? Что-то я никак не въеду.


здесь

С уважением, Gleb.
Re[8]: Краткий пересказ
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 00:04
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>здесь


Спасибо, за ссылку. Но к сожалению Espresso слишком сложен и к тому же является закатом солнца врунчю.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Краткий пересказ
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 27.09.05 18:42
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вот бы еще они mixins скоммунизьмили.


Extensions methods предоставляют очень похожие возможности. Лучше их доводить до ума/развивать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Краткий пересказ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.09.05 02:42
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

AVK>>Вот бы еще они mixins скоммунизьмили.


ANS>Extensions methods предоставляют очень похожие возможности.


Похожи на рубишную реализацию, но не на миксины. Миксин, котом нельзя реализовать интерфейс это не миксин.

ANS> Лучше их доводить до ума/развивать.


Мне больше импонирует явная агреация реализаций. Контроля больше и больше соответствует духу шарпа.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.