Почему не может дженерики C# происходить из одного из универсальных параметров типа как, они могут в шаблонах C++? [дубликат]

от книга носорога:

В JavaScript, строки являются неизменными объектами, что означает, что символы в них не могут быть изменены и что любые операции на строках на самом деле создают новые строки. Строки присвоены ссылкой, не значением. В целом, когда объект присвоен ссылкой, изменение, внесенное в объект через одну ссылку, будет видимо через все другие ссылки на объект. Поскольку струны не могут поменяться, однако, Вы можете иметь несколько ссылок на строковый объект и не волноваться, что строковое значение изменится без Вашего знания его

42
задан John Saunders 29 August 2010 в 03:44
поделиться

5 ответов

Итак, начните с вопроса, что может пойти не так с классом C : T {} . На ум сразу приходит огромное количество вещей:

Что, если T - это структура? Что, если T - тип закрытого класса? Что, если T - тип интерфейса? Что, если T равно C ?! Что, если T - это класс, производный от C ? Что, если T - абстрактный тип с абстрактным методом? Что, если T имеет меньшую доступность, чем C? Что, если T - это System.ValueType? (Можно ли создать неструктурированный объект, наследующий от System.ValueType?) А как насчет System.Delegate, System.Enum и так далее?

Это простые, очевидные. Предлагаемая функция открывает буквально сотни, если не тысячи более тонких вопросов о взаимодействии между типом и его базовым типом. все это должно быть тщательно определено, реализовано и протестировано. Мы, несомненно, упустим некоторые из них и тем самым вызовем критические изменения в будущем или обременим среду выполнения поведением, определяемым реализацией.

Затраты будут огромными, поэтому лучше было бы получить огромную выгоду. Я не вижу здесь огромной выгоды.

62
ответ дан 26 November 2019 в 23:27
поделиться

Хорошо, если вам не понравился мой предыдущий ответ, тогда давайте возьмем другой курс.

Ваш вопрос предполагает ложь: нам нужна причина , чтобы не реализовать функцию. Напротив, нам нужна очень и очень веская причина для реализации любой функции. Компоненты чрезвычайно дороги с точки зрения их первоначальных затрат, затрат на обслуживание и альтернативных затрат. (То есть, время, которое вы тратите на функцию X, - это время, которое вы не можете потратить на выполнение функции Y, и которое может помешать вам когда-либо реализовать функцию Z.) Чтобы ответственно приносить пользу нашим клиентам и заинтересованным сторонам, мы не можем реализовать каждую функцию, с которой кто-то сталкивается вроде.

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

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

Задача убедительного описания этой огромной выгоды возлагается на людей, которые хотят эту функцию, а не на людей, которые должны ее реализовать. Так в чем же убедительная выгода?

Задача убедительного описания этой огромной выгоды возлагается на людей, которые хотят эту функцию, а не на людей, которые должны ее реализовать. Так в чем же убедительная выгода?

Задача убедительного описания этой огромной выгоды возлагается на людей, которые хотят эту функцию, а не на людей, которые должны ее реализовать. Так в чем же убедительная выгода?

34
ответ дан 26 November 2019 в 23:27
поделиться

Что в этом такого полезного?

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

Для поддержки такой функции они должны были иметь чтобы внести в CLR несколько довольно существенных изменений.

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

Почему они должны прыгать через такие обручи и довольно фундаментально скомпрометировать их систему типов, просто чтобы добавить эту функцию? Стоит ли оно того?

Если вы так думаете, скажите, почему. Напишите отзыв на connect.microsoft.com, объяснив, почему эта функция настолько важна, что ее необходимо добавить.

2
ответ дан 26 November 2019 в 23:27
поделиться

Шаблоны C ++ нельзя сравнивать с универсальными шаблонами C #. Шаблоны C ++ предварительно обрабатываются как макросы, тогда как обобщенные шаблоны в .NET обрабатываются средой выполнения.

Но есть и другие люди, которые знают об этом намного больше, чем я ...

1
ответ дан 26 November 2019 в 23:27
поделиться

Ручка будет удалена перед возвращением. Его эквивалент

public System.Drawing.Pen GetPen()
{
    try
    {
      System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width);

      pen.DashStyle = _DashStyle;
    }
    finally
    {
      pen.Dispose();
    }
    return pen;

}
-121--4565840-

Мне очень понравился Грегори Пакош ' ответить . Тем не менее, что вы могли бы сделать, это песочницу самого экземпляра Java. Запустите само приложение Java в ограниченном контексте.

В Windows или Unix можно создать пользователя, который ограничен определенным каталогом и имеет доступ только к некоторым библиотекам DLL. Таким образом, DLL вызывается из JNI может делать все, что он хочет, но он не будет очень далеко, потому что пользователь Java работает, как не может сделать очень много.

Если вашей программе Java необходимо делать привилегированные вещи, стороне Java придется поговорить с другой программой (Java или нет), чтобы сделать свои привилегированные вещи для нее.

Имейте в виду, что если вы не можете доверять DLL, вы также не можете доверять коду Java, так как DLL мог «взломать» машину Java. С другой стороны, никакие неприятные вещи не должны быть способны вырваться из пределов пользователя, как они работают. (Запрет неправильной конфигурации или ошибки в ОС.)

Изменить 2018: сегодня может быть более актуальным отметить, что песочница для запуска Java в, скорее всего, будет виртуальной машиной, в облаке амазонки, докере или что у вас, в заблокированной конфигурации.

-121--3853813-

Пример кода, в котором это могло бы помочь:

public class SpecialDataRow<T> : T where T : DataRow
{
    public int SpecialFactor { get; set; }
}

Это позволило бы создавать «специальные» строки из DataRow, а также из любых производных DataRows (например, сформированных наборных наборов данных)

Я не вижу другого способа кодирования такого класса

12
ответ дан 26 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: