Совсем недавно мы получили релиз .NET / C# 4.0. Мы много говорили (и еще будем говорить) о новых возможностях и нововведениях новой платформы и языка. Но уже можно сделать какие-то выводы и подумать, что же мы хотим увидеть в новой версии .NET / C# 5.0?
В 4.0 появился новый тип данных Tuple, который можно использовать таким образом:
Было замечательно использовать Tuple в сокращенном виде, например:
или
Было бы хорошо передавать enums в generic методы, например:
Еще можно сделать enums классами (как это сейчас в Java).
А почему бы в generic методы не добавить поддержку операторов?
Простой способ проверить входит ли переменная в определенный набор или диапазон значений:
Сам иногда задумывался, почему бы не сделать кроме методов-расширений еще и свойств-расширений. Т.е. вместо
писать просто
Давайте расширим switch для поддержки выражений, условий и т.д.:
Кстати, VB.NET поддерживает такой синтаксис.
В принципе, хорошая идея:
Часто необходимо использовать свойство некоторого свойства объекта, что приводит к большой череде проверок. Почему бы не сделать так:
Или например вместо
писать
Ну что-то типа такого:
Хотя что-то похожее можно делать и сейчас — обрабатывать необходимые исключения в порядке важности, а все остальные — с помощью общего Exception.
Множественное наследование, виртуальные методы-расширения, возможность обрабатывать файлы с длинными именами… Вы можете поучаствовать в обсуждении этого вопроса на stackoverflow.
А что бы вы хотели увидеть в .NET / C# 5.0 и какие из выше перечисленных идей вы хотели бы использовать?
Tuple Packaging and Unpackaging
В 4.0 появился новый тип данных Tuple, который можно использовать таким образом:
var data = new Tuple<string,int>(“John Doe”, 42);
Было замечательно использовать Tuple в сокращенном виде, например:
public string, int, double ReturnMyTuple()
{
return "Hello World!", 42, 4.2;
}
или
public Tuple<string, int, double> ReturnMyTuple()
{
return "Hello World!", 42, 4.2;
}
// elsewhere: item1 is a string, item2 is an int, item3 is a double.
var item1, item2, item3 = ReturnMyTuple();
Enums, Generics
Было бы хорошо передавать enums в generic методы, например:
public void DoSomething<T>(T enum) where T: System.Enum { ... }
Еще можно сделать enums классами (как это сейчас в Java).
А почему бы в generic методы не добавить поддержку операторов?
T Add<T>(T a, T b)
{
return a + b;
}
In Keyword и Ranges
Простой способ проверить входит ли переменная в определенный набор или диапазон значений:
if (x in (1, 2, 3)) { }
if (x in [5..10]) { }
if (x in [1, 2, 4..8, 10]) { }
Свойства-расширения
Сам иногда задумывался, почему бы не сделать кроме методов-расширений еще и свойств-расширений. Т.е. вместо
var value = someObject.Value();
писать просто
var value = someObject.Value;
Умный switch
Давайте расширим switch для поддержки выражений, условий и т.д.:
switch (anInt)
{
case 1, 2:
Console.WriteLine("1 or 2");
break;
case 3..9:
Console.WriteLine("3 to 9");
break;
case >= 10:
Console.WriteLine("10 or higher");
break;
default:
…
}
switch (aString)
{
case "one", "two":
Console.WriteLine("1 or 2");
break;
case "three":
Console.WriteLine("3");
break;
default:
…
}
switch (aString)
{
case .IsNullOrEmpty():
…
case .Length > 100:
…
case .Contains("foo"):
…
}
Кстати, VB.NET поддерживает такой синтаксис.
Автоматические флаги у Enums
В принципе, хорошая идея:
[Flags]
public enum MyFlags
{
Value1, // 1
Value2, // 2
ValueCombining1And2 = Value1 | Value2, // 3
Value3, // 4
Value4, // 8
ValueCombining3And4 = Value3 | Value4 // 12
}
Более продвинутая проверка на null
Часто необходимо использовать свойство некоторого свойства объекта, что приводит к большой череде проверок. Почему бы не сделать так:
MyClass value=null;
int something=value.x.y ??? 0; // здесь можно использовать тройной символ ?
//something is now 0
Или например вместо
var obj = Foo();
Bar value = null;
if(obj.Bar != null && obj.Bar.Something != null)
{
value = obj.Bar.Something.DoSomething();
}
писать
var obj = Foo();
var value = obj?.Bar?.Something?.DoSomething();
Группировка исключений
Ну что-то типа такого:
try
{
}
catch (ArgumentOutOfRangeException)
catch (ArgumentNullException)
{
// Catch a ArgumentOutOfRangeException or a ArgumentNullException
}
Хотя что-то похожее можно делать и сейчас — обрабатывать необходимые исключения в порядке важности, а все остальные — с помощью общего Exception.
Еще...
Множественное наследование, виртуальные методы-расширения, возможность обрабатывать файлы с длинными именами… Вы можете поучаствовать в обсуждении этого вопроса на stackoverflow.
А что бы вы хотели увидеть в .NET / C# 5.0 и какие из выше перечисленных идей вы хотели бы использовать?