вторник, 21 сентября 2010 г.

Золотая сервировка, C# и методы расширения

Привет тебе, некто, вот и минуло полтора года со дня моего последнего поста. Что я делал? Работал. Я точно знаю, что тебе плевать, но раз уж читаешь, то читай. Блог, куда я переезжал благополучно умер и я решил вернуться в уютненький гуглосервис. Нужно было что-то написать, что-бы окончательно оформить возвращение. Что? Кто знает, в голову програмистского ничего не идет, написал о том, что лежало на поверхности, о том, что я каждодневно использую в работе — о синтаксических подсластителях, которые сделали мой код красивее и моднее. Почему меня больше волнует красота? Вот почему: память в основном ест графика(wpf), время по большей части на общение с сервером, так почему бы не сделать свою работу приятнее? Вот и сделал, на авторство первого не претендую, на оригинальность остального тем более, просто уж очень хотелось написать.


Цикл с известным числом повторений (найдено вконтакте)
public static class Extensions
{
    public static void Times(this int subj, Action<int> obj)
    {
        if(obj!=null)
            for (int i = 0; i < subj; i++)
                obj(i);
    }
}

Применение:
5.Times(x =>
{
    Console.WriteLine(x);/*x позволяет получить доступ к текущему значению итератора*/
});
 


Сокращенный вызов String.Format
public static string FormatFor(this string subj, params object[] obj)
{
    return string.Format(subj, obj);
}

Применение:
"Привет {0}, у меня есть {1} штук".FormatFor("Stranger", 8);


Добавление элемента в коллекцию с проверкой его уникальности для коллекции (List)
public static void AddUnique<T>(this List<T> subj, T obj)
{
    if (!subj.Contains(obj)) lock(subj)subj.Add(obj);
}

Применение:
List<int> l = new List<int>();
l.AddUnique(5);//Добавит 5 в коллекцию, если та не содержит 5


Наукообразный вынос мозга, смысл не ясен, но можно извлечь пользу
namespace myBrainFuck
{
    public static class TrollExtensions
    {
          public static void ExecAction<T>(this T subj, Action<T> action)
          {
               if(action!=null)action(subj);
          }
    }
}

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

Применение:
new char[] { 'a', 'b', 'c' }.ExecAction(x =>
{
    for (int i = 0; i < x.Length; i++)                
        Console.WriteLine(x[i]);                
});