Очередные дополнения к C# 6 (27 августа)

AndrewVK AndrewVK
Первичные конструкторы теперь разрешены и у структур.

P.S. Кстати, как то из презентаций убежал синтаксис, позволяющий задавать тело первичного конструктора. Выглядит так:
class MyClass(int x, int y)
{
  private readonly int _z;

  {
    _z = x + y;
  }
}
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
samius
samius
30.08.2014 08:21
Здравствуйте, AndrewVK, Вы писали:

AVK>P.S. Кстати, как то из презентаций убежал синтаксис, позволяющий задавать тело первичного конструктора. Выглядит так:

AVK>
private readonly int _z;
AVK>  {
AVK>    _z = x+ y;
AVK>  }


фигурные скобки после точки с запятой?
AndrewVK
AndrewVK
30.08.2014 08:34
Здравствуйте, samius, Вы писали:

S>фигурные скобки после точки с запятой?


Да. А что тебя смущает?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
samius
samius
30.08.2014 08:40
Здравствуйте, AndrewVK, Вы писали:

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


S>>фигурные скобки после точки с запятой?


AVK>Да. А что тебя смущает?

Пардон, я не правильно воспринял пример. Увидел код, не сильно вдаваясь в текстовое описание того, чего именно это пример, подумал что вижу тело инициализатора поля _z. Потому и удивился разделителю между объявлением поля и инициализатором.

Но конструктор одинаковым образом относится ко всем полям, объявленным в классе. Поэтому точка с запятой логична.

Прошу прощения за невнимательность.
AngeL B.
AngeL B.
31.08.2014 12:06
Здравствуйте, AndrewVK, Вы писали:

AVK>P.S. Кстати, как то из презентаций убежал синтаксис, позволяющий задавать тело первичного конструктора. Выглядит так:

AVK>
AVK>class MyClass(int x, int y)
AVK>{
AVK>  private readonly int _z;

AVK>  {
AVK>    _z = x + y;
AVK>  }
AVK>}
AVK>

С точки зрения читабельности кода — это лютый АД!
Особенно учитывая, что эти скобки можно поставить в любом месте класса. А если еще учесть, что класс может быть partial
GarryIV
GarryIV
05.09.2014 02:25
Здравствуйте, AngeL B., Вы писали:

AB>С точки зрения читабельности кода — это лютый АД!

AB>Особенно учитывая, что эти скобки можно поставить в любом месте класса. А если еще учесть, что класс может быть partial

В Java сто лет так, особо никому не надо. По большей части используется так:
List<Long> l = new ArrayList<Long>() {{
    add(1L);
    add(2L);
}};


То есть ничего другого и нет и читаемость не страдает.
AngeL B.
AngeL B.
05.09.2014 05:23
Здравствуйте, GarryIV, Вы писали:

GIV>
GIV>List<Long> l = new ArrayList<Long>() {{ add(1L); add(2L); }};
GIV>

GIV>То есть ничего другого и нет и читаемость не страдает.
Речь идет не о создании объектов (и их инициализации по месту), а об описании классов. Прочти исходное сообщение.
GarryIV
GarryIV
05.09.2014 05:33
Здравствуйте, AngeL B., Вы писали:

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


GIV>>
GIV>>List<Long> l = new ArrayList<Long>() {{ add(1L); add(2L); }};
GIV>>

GIV>>То есть ничего другого и нет и читаемость не страдает.
AB>Речь идет не о создании объектов (и их инициализации по месту), а об описании классов. Прочти исходное сообщение.

А тут и есть описание класса (анонимного) ну и да, зараз и создание.
Философ
Философ
31.08.2014 01:10
Здравствуйте, AndrewVK, Вы писали:

не понятно: var myStructArray = new MyStruct[count] — выполнится ли конструктор хотя-бы раз?

где первоисточник новости? дайте ссылку
AndrewVK
AndrewVK
31.08.2014 01:40
Здравствуйте, Философ, Вы писали:

Ф>где первоисточник новости? дайте ссылку


Первоисточник там же, где и раньше:
http://roslyn.codeplex.com/discussions/562559
http://roslyn.codeplex.com/discussions/562558
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Sinix
Sinix
31.08.2014 01:55
Здравствуйте, AndrewVK, Вы писали:


AVK>P.S. Кстати, как то из презентаций убежал синтаксис, позволяющий задавать тело первичного конструктора. Выглядит так:


Что-то я не уловил всей гениальности замысла В чём профит?

Что от конструкторов в структурах с ломающим поведением типа
new MyStruct[1][0] != new MyStruct();

и тормозами "new T()" для структур в генерик-методах (теперь default(T) сгенерить нельзя, только Activator.CreateInstance()),

что от борьбы с синтаксическим оверхедом аля
class MyClass(int x, int y)
{
  private readonly int _z;

  {
    _z = x + y;
  }
}

// по сравнению с

class MyClass
{  
  private readonly int _z;

  public MyClass(int x, int y)
  {
    _z = x + y;
  }
}


Ну, кроме как новых квестов от ув. nikov?


Вообще, все эти метания шестого шарпа с "а можно записать конструктор так, а свойство так, а тут ещё вот так" и общим счётом пятью равноправными вариантами:
* классика
* X { get; set; }
* X { get; } = x
* X => x;
* new { X = x }; // для анонимных типов

+ гипотетический шестой для описания тюплов не вызывает никакой реакции, кроме как "горшочек не вари".

Такое впечатление, что интерны усыпили Хейлсберга и фигачат код, пока никто не видит
AndrewVK
AndrewVK
31.08.2014 02:24
Здравствуйте, Sinix, Вы писали:

S>Что-то я не уловил всей гениальности замысла В чём профит?


В смысле? Профит в том что можно писать код для primary constructor.

S>Что от конструкторов в структурах


Ээ, т.е. вопрос не к тому что ты процитировал, а к тому что из цитаты удалил? Профит очень простой — консистентность. Чем меньше в языке oddities, тем проще его использовать.

S>что от борьбы с синтаксическим оверхедом аля

S>
S>class MyClass(int x, int y)
S>{
S>  private readonly int _z;

S>  {
S>    _z = x + y;
S>  }
S>}

S>// по сравнению с

S>class MyClass
S>{  
S>  private readonly int _z;

S>  public MyClass(int x, int y)
S>  {
S>    _z = x + y;
S>  }
S>}
S>


Ну вот так. Я сам был несколько удивлен. Но, видимо, такая фича почти ничего не стоила и проблем она тоже не привносит. Что же касается полезности на практике — ну вот написал ты класс с первичным конструктором. А потом понадобилось какую нибудь мелочевку добавить — и надо все перетаптывать. Меня этой "мегафичей" автопроперти изрядно достают. Так что, видимо, это все в рамках борьбы с подобным — проблему с автосвойствами то вполне целенаправленно в этом релизе решают, так зачем подкладывать подобное с другой стороны?

S>* X { get; } = x

S>* X => x;

Это не равноправные варианты. И если х это параметр конструктора, то во втором варианте вообще будет синтаксическая ошибка.

S>* new { X = x }; // для анонимных типов


А это вообще из другой оперы.

S>+ гипотетический шестой для описания тюплов не вызывает никакой реакции, кроме как "горшочек не вари".


С тюплами пока вообще говорить не о чем. То что там народ экспериментирует или просто бредит на тему — это немного другой слой реальности.
Вот то что primary конструкторы это путь к record classes и PM, так это да. Я об этом год назад с Мэдсом беседовал, и он был полностью со мной согласен. Да и в недавнем сообщении тоже вскольз об этом упомянул. Но этот релиз вообще не про выразительные возможности языка. От слова совсем.

S>Такое впечатление, что интерны усыпили Хейлсберга и фигачат код, пока никто не видит


Какие интерны? Там вроде Мэдс пока рулит больше всех, а он на интерна как то не совсем тянет, не? Да и Хэйлсберг, когда на эту тему Липперт прикалывался, говорил что все нормально, он в курсе и не против
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Sinix
Sinix
01.09.2014 05:51
Здравствуйте, AndrewVK, Вы писали:

S>>Что от конструкторов в структурах

AVK>Ээ, т.е. вопрос не к тому что ты процитировал, а к тому что из цитаты удалил?
Угу, процитировал неудачно.

AVK>Профит очень простой — консистентность. Чем меньше в языке oddities, тем проще его использовать.


С точки зрения нового кода — безусловно да, с точки зрения старого — ломающее поведение, что очень нехорошо. По сути, в c# переизобретают грабли бейсика с null и nothing, которые были одним из основных доводов против конструкторов по умолчанию в структурах. Авторам конечно виднее, но я пока не вижу ни одного выигрышного пункта.

Гарантия, что поля структуры будут инициализированы? Нет, new Struct[1][0] — и приятной отладки. Для классов для подстраховки есть хоть NullReferenceException, для структур нет и его.

Какой-либо выигрыш в производительности? Нет, скорее наоборот, теряем для new T() в генериках. Учитывая nullable-структуры — проблема массовая.

Упрощение обучения? Нет, теперь для структур вместо двух равнозначных default(Struct) и new Struct() мы получили два различных поведения.

Сокращение кода? Тоже нет, теперь в структурах с primary ctor нужно или ставить отладочные ассерты, или периодически ловить ошибки из-за неинициализированной структуры.



AVK>Ну вот так. Я сам был несколько удивлен. Но, видимо, такая фича почти ничего не стоила и проблем она тоже не привносит. Что же касается полезности на практике — ну вот написал ты класс с первичным конструктором. А потом понадобилось какую нибудь мелочевку добавить — и надо все перетаптывать. Меня этой "мегафичей" автопроперти изрядно достают. Так что, видимо, это все в рамках борьбы с подобным — проблему с автосвойствами то вполне целенаправленно в этом релизе решают, так зачем подкладывать подобное с другой стороны?


Ну... это всё-таки проблемы студии, а не языка. Добавить рефакторинг аля решарперовский "to property with backing field" в рослине дело 10-20 минут. А вот добавление фичи из разряда "парой букв меньше писать" аукнется кучей граблей всем — от авторов учебников и парсеров и до поддержки кода с "{ BadCode(); }" где-нибудь в середине класса.


С остальным согласен
Jack128
Jack128
01.09.2014 06:30
Здравствуйте, Sinix, Вы писали:

S>Ну... это всё-таки проблемы студии, а не языка. Добавить рефакторинг аля решарперовский "to property with backing field" в рослине дело 10-20 минут.


вообще говоря это не аргумент. Дело именно в языке, потому что хотя писать код(большую его часть) за нас может IDE, то вот читать его приходится самим, глазками. И всякий синтаксический шум тут очень мешает.
Sinix
Sinix
01.09.2014 07:00
Здравствуйте, Jack128, Вы писали:

S>>Ну... это всё-таки проблемы студии, а не языка. Добавить рефакторинг аля решарперовский "to property with backing field" в рослине дело 10-20 минут.

J>вообще говоря это не аргумент. Дело именно в языке, потому что хотя писать код(большую его часть) за нас может IDE, то вот читать его приходится самим, глазками. И всякий синтаксический шум тут очень мешает.

Ну так новая фича "тело конструктора в отрыве от сигнатуры" только добавляет шума, сравни:
class MyClass(int x, int y)
{
  private readonly int _z;
  // ...


  {
    _z = x + y;
  }
}

// и

class MyClass
{  
  private readonly int _z;
  // ...

  public MyClass(int x, int y)
  {
    _z = x + y;
  }
}


Теперь добавляем в код валидацию аргументов, побольше полей, другие конструкторы + вызов базового конструктора — получаем полную ересь. Понятно, что сдуру всё сломать можно, но смысл добавлять промежуточный вариант конструктора, который придётся рано или поздно переписывать в классический?
Jack128
Jack128
01.09.2014 08:40
Здравствуйте, Sinix, Вы писали:

S>Ну так новая фича "тело конструктора в отрыве от сигнатуры" только добавляет шума, сравни:

S>
S>class MyClass(int x, int y)
S>{
S>  private readonly int _z;
S>  // ...


S>  {
S>    _z = x + y;
S>  }
S>}

S>// и

S>class MyClass
S>{  
S>  private readonly int _z;
S>  // ...

S>  public MyClass(int x, int y)
S>  {
S>    _z = x + y;
S>  }
S>}
S>


S>Теперь добавляем в код валидацию аргументов, побольше полей, другие конструкторы + вызов базового конструктора — получаем полную ересь. Понятно, что сдуру всё сломать можно, но смысл добавлять промежуточный вариант конструктора, который придётся рано или поздно переписывать в классический?


Вообще то первый вариант кода — дурость и есть. Нужно так:

class MyClass(int x, int y)
{
   private readonly int _z = x + y; 
}


а вот тело для праймари конструктора как раз позволяет не отказыватся от него, если вдруг через пол года понадобится какая нить валидация.

class MyClass(int x, int y)
{
   {
       if (x <= 0 || x > 100) throw new Exception("x is invalid");
   }

   private readonly int _z = x + y; 
}


Или я суть претензий не понял?
Sinix
Sinix
01.09.2014 08:59
Здравствуйте, Jack128, Вы писали:

J>Вообще то первый вариант кода — дурость и есть.

Но мы-то обсуждаем именно его Посмотри пример в начале ветки.


J>а вот тело для праймари конструктора как раз позволяет не отказыватся от него, если вдруг через пол года понадобится какая нить валидация.

А не проще будет
  [Primary]
  public MyClass(int x, int y)
  {
  }

?

Вот это
class MyClass(int x, int y)
{
   {
       if (x <= 0 || x > 100) throw new Exception("x is invalid");
   }

   private readonly int _z = x + y; 
}


1-в-1 совпадает с исходным примером, только порядок членов изменён. Поскольку в шарпе порядок не имеет значения — будут писать и так, и так.

Ну и разумеется, ничем принципиально не отличается от
class MyClass
{
   private readonly int _z;

   public MyClass(int x, int y)
   {
       if (x <= 0 || x > 100) throw new Exception("x is invalid");
       _z = x + y;
   }
}

, если не считать невозможность прописать /// <summary /> у конструктора в первом варианте. Ну и порядок присвоения — в первом варианте валидация сработает уже после присвоения.

В общем, нафига так извращаться — я так и не понял.
AndrewVK
AndrewVK
01.09.2014 09:16
Здравствуйте, Sinix, Вы писали:

S>Ну так новая фича "тело конструктора в отрыве от сигнатуры" только добавляет шума, сравни:


А если кода чуть больше?

class MyClass(int x, int y)
{
  private readonly int _z;
  public int X {get;} = x;
  public int Y {get;} = y;

  {
    _z = x + y;
  }
}

?

S>Теперь добавляем в код валидацию аргументов, побольше полей, другие конструкторы + вызов базового конструктора — получаем полную ересь.


Никакой ереси мы не получаем. Получаем лучшую читаемость, потому что тело как было, так и осталось, а вот наличие объявления первичного конструктора сразу нам говорит, что у класса только один конструктор и он имеет сразу видимую сигнатуру, не теряющуюся среди методов.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Sinix
Sinix
01.09.2014 10:09
Здравствуйте, AndrewVK, Вы писали:

AVK>А если кода чуть больше?

Угу, наконец уловил мысль авторов

Честно говоря, по-прежнему не уверен, что имеет смысл заводить новую конструкцию ради такой мелочи, ну да фиг с ним. Раз сделали — пусть будет.

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


Кстати, а почему один? Стандарт же позволяет дополнительные конструкторы, если они вызывают primary-конструктор:
public Point() : this(0, 0) {}

или это уже поменялось?
AndrewVK
AndrewVK
01.09.2014 09:16
Здравствуйте, Sinix, Вы писали:

S>Ну... это всё-таки проблемы студии, а не языка.


Это проблемы языка, которые можно отчасти решить студией.

S> Добавить рефакторинг аля решарперовский


Ну давай тогда поотменяем весь синтаксический сахар, заменив на рефакторинги?

S>А вот добавление фичи из разряда "парой букв меньше писать" аукнется кучей граблей всем — от авторов учебников и парсеров и до поддержки кода с "{ BadCode(); }" где-нибудь в середине класса.


Ты преувеличиваешь.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
btn1
btn1
31.08.2014 08:21
Здравствуйте, AndrewVK, Вы писали:

AVK>Первичные конструкторы теперь разрешены и у структур.


А можно узнать, в чём вообще профит от "первичных конструкторов"? Я смотрю и никак не могу понять, где тот многочисленный use case, где я прямо тоннами пишу код и ПК помогает мне его ужать хотя бы в два раза? Что-то мне говорит, что разрабы {непереводимая игра слов с использованием дуба, марихуанны и матери каждого индуса}.

C# с его текущим ПМ скатывается в ОНО — дебильнее фич 6.0 — только Win 8.0 — такой же уродец мира ИТ. И никакие Рослины не помогут, если в голове — опилки.
AndrewVK
AndrewVK
31.08.2014 08:31
Здравствуйте, btn1, Вы писали:

B>А можно узнать, в чём вообще профит от "первичных конструкторов"?


Уменьшение количества писанины.

B> Я смотрю и никак не могу понять, где тот многочисленный use case, где я прямо тоннами пишу код и ПК помогает мне его ужать хотя бы в два раза?


Насчет разов тебе ничего сказать не могу, но типичные юзкейсы: http://en.wikipedia.org/wiki/Data_transfer_object, http://en.wikipedia.org/wiki/Abstract_syntax_tree

B>C# с его текущим ПМ скатывается в ОНО — дебильнее фич 6.0 — только Win 8.0 — такой же уродец мира ИТ. И никакие Рослины не помогут, если в голове — опилки.


Твой нетрадиционный взгляд на языки большинству здесь уже известен, и обсуждать его смысла не имеет, ты все равно никого не слышишь.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
btn1
btn1
03.09.2014 10:59
Здравствуйте, AndrewVK, Вы писали:

B>>А можно узнать, в чём вообще профит от "первичных конструкторов"?


AVK>Уменьшение количества писанины.


В данном случае уменьшение писанины ЗАПУТЫВАЕТ понимание структуры класса. Пример:

//классический конструктор
public class Point {
    private int x, y;// ага! здесь ВСЕ мои поля!

    public Point(int x, int y)// это конструктор - я знаю, что он есть и я знаю сигнатуру. IDE может даже подсветить его отдельно.
    {
        this.x = x;// чёткая логика - здесь я знаю, кто куда инициализировался
        this.y = y;
        // а здесь может идти ещё чёрте сколько работы - не одними присвоениями жив конструктор
    }
}

//Первичный конструктор
public class Point(int x, int y) {
    // где я? кто я? где мои переменные? Что это за метод Point? Ах, да... тот самый дебильный синтаксис 6.0. Удачи вам, писатели парсеров!!

}


Во-первых, класс пустой. А суслик переменные в нём есть! Уже несоответствие "что вижу — что на самом деле".
Во-вторых, ну и в чём опять профит-то?? (я про МАССОВЫЙ код) Взяли какой-то узкоспециализированный случай, засунули в язык — всё, радость?

AVK>... типичные юзкейсы: Data_transfer_object, Abstract_syntax_tree


Я понимаю, в теории можно понаписать однострочных DTOшек. Но я боюсь, что даже они — не так просты, как хочется авторам этой "мегафичи". Почему вдруг x и y — private?? А в чём смысл их существования без public доступа? А если я из X хочу проперть, а из Y — поле? А вот для BLToolkit я использую простые классы с паблик полями: классов — много, толку от primary constructors — ноль.
Я это всё к чему — к узконаправленности мышления разрабов. Вроде бы фича есть, вроде бы где-то даже полезна, но я не вижу её полезности для массового прогера — зачем тогда тратить на неё время?? В списке запросов ТЫСЯЧИ просьб, но реализована самая ненужная и неоднозначная. И вот теперь плавно подходим к следующей мысли:


B>>C# с его текущим ПМ скатывается в ОНО...

AVK>Твой нетрадиционный взгляд на языки большинству здесь уже известен, и обсуждать его смысла не имеет, ты все равно никого не слышишь.

Если языки пишут нетрадиционные (в плохом смысле) прогеры, то и сам язык выглядит как п****ое поделие — я в чём виноват? У меня ориентация — десктоп приложения и классический сервер (без всяких WCF/EF) и я даже в таком широком спектре приложений в упор не вижу, чем primary constructor мне поможет.
Автоинициализация пропертей — ДАВНО надо было сделать — дождались. Using статических полей — ещё одна таймбомба на пути "испохабим C# до уровня php".
Клянусь, только сделайте фичу — вас ЗАВАЛЯТ ***ном и критикой И БУДУТ ПРАВЫ. Вот тогда и вспомните btn1
AndrewVK
AndrewVK
03.09.2014 11:07
Здравствуйте, btn1, Вы писали:

B>В данном случае уменьшение писанины ЗАПУТЫВАЕТ понимание структуры класса.


Нет, не запутывает. Наоборот, явно выделяет довольно важную семантическую составляющую.

B> private int x, y;// ага! здесь ВСЕ мои поля!


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

B>Во-вторых, ну и в чём опять профит-то?? (я про МАССОВЫЙ код) Взяли какой-то узкоспециализированный случай


Это не узкоспециализированный случай. Классов с одним конструктором — большинство.

AVK>>... типичные юзкейсы: Data_transfer_object, Abstract_syntax_tree

B>Я понимаю, в теории можно понаписать однострочных DTOшек.

На практике — тоже.

B> Но я боюсь, что даже они — не так просты, как хочется авторам этой "мегафичи". Почему вдруг x и y — private??


Ознакомься с фичей, потом спорь.

B>Если языки пишут нетрадиционные (в плохом смысле) прогеры, то и сам язык выглядит как п****ое поделие — я в чём виноват?


Так где те языки, которые написали традиционные? Можно пример?

B> У меня ориентация — десктоп приложения и классический сервер (без всяких WCF/EF) и я даже в таком широком спектре приложений в упор не вижу, чем primary constructor мне поможет.


Сочувствую.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
btn1
btn1
04.09.2014 05:05
Здравствуйте, AndrewVK, Вы писали:

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


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

B>>В данном случае уменьшение писанины ЗАПУТЫВАЕТ понимание структуры класса.

AVK>Нет, не запутывает. Наоборот, явно выделяет довольно важную семантическую составляющую.

Запутывает, потому что вводит лишнюю сущность туда, где в ней нет потребности. Что это за такой специальный конструктор "инициализатор полей"? Ну была такая фича у С++ (ага, вот откуда корни — замшелые сипиписники набижали!), но мы теперь что, будем придумывать конструкторы на каждый алгоритм? А если в конструкторе цикл — сделаем "цикл-конструктор"?

Вся несуразность этих сокращений вылезет тогда, когда понадобится улучшать класс — вот тут попрыгает бедолага:

1. Нужно найти не только все конструкторы, но и не забыть взглянуть в заголовок класса — лишнее действие, которое 100% будут забывать.
2. Если понадобится "почти такой же" конструктор, но с действием — хана, значит надо будет лезть вычищать все места "поле = хрень из Прим.Констр." и вносить их в "нормальный" конструктор.
3. Если просто нужен ещё один конструктор, ОБЯЗАТЕЛЬНО надо вызывать Прим.Констр. — компилятор-то напомнит, но нафига козе баян?? Зачем усложнять структуру вызовов?

AVK>Это не узкоспециализированный случай. Классов с одним конструктором — большинство.


Да, но не обязательно большинство составляют "примитивные" конструкторы, где только присваиваются поля!

AVK>Так где те языки, которые написали традиционные? Можно пример?


C# 5.0 (и тот сильно проигрывает Nemerle или D )

Ещё раз, в свете новых знаний, запишу "мегаулучшение кода":

class A
{
    int abc;

    public A(int v)
    {
        abc = v;
    }
}

class B(int v)
{
    int abc = v;
}


Теперь я правильно понимаю надобность в ПК? Но если речь идёт о ТАКОМ примитиве, я вообще не вижу смысла с ним возиться — возьми T4 и ляпай такие классы вообще не приходя в сознание! Зачем вводить ерунду на уровне языка?
Более того — DTO классы удобнее использовать с public полями (чтобы отдавать их ORM'у), где все primary constructors идут нафиг, ибо можно спокойно записать:

var person = new Person { Name = "Vasya" };


Вообще без единого конструктора!
Да и парсеру не нужно лишний раз напрягаться в объявлении класса — будут ли там параметры после класса или нет.
В общем, фича — грошовая, толку — минимум, а силы — потрачены. Зато interpolated strings задвинули в угол — как же, "нет времени"!
nikov
nikov
04.09.2014 05:28
Здравствуйте, btn1, Вы писали:

B>Зато interpolated strings задвинули в угол — как же, "нет времени"!


Активно ими занимаемся. Но там есть проблема — как распознать конец interpolated expression, сохранив простой лексер и быстрый инкрементальный парсер, и не используя слишком уродливый синтаксис наподобие \{...\}
VladD2
VladD2
27.09.2014 02:54
Здравствуйте, nikov, Вы писали:

N>Активно ими занимаемся. Но там есть проблема — как распознать конец interpolated expression, сохранив простой лексер и быстрый инкрементальный парсер, и не используя слишком уродливый синтаксис наподобие \{...\}


А оно надо? Такие строки большими не будут. Их парсинг и целиком будет миллисекунды занимать.
Qodomoc
Qodomoc
21.10.2014 03:08
А вот и подробности про интерполяцию строк.
AndrewVK
AndrewVK
04.09.2014 05:42
Здравствуйте, btn1, Вы писали:

B>Что это за такой специальный конструктор "инициализатор полей"?


Нет никакого специального конструктора. Есть обычный конструктор, который главный. Как я уже писал — большинство классов имеют ровно один конструктор, и сигнатура этого конструктора неразрывно связана с классом, а не является его дополнением, как методы. Это уже, де-факто, такая семантика. Первичные конструкторы всего лишь позволяют оформить это синтаксически, что весьма и весьма способствует читабельности.

B>1. Нужно найти не только все конструкторы, но и не забыть взглянуть в заголовок класса — лишнее действие, которое 100% будут забывать.


Это, позволь спросить, что за способ просмотра кода такой, когда название и список предков и интерфейсов класса тебе не важен, а вот сигнатура конструктора важна?

B>2. Если понадобится "почти такой же" конструктор, но с действием — хана, значит надо будет лезть вычищать все места "поле = хрень из Прим.Констр." и вносить их в "нормальный" конструктор.


Еще раз — ознакомься с фичей, а потом уже критикуй.

B>3. Если просто нужен ещё один конструктор, ОБЯЗАТЕЛЬНО надо вызывать Прим.Констр. — компилятор-то напомнит, но нафига козе баян??


А вот как раз чтобы не бегать и не искать, что там еще за конструкторы. Первичный конструктор гарантированно вызывается всегда, а все остальные — просто хелперы.

AVK>>Это не узкоспециализированный случай. Классов с одним конструктором — большинство.

B>Да, но не обязательно большинство составляют "примитивные" конструкторы, где только присваиваются поля!

Ты уже забыл что я в стартовом сообщении написал?

AVK>>Так где те языки, которые написали традиционные? Можно пример?

B>C# 5.0

Вот я о том и говорю — что то доказывать тебе бесполезно.

B>Теперь я правильно понимаю надобность в ПК? Но если речь идёт о ТАКОМ примитиве, я вообще не вижу смысла с ним возиться


А я вижу. И куча народа тоже видит. Извини, но твое видение нифига не аргумент.

B> — возьми T4 и ляпай такие классы вообще не приходя в сознание!


Тебе, надеюсь, не надо объяснять почему Т4 это не решение проблемы?

B>Более того — DTO классы удобнее использовать с public полями (чтобы отдавать их ORM'у)


Ага, и автоматом получить mutable state и возможность поломать инварианты. Спасибо, не надо.

B>Зато interpolated strings задвинули в угол — как же, "нет времени"!


И слава богу. Потому что пользы в нормально написанном коде от interpolated string примерно 0 — многоязычие требует почти всегда текстовые константы закатывать в ресурсы.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Jack128
Jack128
05.09.2014 03:59
Здравствуйте, AndrewVK, Вы писали:

AVK>И слава богу. Потому что пользы в нормально написанном коде от interpolated string примерно 0 — многоязычие требует почти всегда текстовые константы закатывать в ресурсы.


Серьезно?? Ты свою практику с общемировой не путаешь?
nikov
nikov
03.09.2014 12:35
Здравствуйте, AndrewVK, Вы писали:

AVK>P.S. Кстати, как то из презентаций убежал синтаксис, позволяющий задавать тело первичного конструктора. Выглядит так:

AVK>
AVK>class MyClass(int x, int y)
AVK>{
AVK>  private readonly int _z;

AVK>  {
AVK>    _z = x + y;
AVK>  }
AVK>}
AVK>


Хочу напомнить, что всё это — исключительно экспериментальные фичи, и нет абсолютно никакой гарантии, что они попадут в релиз C# 6.0.
agat50
agat50
30.09.2014 07:47
Здравствуйте, AndrewVK, Вы писали:

Извиняюсь что вклиниваюсь, вроде более менее по теме. По мотивам прошлого обсуждения semicolon operator наконец в голове дозрели плюсы предложенного мной дизайна. Описание кратко: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/6504697-block-code-as-value-another-syntax-for-semicolon Собственно дискасс кому есть что предложить в дополнение, ну или почему это нафиг никому не нужно. Прошу проголосовать (по ссылке) кому показалось полезным.

if(
    {
        var x = Foo(); 
        var y = Bar(); 
        Write(x); 
        return x * y > 0;
    }
)
{
    //
}

int a = 
    lock(dataInstance) 
    {
        return dataInstance.Member1;
    };
    
var x = 
    lock(_dict){
        return {
            foreach(var pair in _dict)
            {
                yield return new {A = pair.Key, B = pair.Value.Member1};
            }
        }.ToList();
    }; //List<Anonymous type>
    
var y = 
    using(var conn = new SqlConnection(...))
    {
        return (await conn.QueryAsync<LongLongLongClassName>(
            "sql query"
        )).GroupBy(/* .... */)
        .Select(/* ... */)
        .ToList(); // Long long long final typename
    };
AndrewVK
AndrewVK
30.09.2014 08:27
Здравствуйте, agat50, Вы писали:

A>Извиняюсь что вклиниваюсь, вроде более менее по теме. По мотивам прошлого обсуждения semicolon operator наконец в голове дозрели плюсы предложенного мной дизайна.


semicolon operator отложили, в этом релизе его не будет.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>