C# 6.0
От: Аноним  
Дата: 08.12.13 07:29
Оценка: 46 (6) +2
http://adamralph.com/2013/12/06/ndc-diary-day-3/
//primary constructors - 
public class Point(int x, int y) { }
//read only auto-properties - 
public int X { get; } = x;
//static type using statements - 
using System.Math;
//property expressions - 
public double Distance => Sqrt(X * X + Y * Y);
//method expressions - 
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
//params for enumerables - 
public Point Average(params IEnumerable<Point> points) { }
//monadic null checking - 
if (points?.FirstOrDefault()?.X ?? -1) { }
//constructor type parameter inference - 
var t = new Tuple(1,2); // infers Tuple<T1, T2>
//inline declarations for out params - 
public void Foo(out var x, out var y) { }

Имхо, какой то хоть и полезный но хлам.
Re: C# 6.0
От: Nikolay_Ch Россия  
Дата: 08.12.13 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

Хлам, не хлам, а какое-то движение есть...
Re: C# 6.0
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.12.13 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

Extension properties хочу. Хотя, monadic null checking и constructor type parameter inference тоже ничего.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: C# 6.0
От: Jack128  
Дата: 08.12.13 09:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>//method expressions - 
А>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
А>

А в чем смысл?? чем это лучше public Point Move(int dx, int dy) { return new Point(X + dx, Y + dy); }
return убрали, да вместо скобок "=>" поставили ?? чёто не очень.


Собственно главный вопрос: ГДЕ pattern matching ???
Re[2]: C# 6.0
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 08.12.13 10:33
Оценка: 1 (1) +1 :)
Здравствуйте, Jack128, Вы писали:

J>Собственно главный вопрос: ГДЕ pattern matching ???


В Немерле.
Ce n'est que pour vous dire ce que je vous dis.
Re: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 08.12.13 19:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>http://adamralph.com/2013/12/06/ndc-diary-day-3/


А>

А>//primary constructors —
А>public class Point(int x, int y) { }


А>//read only auto-properties —

А>public int X { get; } = x;
А как это работает ?
Что означает "= x" ? Это инициализация или имя переменной ?

Можно ли как в Nemerle ?
class A
{
 public X : int { get; }
 
 public this()
 {
  X = 1; // Транслируется в hidden_field_X = 1;
  F(ref X); // F(ref hidden_field_X)
 }
}


Или так с инициализаций по умолчанию?
class A
{
 public X : int { get; default 1 }
 public Y : int { get; set; default 2 }
}



А>//static type using statements —

А>using System.Math;
Давно пора

А>//property expressions —

А>public double Distance => Sqrt(X * X + Y * Y);
А>//method expressions —
А>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
Проще разрешить выражения и убрать 'return', тогда не нужно ничего придумывать и использовать обычные свойства и методы.

А>//params for enumerables —

А>public Point Average(params IEnumerable<Point> points) { }
Я так понимаю для этого нужно менять рантайм. Верно ?

А>//monadic null checking —

А>if (points?.FirstOrDefault()?.X ?? -1) { }
Полезная фича, давно реализуемая в других языках.

А>//constructor type parameter inference —

А>var t = new Tuple(1,2); // infers Tuple<T1, T2>
Ну наконец.
Хотя наверное только из конструктора выводит, или как в Nemerle где может вывести из использования ?

А>//inline declarations for out params —

А>public void Foo(out var x, out var y) { }
Практикуют программирование на 'out' типах ?
Не проще ли кортежи добавить в язык ?
На мой взгляд как раз в публичных методах, которые являются контрактом класса, как раз не нужен вывод типов.

А>

А>Имхо, какой то хоть и полезный но хлам.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: C# 6.0
От: Jack128  
Дата: 08.12.13 20:23
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Аноним, Вы писали:


А>>http://adamralph.com/2013/12/06/ndc-diary-day-3/


А>>

А>>//primary constructors —
А>>public class Point(int x, int y) { }


А>>//read only auto-properties —

А>>public int X { get; } = x;
_NN>А как это работает ?
_NN>Что означает "= x" ? Это инициализация или имя переменной ?

x в данном случае — это поле. Обрати внимание на primary constructor выше, скорее всего как F#, его параметры в поля преобразуются.

А>>//params for enumerables —

А>>public Point Average(params IEnumerable<Point> points) { }

_NN>Я так понимаю для этого нужно менять рантайм. Верно ?

нафиг? params — это ж вроде как просто указание, что вызов Average(1,2,3,4) преобразовывать в Average(new[] {1,2,3,4}). Причем тут вообще рантайм?
Re[3]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 08.12.13 20:32
Оценка:
Здравствуйте, Jack128, Вы писали:

А>>>

А>>>//primary constructors —
А>>>public class Point(int x, int y) { }

А>>>//read only auto-properties —

А>>>public int X { get; } = x;
_NN>>А как это работает ?
_NN>>Что означает "= x" ? Это инициализация или имя переменной ?

J>x в данном случае — это поле. Обрати внимание на primary constructor выше, скорее всего как F#, его параметры в поля преобразуются.

А зачем оно тогда нужно ?
Почему в поля ? Я как раз думаю в случае C# будут свойства для чтения.

А>>>//params for enumerables —

А>>>public Point Average(params IEnumerable<Point> points) { }

_NN>>Я так понимаю для этого нужно менять рантайм. Верно ?

J>нафиг? params — это ж вроде как просто указание, что вызов Average(1,2,3,4) преобразовывать в Average(new[] {1,2,3,4}). Причем тут вообще рантайм?
Ну так оно и сейчас так через массив.
public F(params int[] x) { }

F(1,2,3) // F(new [] {1,2,3})


Я так понимаю фишка в том, что IEnumerable как раз даст возможность не создавать массив вообще, а скажем , разместить все в стеке.
Иначе снова неясно зачем это.
Массив он и так IEnumerable.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: C# 6.0
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.12.13 20:53
Оценка: +2
Здравствуйте, _NN_, Вы писали:

_NN>Иначе снова неясно зачем это.

_NN>Массив он и так IEnumerable.

Сейчас можно передавать только существующий массив или список аргументов (который преобразуется в массив в месте вызова).
А с params IEnumerable<T> можно будет, кроме того, передавать любые коллекции: List<T>, HashSet<T> и т.д., избегая от ненужного вызова .ToArray() и копирования элементов.
Re[2]: C# 6.0
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.12.13 21:02
Оценка: 35 (3) +1
Здравствуйте, _NN_, Вы писали:

А>>//read only auto-properties —

А>>public int X { get; } = x;
_NN>А как это работает ?
_NN>Что означает "= x" ? Это инициализация или имя переменной ?
Это инициализация скрытого поля соответствующего авто-свойству. Может быть любым выражением, разрешённым в инициализаторах полей. Выполняется при создании объекта.

_NN>Хотя наверное только из конструктора выводит, или как в Nemerle где может вывести из использования ?

Только из аргументов конструктора.

А>>//inline declarations for out params —

А>>public void Foo(out var x, out var y) { }
_NN>На мой взгляд как раз в публичных методах, которые являются контрактом класса, как раз не нужен вывод типов.
Это автор блога что-то намудрил. Предполагается разрешить такой синтаксис при вызовах методов с out-параметрами, а не при их декларации.
Re[3]: C# 6.0
От: Аноним  
Дата: 09.12.13 05:18
Оценка:
Здравствуйте, nikov, Вы писали:
N>Это автор блога что-то намудрил. Предполагается разрешить такой синтаксис при вызовах методов с out-параметрами, а не при их декларации.
А когда будет что нибудь более официальное на этот счет? И будут ли какие то более интересные фичи, или это весь список нововведений?
Re[3]: C# 6.0
От: Jack128  
Дата: 09.12.13 06:51
Оценка: +1 :))
Здравствуйте, nikov, Вы писали:

А>>>//inline declarations for out params —

А>>>public void Foo(out var x, out var y) { }
_NN>>На мой взгляд как раз в публичных методах, которые являются контрактом класса, как раз не нужен вывод типов.
N>Это автор блога что-то намудрил. Предполагается разрешить такой синтаксис при вызовах методов с out-параметрами, а не при их декларации.

Правильно. По мне так дальше нужно идти, не только облегчить работу с out-параметрами, но еще и максимально усложнить работу с туплами. Чтоб даже мысли не возникало их использовать.
Re: C# 6.0
От: Grundik2 Земля  
Дата: 09.12.13 08:26
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>http://adamralph.com/2013/12/06/ndc-diary-day-3/

А>
А>//primary constructors - 
А>public class Point(int x, int y) { }
А>//read only auto-properties - 
А>public int X { get; } = x;
А>//static type using statements - 
А>using System.Math;
А>//property expressions - 
А>public double Distance => Sqrt(X * X + Y * Y);
А>//method expressions - 
А>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
А>//params for enumerables - 
А>public Point Average(params IEnumerable<Point> points) { }
А>//monadic null checking - 
А>if (points?.FirstOrDefault()?.X ?? -1) { }
А>//constructor type parameter inference - 
А>var t = new Tuple(1,2); // infers Tuple<T1, T2>
А>//inline declarations for out params - 
А>public void Foo(out var x, out var y) { }
А>

А>Имхо, какой то хоть и полезный но хлам.

у Scala передрали.
Re[5]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 09.12.13 09:31
Оценка:
Здравствуйте, nikov, Вы писали:

N>Сейчас можно передавать только существующий массив или список аргументов (который преобразуется в массив в месте вызова).

N>А с params IEnumerable<T> можно будет, кроме того, передавать любые коллекции: List<T>, HashSet<T> и т.д., избегая от ненужного вызова .ToArray() и копирования элементов.

Теперь логично, а то я уже подумал про супер оптимизацию для params
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: C# 6.0
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 10.12.13 04:55
Оценка:
Здравствуйте, Jack128, Вы писали:
А>>
А>>//method expressions - 
А>>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
А>>

J>А в чем смысл?? чем это лучше public Point Move(int dx, int dy) { return new Point(X + dx, Y + dy); }
J>return убрали, да вместо скобок "=>" поставили ?? чёто не очень.

Можно предположить что на Expression можно будет разбирать отдельные методы а не только выражения. Как в F#.
Re[3]: C# 6.0
От: Jack128  
Дата: 10.12.13 10:26
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте, Jack128, Вы писали:

А>>>
А>>>//method expressions - 
А>>>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
А>>>

J>>А в чем смысл?? чем это лучше public Point Move(int dx, int dy) { return new Point(X + dx, Y + dy); }
J>>return убрали, да вместо скобок "=>" поставили ?? чёто не очень.

A>Можно предположить что на Expression можно будет разбирать отдельные методы а не только выражения. Как в F#.


Не понял, честно говоря. Можно примером пояснить?
Re[2]: C# 6.0
От: G-Host  
Дата: 10.12.13 10:52
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>у Scala передрали.


Джаве тоже пора что-нибудь передрать. Хотя бы у Шарпа.
Re[3]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 10.12.13 11:00
Оценка: :)
Здравствуйте, G-Host, Вы писали:

GH>Джаве тоже пора что-нибудь передрать. Хотя бы у Шарпа.


Java 8.
Или вам что-то конкретное нужно ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: C# 6.0
От: Константин Черногория  
Дата: 11.12.13 21:20
Оценка: +1
Здравствуйте, _NN_, Вы писали:

А>>//inline declarations for out params —

А>>public void Foo(out var x, out var y) { }
_NN>Практикуют программирование на 'out' типах ?
_NN>Не проще ли кортежи добавить в язык ?
Проще, но хуже. У out-аргументов кроме типов есть ещё имена. У членов кортежа только типы.
Поэтому если метод возвращает два значения одного или близких типов, то при использовании двух out аргументов метод можно использовать, не заглядывая в документацию, а только взглянув на прототип. При использовании же кортежа, из прототипа метода уже не следует, где какой результат.

P.S. Понятно, что для (x,y) координат стоит завести класс или структуру (потому шо если алгоритм работает с геометрией то эти 2 значения постоянно передаются вместе + у них куча общей логики).
Однако бывают такие функции, результат которых бессмысленно оборачивать в класс/структуру. Например Math.DivRem из таких.
Re[3]: C# 6.0
От: hardcase Пират http://nemerle.org
Дата: 12.12.13 11:57
Оценка:
Здравствуйте, Константин, Вы писали:

К>Проще, но хуже. У out-аргументов кроме типов есть ещё имена. У членов кортежа только типы.

К>Поэтому если метод возвращает два значения одного или близких типов, то при использовании двух out аргументов метод можно использовать, не заглядывая в документацию, а только взглянув на прототип.

Практика использования кортежей в языках, где они изначально поддерживаются, показывают одну особенность: их крайне редко их выставляют в публичный интерфейс.
/* иЗвиНите зА неРовнЫй поЧерК */
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.