Нові можливості. NET 4.0: C # 4.0 (вихідні коди), Різне, Програмування, статті

Після виходу Visual Studio 2010 – насамперед потрібно розібратися, що ж дає нового нам C # 4.0 (на час написання статті була версія beta 1). Насамперед мушу вам порекомендувати приклади C # 4.0, які можна завантажити звідси (Там же є документ New Features in C # 4.0, яка послужила основою для цієї стаьі). Документацію по. Net Framework 4.0 можна також подивитися в MSDN. Отже, давайте подивимося, що ж нам дає C # версії 4.0.

1. Dynamic Language Runtime


Щоб зрозуміти, що таке Dynamic Language Runtime (далі просто DLR), я повинен спочатку звернути ваш погляд на наступну схему, яка ілюструє архітектуру DLR:



Саме! Тепер в. Net можна ще й скриптові мови використовувати, такі як IronRuby і IronPython. Звичайно, навряд чи багато хто буде ними користуватися, але це дає додаткові можливості в реалізації ваших програм. Для того, щоб мати можливість використовувати дані мови необхідно скачати і встановити відповідні проекти:



Так само, надається исходники DLR, За допомогою яких ви, напевно, зможете створити свій динамічний мова для. NET, якщо у вас є в цьому необхідність.


Тепер давайте розглянемо докладніше, що з себе представляє DLR. Отже DLR включає в себе Expression Trees (дерева вираження – якщо переводити дослівно), які просто є поданням викликів методів або бінарних операцій у вигляді дерева, їх функціональність можна подивитися на наступному прикладі

Expression<Func<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);

У цьому прикладі ми спочатку описуємо лямбда виразnum=>num<5, А потім за допомогою об’єктів від Expression Trees розбираємо даний вираз.


Call Site caching в DLR – це і є динамічне представлення викликів методів динамічних об’єктів або операцій над динамічним об’єктами. DLR кешує характеристики об’єктів (про типи об’єктах), а так само про операцію, і якщо дана операція вже була виконана раніше, тоді всю необхідну інформацію DLR отримає вже з кешу.


І останнє в DLR – це набір класів і інтерфейсів: IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject і ExpandoObject. Давайте знову подивимося на прикладі, як нам це може стати в нагоді, і навіщо нам взагалі потрібен цей DLR:  blockquote { background-color:white; border-left: 2px solid gray; margin-left:5px; padding: 5px 10px 5px 10px; }

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!”, А i значення 7.


Звичайно, необов’язково успадковуватися від класуDynamicObject, Можна отнаследоваться і від інтерфейсу IDynamicMetaObjectProvider, Але тоді потрібно буде самому реалізовувати методDynamicMetaObject GetMetaObject(Expression parameter), І більше того реалізовувати свій тип, успадкований від DynamicMetaObject, Ну в будь-якому випадку варіанти є – так що можна взяти на озброєння.


2. Іменовані і необов’язкові параметри в методах


Функціональність необов’язкових параметром існує в багатьох мовах, в C # вона ж приходить тільки у версії 4.0, і більш того тут же з’являються ще й іменовані параметри. Тепер є можливість встановлювати дефолтні значення у параметрів методів, а так само можливість установки значення параметра на ім’я при виклику методу. Давайте розглянемо на прикладі:

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


В C # 4.0 збагатився і 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<T> оголошений як IEnumerable<out T>, Де out позначає, що тип T може бути використаний тільки для повернення значень, в іншому випадку компілятор буде лаятися, ну і більш того це дає нам, що інтерфейс IEnumerable<A> так само є й IEnumerable<B>, Якщо у A є можливість приведення типу до B, Якщо на простому прикладі, то IEnumerable<string>, Є тепер і IEnumerable<object>. Ось приклад:

public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> 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<object> може вважатися і IComparer<string>, Тому якщо вже він може порівнювати об’єкти типу object, То і string теж може.


Так само, як я вже сказав, слова out і in можна застосовувати і до інтерфейсів, так, наприклад:

public delegate TResult Func<in TArg, out TResult>(TArg arg);

 

Висновок


Також в. NET 4.0 з’явилося багато новвовведеній, таких як Lazy Initialiation – Пам’ять під об’єкт виділяється тоді, коли це дійсно ставати потрібно. З’явилися нові типи, як наприклад, BigInteger – Тепер не потрібно для лабораторних робіт студентам писати свої класи для роботи з великими числами, SortedSet<T> – Клас є окремими балансувало дерево, яке зберігає дані в відсортованому порядку після вставки, видалення та пошуку. Загалом є ще що вивчати.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*