14.04.2010

Object Initializers в C# 3.0 или как не писать много конструкторов

В C# 3.0 появилась замечательная вещь - инициализаторы объектов (Object Initializers). Это, в принципе, syntactic sugar, и реально позволяет создавать объекты "короче", а значит, код становится простым и читаемым.

Рассмотрим, как раньше мы создавали объект:
class Contact
{
    public string Name { get; set; }
    public int YearofBirth { get; set; }
}

Contact c1 = new Contact();
c1.Name = "John";
c1.YearofBirth = 1980;

Если мы напишем для класса конструктор с двумя параметрами, то инициализация станет короче:
Contact c1 = new Contact("John", 1980);

Минус очевиден - для каждого набора параметров надо писать свой конструктор (значения по умолчанию для параметров появились лишь в C# 4.0). Но теперь нам доступен другой способ инициализации:
Contact c1 = new Contact { Name = "John", YearofBirth = 1980 };

Присваивания свойств идут через запятую в фигурных скобках, внутри скобок ";" не ставится.

Предположим, что конструктор обязательно должен принимать Name. Тогда можно инициализировать объект следующим образом:
Contact c1 = new Contact("Wei-Meng Lee") { YearofBirth=1980 };

Теперь мы имеем эффективное средство для инициализации свойств для ленивых, т.е. для нас, программистов.

Похожим образом теперь можно создавать коллекции - это называется Collection Initializers:

раньше
List Contacts = new List ();
Contacts.Add(new Contact { Name = "John", YearofBirth = 1980 });
Contacts.Add(new Contact { Name = "Mary", YearofBirth = 1986 });
Contacts.Add(new Contact { Name = "Richard",YearofBirth=1948 });

теперь
List Contacts = new List() {
    new Contact { Name = "John", YearofBirth = 1980 },
    new Contact { Name = "Mary", YearofBirth = 1986 },
    new Contact { Name = "Richard", YearofBirth = 1948 }
};

10.04.2010

Тестовый smtp-сервер с помощью python

Оказывается, Питон прямо "из коробки" умеет делать fake stmp server, никуда ничего не отправляющий, а логирующий все в stdout (в консоль, да). Все, что для этого надо - поставить python и набрать в командной строке

python -m smtpd -n -c DebuggingServer localhost:25

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

Если кто не понял, зачем это надо: есть задача проверить рассылку писем на много адресов, а спамить никого не охота, да и самому заводить много ящиков лень. Вот тогда вы берете Python и запускаете отладочный smtp-сервер. Пишите письма на здоровье!