2/06/2008

Использование Extension Methods для определения event'ов

Например, есть класс TextView, в котором надо реализовать следующий интерфейс:

public interface IEditorService

{

    event EventHandler<KeyEventArgs> KeyDown;

}

 

Для этого в определение класса TextView добавляем IEditorService, ставим курсор на IEditorService, жмем Alt+Shift+F10 и выбираем Explicitly implement interface ‘IEditorService’. В результате получим следующий полуфабрикат:

internal class TextView : IEditorService
{
    event EventHandler<KeyEventArgs> IEditorService.KeyDown

    {

        add { throw new NotImplementedException(); }

        remove { throw new NotImplementedException(); }

    }

}

 

Немного подпиливаем, т.е. доводим до рабочего вида реализацию IEditorService.KeyDown:

 

event EventHandler<KeyEventArgs> IEditorService.KeyDown

{

    add { _KeyDown = (EventHandler<KeyEventArgs>)Delegate.Combine(_KeyDown, value); }

    remove { _KeyDown = (EventHandler<KeyEventArgs>)Delegate.Remove(_KeyDown, value); }

}

private EventHandler<KeyEventArgs> _KeyDown;

 

Так надо было делать раньше, в мрачные времена, еще до появления C# 3.0 и Visual Studio 2008, когда мир не знал про могучие методы расширения (Extension Methods). Теперь все изменилось и IEditorService.KeyDown можно реализовать, например, следующим образом:

 

event EventHandler<KeyEventArgs> IEditorService.KeyDown

{

   add { value.CombineWith(ref  _KeyDown); }

   remove { value.RemoveFrom(ref _KeyDown); }

}

private EventHandler<KeyEventArgs> _KeyDown;

 

Кода меньше, что радует пальцы и мозг J. Хотя больше радуется мозг, потому что пальцам можно помочь с помощью Snippet'ов, поддержка которых есть в Visual Studio.

 

Про снипеты...

В папке «My Documents\Visual Studio 2008\Code Snippets\Visual C#\My Code Snippets» создаем текстовый файл:

 

<?xml version="1.0" encoding="utf-8" ?>

<CodeSnippet Format="1.0.0">

                <Header>

                                <Title>Event Add Remove</Title>

                                <Shortcut>evem</Shortcut>

                                <Description></Description>

                                <SnippetTypes>

                                                <SnippetType>Expansion</SnippetType>

                                </SnippetTypes>

                </Header>

                <Snippet>

                                <Declarations>

                                                <Literal default="true">

                                                                <ID>eh</ID>

                                                                <ToolTip>handler name</ToolTip>

                                                                <Default>_handler</Default>

                                                </Literal>

                                </Declarations>

                                <Code Language="csharp" Format="CData">

                                                <![CDATA[

                                                   add { value.CombineWith(ref $eh$); }

                                                   remove { value.RemoveFrom(ref $eh$); }

                                                ]]>

                                </Code>

                </Snippet>

</CodeSnippet>

 

Сохраняем файл под именем, например, Event.Add.Remove.snippet (где .snippet – это расширение этого файла).

Теперь возвращаемся в редактор кода. Выделяем блоки:

 

        add { throw new NotImplementedException(); }

        remove { throw new NotImplementedException(); }

 

набираем evem (потому что такое значение указано в теге Shortcut, см. выше), жмем Tab два раза (после первого нажатия закроется окно IntelliSense), набираем _KeyDown, жмем Enter. Код создан, руки свободны J.

 

P.S.

Определение методов CombineWith и RemoveFrom:

 

public static class ExtensionMethods

{

   public static void CombineWith<T>(this EventHandler<T> value, ref EventHandler<T> target) where T : EventArgs

   {

       target = (EventHandler<T>) Delegate.Combine(target, value);

   }

   public static void RemoveFrom<T>(this EventHandler<T> value, ref EventHandler<T> target) where T : EventArgs

   {

       target = (EventHandler<T>) Delegate.Remove(target, value);

   }

}

2/04/2008

Так с чего же начать изучение программирования?

Нет да нет на глаза попадаются советы начинающим под заголовком вроде: «С чего же начать изучать программирование?». Под словом программирование подразумевается написание кода на языке C#. Авторы советуют изучить С++, прежде чем начать осваивать C#, так как синтаксис C# основан на C++; затем советуют «обязательно освоить WinAPI, MFC» и под конец «желательно изучить COM». По мнению авторов этот нелегкий путь поможет с легкостью изучить C#.

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

Да, и еще ... язык программирования – это язык. А программист – это переводчик, который умеет свои мысли излагать на другом языке, например, на C#. Известно, что лучшие переводчики с английского – это не те, кто изучал в ВУЗе латынь, а те кто вырос в англоязычной среде.

Под конец, поймите одну простую истину: раз уж весь мир из точки A пришел в точку B и собирается идти в точку C, то чтобы со всем миром двигаться в точку C, не обязательно начинать движение из точки A.

Смотрите туда, куда идете.

Быстрее изучайте C# и обязательно LINQ, хотя найдется тот, кто будет советовать изучить SQL, чтобы лучше понять LINQ J

 

P.S.
Мой путь: GW Basic (кажется так наывался),
Pascal
, Assembler, Prolog, Lisp, C, C++ (вместе с WinAPI и MFC), Java, JavaScript, SQL, C#. Теперь в работе использую: C#, JavaScript (редко), SQL (все реже, потому что в C# 3.0 есть LINQ);  Среда разработки: Visual Studio 2008 (при царе Горохе использовал Borland .... признаюсь, было время, был подвержен истерии под названием «must die», но к счастью это прошло J).

MVC - это на самом деле MS

Смотрим на паттерн Model-View-Controller. Что видим? Видими Controller, под управлением которого находятся View и Model. При этом View и Model ничего не знают друг о друге так же, как и про Controller. Т.е. View и Model можно назвать сервисами. Вуаля, S получили.

Теперь, осталось получить  M. Все просто: в наше время тот, кто хоть чем-то управляет, называется Manager.

Вот и получается, что MVC - это на самом деле MS.

Опять MS, везде MS. Так было и так будет J. И не надо думать, что раз Гейтс уходит, то что-то изменится. Он ушел, чтобы ускорить исследования в области здравоохранения и ... продления жизни. Так что он еще вернется в корпорацию ... помолодевшим J.