Pull to refresh

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

Reading time5 min
Views5.3K
Совсем недавно мы получили релиз .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 в сокращенном виде, например:

public stringintdouble ReturnMyTuple()
{
    return "Hello World!"424.2;
}

или

public Tuple<stringintdouble> ReturnMyTuple()
{
    return "Hello World!"424.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>(enum) where T: System.Enum { ... }

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

А почему бы в generic методы не добавить поддержку операторов?
T Add<T>(T a, T b)
{
    return a + b;
}

In Keyword и Ranges


Простой способ проверить входит ли переменная в определенный набор или диапазон значений:
if (in (123)) { }
 
if (in [5..10]) { }
 
if (in [12, 4..8, 10]) { }

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


Сам иногда задумывался, почему бы не сделать кроме методов-расширений еще и свойств-расширений. Т.е. вместо
var value = someObject.Value();

писать просто
var value = someObject.Value;

Умный switch


Давайте расширим switch для поддержки выражений, условий и т.д.:
   switch (anInt)
    {
        case 12: 
            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 и какие из выше перечисленных идей вы хотели бы использовать?
Tags:
Hubs:
Total votes 33: ↑19 and ↓14+5
Comments76

Articles