Re[5]: C# 6.0
От: hardcase Пират http://nemerle.org
Дата: 18.12.13 15:14
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Зачем? Смысл этой конструкции как раз в том чтобы предварительно ничего не декларировать.


Затем, что становится очевидной область видимости таких переменных.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: C# 6.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.12.13 17:17
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Затем, что становится очевидной область видимости таких переменных.


Вывода типов по имспользованию в C# все равно не будет.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: C# 6.0
От: Sinix  
Дата: 19.12.13 05:32
Оценка:
Здравствуйте, AndrewVK, Вы писали:

J>>зачем вводить синтаксис public int X { get; } = x если и так можно будет написать public int X => x; ?

AVK>Потому что в первом случае это автосвойство, инициализируемое в конструкторе один раз, а во втором — вычисляемое при каждом обращении свойство.

Что-то пугает меня этот зоопарк. 4 варианта для описания свойства... зачем писать
public int X { get; } = x
// при наличии
public int X { get { return x; } }

?
Re[2]: C# 6.0
От: Ziaw Россия  
Дата: 19.12.13 06:14
Оценка:
Здравствуйте, _NN_, Вы писали:

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

_NN>Проще разрешить выражения и убрать 'return', тогда не нужно ничего придумывать и использовать обычные свойства и методы.

Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.
Re[4]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 19.12.13 08:23
Оценка: +1
Здравствуйте, Sinix, Вы писали:

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


J>>>зачем вводить синтаксис public int X { get; } = x если и так можно будет написать public int X => x; ?

AVK>>Потому что в первом случае это автосвойство, инициализируемое в конструкторе один раз, а во втором — вычисляемое при каждом обращении свойство.

S>Что-то пугает меня этот зоопарк. 4 варианта для описания свойства... зачем писать

S>
S>public int X { get; } = x
S>// при наличии
S>public int X { get { return x; } }
S>

S>?

Это разное

public int X { get; } = x

==>
public int X { get { return _x; } }
private readonly int _x = x;


Имеем значение по умолчанию, но в конструкторе можно подправить.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: C# 6.0
От: Sinix  
Дата: 19.12.13 08:40
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Это разное

_NN>Имеем значение по умолчанию, но в конструкторе можно подправить.
Ага, про поле в примере я забыл. Один фиг, синтаксис с "= x" от этого лучше не стал. Почему "= someField" означает инициализацию поля и при этом поле readonly? Даже первое пришедшее в голову
public int X { readonly x; get; }


и то логичнее смотрится

Понятно, что это пока только идеи, а не то, что будет к релизу. Но явно выпадающие из привычного стиля шарпа вещи точно без обоснования вводить не следует.
Re[6]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 19.12.13 08:52
Оценка: +2
Здравствуйте, Sinix, Вы писали:


S>и то логичнее смотрится

А зачем нужно задавать имя для поля ?
Если оно только для чтения все равно кроме конструктора менять нигде нельзя.
Достаточно, чтобы компилятор сам его подставлял в конструкторе.

S>Понятно, что это пока только идеи, а не то, что будет к релизу. Но явно выпадающие из привычного стиля шарпа вещи точно без обоснования вводить не следует.


Например Nemerle: так и так

class Q
{
  public X : int { get; } // Создаем поля для чтения
  public Y : int { get; default 1 } // Создаем поля для чтения + инициализация
  public Z : int { get; set; default 2 } // Создаем поля для чтения и записи + инициализация
 
  public this()
  {
    F(out X); // out применяется к внутреннему полю
  }
  
  F(out x : int) { x = 1; }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 19.12.13 09:01
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


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

_NN>>Проще разрешить выражения и убрать 'return', тогда не нужно ничего придумывать и использовать обычные свойства и методы.

Z>Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.

Тогда это выглядит довольно разумно.
Может сделать и следующий шаг ?

var q = if(true)=> 1 else 2;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: C# 6.0
От: Sinix  
Дата: 19.12.13 09:17
Оценка:
Здравствуйте, _NN_, Вы писали:


S>>и то логичнее смотрится

_NN>А зачем нужно задавать имя для поля ?
1. В исходном синтаксисе можно
2. Для использования поля напрямую (например через ref) и навешивания атрибутов на поле.
Хотя по-моему в обоих пунктах давно пора переключиться на обычные поля и не мучать мозг.

_NN>Например Nemerle: так и так

Ага, тоже неплохо.
Re[4]: C# 6.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.13 09:59
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Что-то пугает меня этот зоопарк. 4 варианта для описания свойства... зачем писать

S>
S>public int X { get; } = x
S>// при наличии
S>public int X { get { return x; } }
S>

S>?

Ты уж полностью раскрывай и в эквивалентный код:
public int X { get; } = x

// при наличии
private int _x = x;
public int X { get { return _x; } }


Во-втором варианте писанины несколько побольше, не находишь?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: C# 6.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.13 10:05
Оценка: 26 (1)
Здравствуйте, Sinix, Вы писали:

S>>>и то логичнее смотрится

_NN>>А зачем нужно задавать имя для поля ?
S>1. В исходном синтаксисе можно

Если под исходным имеется в виду "= x", то нет, нельзя. х это не имя поля, это имя параметра первичного конструктора (проблемы испорченного телефона опять). Вот так тоже можно:
public int X {get;} = CalculateX();

Чтобы было понятно — я Мэдса еще при обсуждении 3.0 пинал, что невозможно сделать readonly автосвойства. И он еще тогда был со мной полностью согласен. Но руки дошли только сейчас.

S>2. Для использования поля напрямую (например через ref)


readonly поля через ref вне конструктора нельзя использовать.

S> и навешивания атрибутов на поле.Хотя по-моему в обоих пунктах давно пора переключиться на обычные поля и не мучать мозг.


Вот именно.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[9]: C# 6.0
От: Sinix  
Дата: 19.12.13 10:09
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Если под исходным имеется в виду "= x", то нет, нельзя. х это не имя поля, это имя параметра первичного конструктора (проблемы испорченного телефона опять). Вот так тоже можно:

Ага, тогда уловил идею. Спасиб!
Re[3]: C# 6.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.13 10:16
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.


Дело не в неприятии разработчиков, дело в том что C# не Немерле, и туда никто ничего не добавляет просто потому что кому то захотелось (если, конечно, захотелось не Андерсу ). Конкретно declaration expressions придумали, потому что не получается качественно добавить кортежи. Ну а фокусы типоа того, что я показал — просто побочные эффекты. Из той же оперы, кстати (оператор as is ):
if ((var y = x as SomeClass) != null)
    Foo(y);
else
  Bar();


Но таки да, дальняя цель — как можно больше конструкций сделать выражениями. Некоторые, к примеру, жаловались что нет statement формы для оператора ?:, теперь вот она есть. Еще обсуждал с Мэдсом expression форму switch (он, сктати, сказал, что и сишную бредятину с break надо выкидывать, и что как в VB позволить условия сложные писать в кейсах) — вроде бы есть какие то эксперименты (просьба воспринимать это как мои домыслы, потому что NDA) с все тем же оператором ?:, у которого может быть несколько вариантов как в switch.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: C# 6.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.13 10:16
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>
_NN>var q = if(true)=> 1 else 2;
_NN>


И что это должно означать?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: C# 6.0
От: _NN_ www.nemerleweb.com
Дата: 19.12.13 10:31
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


_NN>>
_NN>>var q = if(true)=> 1 else 2;
_NN>>


AVK>И что это должно означать?

Что тело 'then' и 'else' будет выражением а не просто блоком кода, т.е. что-то возвращает и тогда это можно будет использовать справа от присваивания
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: C# 6.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.13 10:59
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Что тело 'then' и 'else' будет выражением а не просто блоком кода, т.е. что-то возвращает и тогда это можно будет использовать справа от присваивания


И чем это отличается от "true?1:2" кроме лишней писанины?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: C# 6.0
От: Jack128  
Дата: 19.12.13 11:27
Оценка: +2
Здравствуйте, AndrewVK, Вы писали:

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


_NN>>Что тело 'then' и 'else' будет выражением а не просто блоком кода, т.е. что-то возвращает и тогда это можно будет использовать справа от присваивания


AVK>И чем это отличается от "true?1:2" кроме лишней писанины?


Я так понял на самом деле NN таки хочет вот этой фичи

Это сломает совместимость. Впрочем, кое что на эту тему, возможно, будет:
var a = (var x = Foo(); var y = Bar(x); FooBar(y));

http://rsdn.ru/forum/dotnet/5399449.1
Автор: AndrewVK
Дата: 16.12.13


ну и тогда можно будет писать так:


var a = true 
    ? (var x = Foo(); var y = Bar(x); FooBar(y)) 
    : (var x = FooBar(10); var y = Bar(x - 5); FooBar(y));
Re[2]: C# 6.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.13 12:22
Оценка: :)
Здравствуйте, adontz, Вы писали:

A>Extension properties хочу. Хотя, monadic null checking и constructor type parameter inference тоже ничего.


Так давно бы перешол на Немерл. Мы уже много лет всем этим пользуемся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: C# 6.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.13 12:30
Оценка:
Здравствуйте, _NN_, Вы писали:

А>>//read only auto-properties —

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

Инициализация.

_NN>Можно ли как в Nemerle ?


Ага:

_NN>
_NN> public X : int { get; default 1 }
_NN> public Y : int { get; set; default 2 }
_NN>



А>>//params for enumerables —

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

Зачем? Это чисто компиляторная фича. Просто вместо массива можно указать IEnumerable в params-методах.

А>>//monadic null checking —

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

Можно подумать, что все остальные фичи в других языках не реализованы, или реализованы недавно .

А>>//constructor type parameter inference —

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

Конечно, первое.

А>>//inline declarations for out params —

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

Гы.

_NN>На мой взгляд как раз в публичных методах, которые являются контрактом класса, как раз не нужен вывод типов.


+1 И даже вреден (для производительности IDE). Может автор ошибся и там нельзя var использовать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: C# 6.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.13 12:33
Оценка:
Здравствуйте, Jack128, Вы писали:

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

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

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


Вопрос был не в том, что такое "x", а в том является ли это именем для поля содержащего значение свойства, или "x" — это произвольное инициализирующее значение. Думаю, второе.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.