>// elsewhere: item1 is a string, item2 is an int, item3 is a double.
>var item1, item2, item3 = ReturnMyTuple();
а это вообще от ПХПшников, похоже:))
list($a, $b, $c) = mysql_fetch_row($res);
Видел список нововведений C# 4.0 Задавал себе вопрос- неужели это кому то надо?
В итоге понравилось, применяю.
Сейчас смотрю на список, что Вы предлагаете и опять тоже самое: Неужели кому то надо?
Интересно, примут ли эти новинки… То что предлагаете по части Tuple лично меня пугает.
Нет строгости как то!
Отчасти согласен. Но когда-то я не мог понять зачем необходимы лямбда-выражения — они казались очень сложными и не понятными. А сейчас не знаю, чтобы без них делал.
Tuple нужны. Бывает нужно вернуть два-три значения и приходится изворачиваться, чтобы выглядело красиво, а с tuples все красиво выглядит, если синтаксис не перегружен.
Я не спорю что Tuble нужны. Меня шокирует вот такие способы
public string, int, double ReturnMyTuple()
{
return «Hello World!», 42, 4.2;
}
Функция возвращающая несколько типов, не объединенных в один тип tuple на мой взгляд убивает строгость.
Кортежи (tuple) — это и есть та самя сущность, чтобы не создавать мелкий класс, который нужен только здесь и там, где вызывается. В результате получаем удобство и скорость разработки.
Конечно, когда вы возвращаете Point, то нужен класс, потму что, скорее всего, потребуются какие-то методы.
А когда вы возвращаете текстовое сообщение и флаг критичности сообщения, то обычно можно обойтись и кортежем.
По-моему, синтаксические красявости убивают понимание.
Апофеоз краткости — это c++, в котором в одну строку можно столько всякой логики засунуть (с циклами, проверками, инкрементированием, побитовыми операциями), что смысл выполняемого кода пропадает совсем.
То же касается и Ваших предложений по Tuple и var.
Например, в случае
var value = someObject.Value;
метод без скобок — это указатель на метод, который уже сейчас можно присваивать делегату, но уж никак не вызов метода без параметров, для меня по крайней мере.
Спасибо за комментарий, но справедливости ради нужно заметить, что моих предложений здесь нет — я всего лишь отобрал интересные, на мой взгляд, пожелания.
А вот то, что можно кучу логики запихнуть в одну строку не всегда оправдано — всегда нужно сохранять компромисс между краткостью и читабельностью.
1. Множественное наследование, виртуальные методы-расширения — это адский идиотизм, убивать сразу тех, кто даже подумывает чтобы ввести это с C# или Java.
2. В случае с if (x in [1, 2, 4..8, 10]) { } вы просто будете подталкивать говнокодеров к хардкоду, а не выносить параметры приложения в конфиги.
3. Автофлаги приведут к неподдерживаемому коду и адской несовместимости между версиями приложения.
4. про ??? я уже молчу. а чё, давайте введём ???? и ?????
ну и далее по списку…
из полезного я увидел только дополнительные ограничения в дженериках. вот этого да, действительно не хватает.
АОП позволяет реализовать подобные вещи довольно красиво. У PostSharp есть видео, в котором все показано. АОП — это просто!
Честно говоря, удивлен, что в C#4 не реализовали «нативный» АОП.
1) Я маленько неточно выразился, не массив, а аррэй/вектор, т.е. чтобы в него добавлять/удалять можно было. Ну и new[] не очень радует… Правда C# от него, скорее всего, никуда не денется. Но спасибо за вариант.
Вот от List и от Dictionary бы избавиться — об этом и речь. Ведь для чего это нужно? Чтобы по месту создавать данные объекты, не писать лишнего, и чтобы это читалось хорошо, сравните:
test.SendData( new List{1,3,5} );
test.SendData( [1,3,5] );
А мне это как раз не нравиться.
Если SendData будет иметь кучу перегрузок:
public void SendData(object o){...}
public void SendData(List list){...}
public void SendData(ArrayList list){...}
public void SendData(int[] array){...}
или что ещё хуже
public void SendData(T data){...}
то компилятору будет сложно понять какой из этих методов надо вызывать.
А это ветка не про C# случаем? Причем тут javascript?
Мне в шарпе не хватает тех плюшек, что есть в Actionscript.
Про проверку на null я уже молчу:
[AS3]: if( object ) ...;
[C#] if( object != null ) ...;
Этого даже просить бессмысленно — оно не укладывается в стандарт C#.
И что в нем плохого? Что меньше писать нужно?
Или он таит в себе опасность какую-то?
Вы не путайте опасность приведения типов и данный случай. Здесь ничего плохого произойти не может в принципе.
Я тоже год назад сказал бы, что так писать нельзя и плохо, и опасно.
А оказалось встречаются ситуации, когда это и не слишком опасно и удобно и быстро и нужно.
И C# служит ровно для тех же целей, раз он dynamic, значит можно и нужно (если, конечно, производительность не критична).
Эээ… какбэ C# ниразу не dynamic, просто в .NET 4 ввели новый динамический тип dynamic. И ввели его руководствуясь в основном двумя причинами:
1. Взаимодействие с COM
2. Взаимодействие с динамическими языками на базе .NET (IronPython, IronRuby, etc.)
> обрабатывать необходимые исключения в порядке важности, а все остальные — с помощью общего Exception.
Это некрасивый костыль, Pokemon Exception Handling
Мне бы хотелось увеличения мощности стандартных .NET-классов, особенно, в плане математики.
Что мне очень понравилось в .NET 4.0 — это классы BigInteger и Complex. Но их можно было бы реализовать с более богатым функционалом (посмотреть хотя бы BigInteger из Java), а так же добавить много новых классов. Скажем класс BigDecimal (который, опять таки, в Java есть), класс для работы с матрицами произвольных размерностей и т.д.
Больше всего меня расстраивает отсутствие возможности сделать атрибут вида
[Validator(v => v >= 10)]
int MyProp { get; set; }
ну или хотя бы просто генериков в атрибутах, или хотя бы адекватных параметров по умолчанию, так как те, что появились в C# 4.0 не работают с атрибутами.
А что вы имеете в виду под автофлагами? Назначение атрибута [Flags] всем enum'ам по умолчанию? Зачем?
Code Contracts? Это было бы логичным, но к ним нет доступа из reflections, а следовательно по ним невозможно сгенерироватоь соответствующие валидаторы в web application.
Как вы видите .NET / C# 5.0?