вторник, июля 13, 2010

C# 4.0 Новое в языке


Новые возможности .NET 4.0: C# 4.0

После выхода Visual Studio 2010 beta 1 - первым делом нужно разобраться, что же дает нового нам C# 4.0 (так как это мой основной язык программирования - для меня это является важным). Первым делом должен вам порекомендовать примеры C# 4.0, которые можно скачать отсюда (там же есть документ New Features in C# 4.0, которая послужила основой для этого топика). Документацию по .Net Framework 4.0 beta 1 можно посмотреть в MSDN. Дальше будут следовать мой небольшой опыт знакомства с новой версией .NET.

1. Dynamic Language Runtime

Изначально стоит взглянуть на следующую схему, иллюстрирующую архитектуру DLR: 
Именно! Теперь в .net можно еще и скриптовые языки использовать, такие как IronRuby и IronPython. Не думаю, что я буду этим пользоваться, но любителям экзотики предоставляю ссылки:
  • IronPython. - open-source проект на CodePlex.
  • IronRuby. - open-source проект на RubyForge.
Более того, предоставляется исходники DLR, при помощи которых вы, наверняка, сможете создать свой динамический язык для .NET, если вам это необходимо
Итак DLR включает в себя Expression Trees, которые просто являются представлением вызовов методов или бинарных операций в виде дерева, их функциональность можно посмотреть на следующем примере:
Expression<int, bool>> exprTree = num => num < 5;
// Decompose the expression tree.
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}",
               param.Name, left.Name, operation.NodeType, right.Value);
В этом примере мы сначала описываем лямбда выражение x=>x<5, а затем при помощи объектов от Expression Trees разбираем данное выражение.
Call Site caching в DLR - это, насколько я понимаю, и есть динамическое представление вызовов методов динамических объектов или операций над динамическим объектами. DLR кеширует характеристики объектов (о типах объектах), а так же об операции, и если данная операция уже была выполнена ранее, тогда всю необходимую информацию DLR получит уже из кеша (вот как то так).
И последнее в DLR это набор классов, интерфейсов: IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject и ExpandoObject. Давайте опять посмотрим на примере, как нам это может пригодиться, и зачем нам вообще нужен этот DLR:
class Test1
{
}
 
static void Main(string[] args)
{
  dynamic t = new Test1();
  string str = t.Hello(); // Error 1 
 
  dynamic d = 7.0;
  int i = d; // Error 2
}
На удивление данный код скомпилируется и запустится. Все дело в волшебном слове dynamic, оно нам позволяет вызывать любые по имени свойства или методы, а так же приводить объект к любому типу. Во время Runtime (выполнения кода) вылетят ошибки, Error 1: о том, что метод не найден, Error 2: о том, что double невозможно привести к int. Попробуем их исправить:  для исправления первой ошибки наш класс Test1 отнаследуем от типа System.Dynamic.DynamicObject и перегрузим один из методов, для исправления второй просто явно укажем преобразование типов:
class Test1 : DynamicObject
{
  public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  {
    if (binder.Name == "Hello")
    {
      result = "Test1 is Dynamic Object!";
      return true;
    }
    return base.TryInvokeMember(binder, args, out result);
  }
}
 
static void Main(string[] args)
{
  dynamic t = new Test1();
  string str = t.Hello(); 
 
  dynamic d = 7.0;
  int i = (int) d;
}
Теперь наш код будет работать. Переменная str получить значение "Test1 is dynamic object!", а значение 7.
Конечно, необязательно наследоваться от класса DynamicObject, можно отнаследоваться и от интерфейсаIDynamicMetaObjectProvider, но тогда нужно будет самому реализовывать метод  DynamicMetaObject GetMetaObject(Expression parameter), и более того реализовывать свой тип, унаследованный от DynamicMetaObject, ну в любом случае варианты есть - так что можно взять на вооружение.

2. Именованные и необязательные параметры в методах

Это достаточно простая функциональность и уже много где оговорена, она хорошо описана вот например тут (на русском языке одним из автором хабрахабра). Если парой слов, то это возможность устанавливать дефолтные значения у параметров методов, а так же возможность установки значения параметра по имени при вызове метода. В общем пример будет лучшим объяснением:
class Test1 
{
  public void Method(int a = 0, string b = "Hello", bool c = true)
  {
    Console.WriteLine("{0}, {1}, {2}", a, b, c);
  }
}
 
static void Main(string[] args)
{
  Test1 o = new Test1();
  // Вызовем по как обычно
  o.Method(1, "Hello", true);
  // А можно поменять порядок параметров
  o.Method(b: "hello", c: true, a: 1);
  // Можно вообще ничего не вызывать
  // (установлены значения по умолчанию у всех параметров)
  o.Method();
  // Можно определить только необходимые параметры
  o.Method(1, "Hello");
  // И не обязательно по порядку
  o.Method(c: false);
}
Теперь из- за переименование параметра метода, код может и не скомпилироваться, если кто-то использовал установку значения по имени, так что нужно быть аккуратнее. Я рад дефолтным значениям, и постараюсь не использовать функциональность именованных параметров.
В дополнение хочу сказать, что если все таки будет у класса Test1 метод void Method(int a), тогда при вызове o.Method(1)вызовится именно он, а не метод из примера с дефолтными значениями.

3. Возможности для COM Interop

DLR так же дал новые возможности для COM Interop, теперь  можно COM объекты определять как динамические (точнее они уже являются в большинстве своем динамического типа) и не приводить постоянно получаемые объекты к определенным типам для вызова методов или свойств.
excel.Cells[1, 1].Value = "Hello";
// вместо 
((Excel.Range)excel.Cells[1, 1]).Value2 = "Hello";
Данный пример взят из документа New Futures in C# 4.0 С одной стороны приятно, что теперь не нужно мучаться и находить к какому же типу нужно привести объект, чтобы вызвать его свойство или метод, но с другой стороны теряется IntelliSense.

4. Новое в generic

Теперь обогатился и generic новой функциональностью. Можно теперь у интерфейсов и у делегатов перед определением generic типов писать out и in, зачем это чуть дальше, а сначала рассмотрим пример.
При работе с generic часто хочется сделать что то типа такого:
IList<string> strings = new List<string>();
IList<object> objects = strings;
Но нельзя. Потому, что следом можно написать:
objects[0] = 5;
string s = strings[0];
То есть, изначально у нас был список строк, потом обозначили его как список объектов, и хотим уже работать с ним, как с объектами, устанавливая любой другой объект в него, хотя список до сих пор является списком строк.
Но, если вдуматься, то можно представить, что если бы список был только для чтения, то мы бы уже не смогли ничего нарушить, и там бы логика была ясна, потому следующий код на C# 4.0 будет работать:
IEnumerable<object> objects = strings;
Огромную полезность данная функциональность принесет в работе с linq, там часто возникают проблемы, что возвращаем объекты одного типа, а нужно получить список другого типа (базового).
Итак, как же такое стало возможным. Сначала рассмотрим слово out. Теперь интерфейс IEnumerable объявлен какIEnumerable, где out обозначает, что тип может быть использован только для возвращения значений, в другом случае компилятор будет ругаться, ну и более того это дает нам, что интерфейс IEnumerable так же есть и IEnumerable, если у есть возможность приведения типа к B, если на простом примере, то IEnumerable, есть теперь и IEnumerable. Вот пример:
public interface IEnumerable<out T> : IEnumerable
{
  IEnumerator GetEnumerator();
}
public interface IEnumerator<out T> : IEnumerator
{
  bool MoveNext();
  T Current { get; }
}
Есть еще слово in. Его так же можно использовать в описании generic делегатов и интерфейсов. Несет оно такую же смысл как и слово out, только в данному случае описанный тип можно использовать только в передаче параметров, вот пример:
public interface IComparer<in T>
{
  public int Compare(T left, T right);
}
То есть в данном случае, если IComparer может считаться и IComparer, потому как если уж он может сравнивать объекты типа object, то и string тоже может.
Так же, как я уже сказал, слова out и in можно применять и к интерфейсам, так, например:
public delegate TResult Func<in TArg, out TResult>(TArg arg);

Заключение

Так же в .NET 4.0 появилось много новвовведений, таких как  Lazy Initialiation - память под объект выделяется тогда, когда это действительно становится нужно. Появились новые типы, как например, BigInteger - теперь не нужно для лабораторных работ студентам писать свои классы для работы с большими числами ;), SortedSet - класс представляет собой самостоятельное балансированное дерево, которое сохраняет данные в отсортированном порядке после вставки, удаления и поиска. В общем, есть еще что изучать.

понедельник, июля 12, 2010

Запуск newresults.ru

Сегодня состоялся запуск портала http://newresults.ru/.

Информационная интернет-площадка для специалистов в области промышленной
переработки молока и сыроделия.
Представляет материалы по технологиям зарубежных сыров (для адаптации
и использования на российских предприятиях), организует обучение новым
технологиям или консультации по улучшению существующих, предлагает индивидуальные решения по подбору сыродельного оборудования.


Если вы не можете найти нужную вам информацию на сайте - пишите администрации : они вам подберут необходимую информацию.  Портал пока находится в режиме наполнения информацией.

Новая карьера : возможности и цели

Пришло приглашение об устройстве на работу в Таском
Буду устраиваться. Должность там интересная. Компания вроде долго уже на рынке ИТ. Как мне видится - есть возможность для карьерного роста. Именно это и ставлю своей целью. О прогрессе по цели буду писать тут

воскресенье, июля 11, 2010

Оплати себе связь и не только

С тех пор как я ушел с работы работаю на фрилансе. И теперь для меня всегда стоит актуальный вопрос быть всегда на связи. Немного поразмыслив я решил что раз-уж я и так вынужден вести сетевую активность то почему-бы не начать иметь  этого бонусы, так сказать.
Рассмотрев несколько вариантов с биржами статей я понял что в это уже становится не актуально - высокая конкуренция среди авторов. И тут я вспомнил что сам с пол-года назад пользовался сервисами blogun.ru . Решил попробовать и вот пришел к выводу что даже при минимальных затратах времени я смогу оплачивать себе и сотовую связь (около 100$/мес) и интернет.
Теперь я считаю что если вы умеете считать деньги - просто не имеете права пропускать такую возможность.

суббота, июля 10, 2010

Создание сайтов


Предлагаю услуги по созданию  сайтов любой сложности (Php или asp.net) а так-же по созданию приложений (полный цикл от выявления требований и выработки ТЗ до ввода в эксплуатацию).
Для уточнения деталей пишите на tvoyfrut (a) g m a i l .com
с пометкой "работа"
Цены на создание сайтов и программ высылаю в ответ на письмо.

четверг, июля 08, 2010

Заработал снова.


Мой блог заработал снова. Теперь тут будет появлятся полезная информация о C# , PHP  и PERL и не только.

пятница, июня 11, 2010

Трансхим


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

[**На правах рекламы**]

вторник, декабря 11, 2007

Пиратство и Сеть

Тут вот по асе прислали статью о пиратстве (рассуждает создатель печатного агенства O'Relly) вот несколько цитат:
Пиратство - прогрессивный налог
Для большинства тех, кто творит в безвестности, является большим успехом прослыть настолько известным, чтобы стать жертвой пиратов. Пиратство - это, по сути, разновидность прогрессивного налога, который может срезать несколько процентов с доходов популярных авторов (я говорю "может", так как даже этот факт не доказан). Что означает огромную выгоду для тех, чьи доходы растут с ростом известности.
И самое интересное что похожей политики придерживается Oracle - они говорят что у них нету "левых" копия сервера баз данных, а есть только копии с не активное поддержкой,и что если у вас хватает сил на поддержание вашей базы данных то как клиент вы не очень им интересны. А когда база вырастет - тогда и придется потратится. Так что все копии их сервера можно рассматривать как рекламу.
Вот еще один интересный факт
Издательство O'Reilly публикует в Сети много книг. Находятся те, кто использует это для распространения контрафактных копий. (Для нас серьезной проблемой, кстати, являются не файлообменные сети, а размещение наших изданий серии CD Bookshelf на публичных веб-серверах, либо массовое тиражирование дисков и их продажа на eBay). Пиратские копии раздражают, но они едва ли мешают нашему бизнесу. Мы не заметили сколько-нибудь серьезного сокращения продаж печатных книг, которые одновременно предлагаются читателю в электронном виде.

Вот еще
Тот факт, что программное обеспечение Microsoft в течение многих лет было доступно на warez-сайтах (а сейчас - в сетях обмена файлами), не помешал ей стать одной из крупнейших в мире компаний. Оценки "упущенных" доходов основываются на предположении, что незаконные копии были бы в противном случае оплачены. С другой стороны, при этом не учитываются продажи, которые состоялись вследствие популярности, которую продукт набрал именно благодаря незаконным копиям.
Так что пиратство очень сложная тема... думайте сами =) Полная статья - тут

вторник, декабря 04, 2007

Чек

На чеке сумма: [0.002 + e^(2*Pi)] = 535.493... и предел суммы (1/2^n) при n стремящемся к бесконечности = 1. Так что чек выписан примерно 536.59$ =)

пятница, ноября 09, 2007

Немного шуточек

# Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning.
Anon
# If you lie to the compiler, it will get its revenge.
Henry Spencer
# Be careful about using the following code -- I've only proven that it works, I haven't tested it.
Donald Knuth
# The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt.
Bertrand Russell
# The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.
Tom Cargill

Гифка

Noooo!
Uploaded: October 20, 2007
Size: 250x250 (61kb)