Здравствуйте, AndrewVK, Вы писали:
J>>зачем вводить синтаксис public int X { get; } = x если и так можно будет написать public int X => x; ? AVK>Потому что в первом случае это автосвойство, инициализируемое в конструкторе один раз, а во втором — вычисляемое при каждом обращении свойство.
Что-то пугает меня этот зоопарк. 4 варианта для описания свойства... зачем писать
public int X { get; } = x
// при наличииpublic int X { get { return x; } }
Здравствуйте, _NN_, Вы писали:
А>>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy); _NN>Проще разрешить выражения и убрать 'return', тогда не нужно ничего придумывать и использовать обычные свойства и методы.
Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.
Здравствуйте, 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;
Имеем значение по умолчанию, но в конструкторе можно подправить.
Здравствуйте, _NN_, Вы писали:
_NN>Это разное _NN>Имеем значение по умолчанию, но в конструкторе можно подправить.
Ага, про поле в примере я забыл. Один фиг, синтаксис с "= x" от этого лучше не стал. Почему "= someField" означает инициализацию поля и при этом поле readonly? Даже первое пришедшее в голову
public int X { readonly x; get; }
и то логичнее смотрится
Понятно, что это пока только идеи, а не то, что будет к релизу. Но явно выпадающие из привычного стиля шарпа вещи точно без обоснования вводить не следует.
S>и то логичнее смотрится
А зачем нужно задавать имя для поля ?
Если оно только для чтения все равно кроме конструктора менять нигде нельзя.
Достаточно, чтобы компилятор сам его подставлял в конструкторе.
S>Понятно, что это пока только идеи, а не то, что будет к релизу. Но явно выпадающие из привычного стиля шарпа вещи точно без обоснования вводить не следует.
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; }
}
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, _NN_, Вы писали:
А>>>public Point Move(int dx, int dy) => new Point(X + dx, Y + dy); _NN>>Проще разрешить выражения и убрать 'return', тогда не нужно ничего придумывать и использовать обычные свойства и методы.
Z>Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.
Тогда это выглядит довольно разумно.
Может сделать и следующий шаг ?
S>>и то логичнее смотрится _NN>А зачем нужно задавать имя для поля ?
1. В исходном синтаксисе можно
2. Для использования поля напрямую (например через ref) и навешивания атрибутов на поле.
Хотя по-моему в обоих пунктах давно пора переключиться на обычные поля и не мучать мозг.
_NN>Например Nemerle: так и так
Ага, тоже неплохо.
Здравствуйте, 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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Если под исходным имеется в виду "= x", то нет, нельзя. х это не имя поля, это имя параметра первичного конструктора (проблемы испорченного телефона опять). Вот так тоже можно:
Ага, тогда уловил идею. Спасиб!
Здравствуйте, 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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, _NN_, Вы писали:
_NN>>
_NN>>var q = if(true)=> 1 else 2;
_NN>>
AVK>И что это должно означать?
Что тело 'then' и 'else' будет выражением а не просто блоком кода, т.е. что-то возвращает и тогда это можно будет использовать справа от присваивания
Здравствуйте, _NN_, Вы писали:
_NN>Что тело 'then' и 'else' будет выражением а не просто блоком кода, т.е. что-то возвращает и тогда это можно будет использовать справа от присваивания
И чем это отличается от "true?1:2" кроме лишней писанины?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, _NN_, Вы писали:
_NN>>Что тело 'then' и 'else' будет выражением а не просто блоком кода, т.е. что-то возвращает и тогда это можно будет использовать справа от присваивания
AVK>И чем это отличается от "true?1:2" кроме лишней писанины?
Я так понял на самом деле NN таки хочет вот этой фичи
Это сломает совместимость. Впрочем, кое что на эту тему, возможно, будет:
var a = (var x = Foo(); var y = Bar(x); FooBar(y));
Здравствуйте, _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 использовать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Jack128, Вы писали:
А>>>//read only auto-properties — А>>>public int X { get; } = x; _NN>>А как это работает ? _NN>>Что означает "= x" ? Это инициализация или имя переменной ?
J>x в данном случае — это поле. Обрати внимание на primary constructor выше, скорее всего как F#, его параметры в поля преобразуются.
Вопрос был не в том, что такое "x", а в том является ли это именем для поля содержащего значение свойства, или "x" — это произвольное инициализирующее значение. Думаю, второе.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.