Почему только семь элементов в кортеже в C # 4.0, а восьмой - еще один кортеж? - PullRequest
9 голосов
/ 17 марта 2010

В F # синтаксический сахар скрывает реализацию CLR, а почему не в C # 4.0?

Ответы [ 5 ]

9 голосов
/ 23 марта 2010

Мы рассмотрели добавление синтаксического сахара для кортежей. Я думаю, что все согласны с тем, что это хорошая функция, но она просто не укладывается в бюджет

3 голосов
/ 17 марта 2010

Это предположение с моей стороны, но я подозреваю, что еще одним фактором является то, что F # имеет довольно сложный механизм хранения метаданных, специфичных для языка. Должен быть какой-то способ различать «7-кортеж, последним элементом которого является 3-кортеж» и 9-кортеж, даже если они кодируются одинаково с точки зрения типов .NET. F # выполняет это с помощью пользовательских блобов метаданных, так же, как он использует метаданные для хранения ограничений, которые более выразительны, чем те, которые встроены в .NET (например, enum или членские ограничения). C # не имеет истории хранения сложных, специфичных для языка метаданных со сборками, некоторая форма которых была бы необходимой предпосылкой для обработки расширенных кортежей (хотя в этом случае может быть достаточно пользовательского атрибута).

3 голосов
/ 17 марта 2010

Ниже приводится хорошая статья MSDN Мэтта Эллиса о команде библиотек базовых классов (BCL), в которой подробно рассказывается, что они думают об этом и некоторых других ключевых вопросах, касающихся классов Tuple.

Building Tuple: http://msdn.microsoft.com/en-us/magazine/dd942829.aspx

Из-за структуры обобщенных элементов .NET число параметров обобщенных типов во время компиляции фиксировано. Поэтому им пришлось выбрать некоторое количество общих параметров для реализации. В статье объясняется, что он создан по образцу существующих делегатов Action и Func. По иронии судьбы, дополнительные делегаты для Action и Func были впоследствии добавлены, принимая число параметров универсального типа до 16, но разработчики Tuple не последовали этому примеру.

3 голосов
/ 17 марта 2010

Представляется маловероятным, что кому-то, использующему возможности языка C # на соответствующем уровне, потребовался бы кортеж, содержащий более 7 элементов, особенно с учетом существующих и устоявшихся методов решения проблем и в первую очередь ОО-подхода к разработке решений.

F #, с другой стороны, является языком, разработанным, чтобы быть главным образом функциональным. Как таковой, он делает вещи в основном функциональным образом, и языковые особенности ориентированы на эту основную концепцию. В результате стало гораздо разумнее тратить ресурсы, необходимые для предоставления языковой функции, которую вы запрашиваете в F #, чем это было в C #.

Помните, что все новые языковые функции начинаются с 100 очков против них . :)

2 голосов
/ 17 марта 2010

Итак, простой ответ на ваш вопрос заключается в том, что C # не предоставляет любой синтаксический сахар для работы с кортежами, поэтому нет способа скрыть вложение кортежей, когда имеется более 8 элементов. ,

Конечно, я думаю, вы на самом деле спрашиваете, почему в C # 4.0 нет синтаксического сахара для работы с кортежами. Я думаю, что главная причина, почему это не так, заключается в том, что он поощряет легкий стиль программирования, который обычно не поддерживается в C # (но очень хорошо работает для программистов F #).

  • В F # совершенно нормально писать код, который выглядит следующим образом:

    let parseRecord rc = 
      // some code to parse the argument
    let (left, top, wid, hgt, str) = parseRecord record
    

    Однако этот код оправдан только на ранней стадии разработки (при написании прототипа и экспериментов) или если функциональность очень локализована (используется в одной функции). В более развитой версии кода вы, вероятно, заменили бы ее более подходящей структурой данных (например, F # запись), чтобы сделать код более читабельным, и я думаю, что именно это люди обычно делают в F #

  • С другой стороны, если бы C # propgrammer написал что-то вроде следующего кода, люди были бы очень напуганы тем, насколько нечитаемым является код:

    { int, int, int, int, string } ParseRecord(string record) { 
       // some code to parse the argument
    }
    var (left, top, wid, hgt, str) = ParseRecord(record);
    

    Итак, я думаю, что общий стиль программирования на C # просто менее подходит для легких функций, таких как кортежи и сопоставление с образцами на кортежах, потому что он не очень хорошо работает с остальным языком.

Конечно, может быть более хороший способ поддержать это в C #, и он может быть добавлен в будущем, однако я думаю, что интеграция этой функции будет более сложной, чем в F #. Кроме того, анонимные типы выполняют те же функции, что и кортежи (но только локально), поэтому в некоторых случаях вам действительно не нужны кортежи в C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...