Как вы видите .NET / C# 5.0?
Совсем недавно мы получили релиз .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 и какие из выше перечисленных идей вы хотели бы использовать?