Как вы видите .NET / C# 5.0?

пятница, 21 мая 2010, Александр Краковецкий

Совсем недавно мы получили релиз .NET / C# 4.0. Мы много говорили (и еще будем говорить) о новых возможностях и нововведениях новой платформы и языка. Но уже можно сделать какие-то выводы и подумать, что же мы хотим увидеть в новой версии .NET / C# 5.0?

Tuple Packaging and Unpackaging

В 4.0 появился новый тип данных Tuple, который можно использовать таким образом:

var data = new Tuple<string,int>(“John Doe”, 42);

Было замечательно использовать Tuple в сокращенном виде, например:

<code>public string, int, double ReturnMyTuple()<br />{<br />    return "Hello World!", 42, 4.2;<br />}<br /></code>

или

<code>public Tuple<string, int, double> ReturnMyTuple()<br />{<br />    return "Hello World!", 42, 4.2;<br />}<br /><br />// elsewhere: item1 is a string, item2 is an int, item3 is a double. <br />var item1, item2, item3 = ReturnMyTuple();<br /></code>

Enums, Generics

Было бы хорошо передавать enums в generic методы, например:

<code>public void DoSomething<T>(T enum) where T: System.Enum { ... }<br /></code>

Еще можно сделать enums классами (как это сейчас в Java).

А почему бы в generic методы не добавить поддержку операторов?

<code>T Add<T>(T a, T b)<br />{<br />    return a + b;<br />}<br /></code>

In Keyword и Ranges

Простой способ проверить входит ли переменная в определенный набор или диапазон значений:

<code>if (x in (1, 2, 3)) { }<br /></code><code><br />if (x in [5..10]) { }</code><code><br /><br />if (x in [1, 2, 4..8, 10]) { }<br /></code>

Свойства-расширения

Сам иногда задумывался, почему бы не сделать кроме методов-расширений еще и свойств-расширений. Т.е. вместо

<code>var value = someObject.Value();<br /></code>

писать просто

<code>var value = someObject.Value;<br /></code>

Умный switch

Давайте расширим switch для поддержки выражений, условий и т.д.:

<code>    switch (anInt)<br />    {<br />        case 1, 2: <br />            Console.WriteLine("1 or 2");<br />            break;<br />        case 3..9:<br />            Console.WriteLine("3 to 9");<br />            break;<br />        case >= 10:<br />            Console.WriteLine("10 or higher");<br />            break;<br />        default:<br />            ...<br />    }<br /><br /></code><code>    switch (aString)<br />    {<br />        case "one", "two":<br />            Console.WriteLine("1 or 2");<br />            break;<br />        case "three":<br />            Console.WriteLine("3");<br />            break;<br />        default:<br />            ...<br />    }<br /></code><br /><code>    switch (aString)<br />    {<br />        case .IsNullOrEmpty():<br />            ...<br />        case .Length > 100:<br />            ...<br />        case .Contains("foo"):<br />            ...<br />     }</code><br />

Кстати, VB.NET поддерживает такой синтаксис.

Автоматические флаги у Enums

В принципе, хорошая идея:

<code>[Flags]<br />public enum MyFlags<br />{<br />    Value1,   // 1<br />    Value2,   // 2<br />    ValueCombining1And2 = Value1 | Value2, // 3<br />    Value3,   // 4<br />    Value4,   // 8<br />    ValueCombining3And4 = Value3 | Value4 // 12    <br />}<br /></code>

Более продвинутая проверка на null

Часто необходимо использовать свойство некоторого свойства объекта, что приводит к большой череде проверок. Почему бы не сделать так:

<code>MyClass value=null;<br />int something=value.x.y ??? 0; // здесь можно использовать тройной символ ?<br />//something is now 0<br /></code>

Или например вместо

<code>var obj = Foo();<br />Bar value = null;<br />if(obj.Bar != null && obj.Bar.Something != null)<br />{<br />  value = obj.Bar.Something.DoSomething();<br />}<br /></code>

писать

<code>var obj = Foo();<br />var value = obj?.Bar?.Something?.DoSomething();<br /></code>

Группировка исключений

Ну что-то типа такого:

<code>try<br />{<br />}<br />catch (ArgumentOutOfRangeException)<br />catch (ArgumentNullException)<br />{<br />   // Catch a ArgumentOutOfRangeException or a ArgumentNullException<br />}<br /></code>

Хотя что-то похожее можно делать и сейчас - обрабатывать необходимые исключения в порядке важности, а все остальные - с помощью общего Exception.

Еще...

Множественное наследование, виртуальные методы-расширения, возможность обрабатывать файлы с длинными именами...  Вы можете поучаствовать в обсуждении этого вопроса на stackoverflow.

А что бы вы хотели увидеть в .NET / C# 5.0 и какие из выше перечисленных идей вы хотели бы использовать?


Ищите нас в интернетах!

Комментарии

Свежие вакансии