C# по сравнению с дженериками Java [дубликат]

Вы можете получить эту информацию из метаданных Entity Framework:

var metadata = ((IObjectContextAdapter)db).ObjectContext.MetadataWorkspace;
var tables = metadata.GetItemCollection(DataSpace.SSpace)
                     .GetItems().Single()
                     .BaseEntitySets
                     .OfType()
                     .Where(s => !s.MetadataProperties.Contains("Type") || s.MetadataProperties["Type"].ToString() == "Tables");

foreach (var table in tables)
{
    Console.WriteLine(string.Format("{0}.{1}", table.Schema, table.Name));
    foreach (var member in table.ElementType.Members)
    {
        var column = string.Format("    {0}, Nullable: {1}",
            member.Name,
            ((TypeUsage)member.MetadataProperties["TypeUsage"].Value).Facets["Nullable"].Value);
        Console.WriteLine(column);
    }
}

(где db - DbContext)

Это даст вам результат, например :

dbo.Category
    CategoryId, Nullable: False
    CategoryName, Nullable: False
    Description, Nullable: True
    RowVersion, Nullable: False
dbo.Product
    ProductId, Nullable: False
    ProductName, Nullable: False
    QuantityPerUnit, Nullable: False
    UnitPrice, Nullable: True
    StartDate, Nullable: False
    RowVersion, Nullable: False
    Image, Nullable: True
dbo.CategoryProduct
    CategoryID, Nullable: False
    ProductID, Nullable: False

Я заимствовал первую часть из Роуэна Миллера .

117
задан johnc 10 December 2008 в 04:12
поделиться

3 ответа

ссылка streloksi делает отличную работу по разрушению различий. Быстрая и грязная сводка, хотя...

С точки зрения синтаксиса и использования. Синтаксис является примерно тем же между языками. Несколько причуд тут и там (прежде всего в ограничениях). Но в основном если можно читать один, можно, вероятно, читать/использовать другой.

самое большое различие, хотя находится в реализации.

Java использует понятие стирания типа для реализации дженериков. Короче говоря базовые скомпилированные классы не на самом деле универсальны. Они компилируют вниз для Возражения и броски. В действительности дженерики Java являются артефактом времени компиляции и могут легко ниспровергаться во времени выполнения.

C#, с другой стороны, на основании CLR, реализуют дженерики все они путь вниз к коду байта. CLR внес несколько повреждающихся изменений для поддержки дженериков в 2,0. Преимущества являются повышениями производительности, глубокой проверкой безопасности типов и отражением.

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

161
ответ дан Ufuk Hacıoğulları 5 November 2019 в 08:50
поделиться

Также найденный этот разговор с Anders Hejlsberg, который может быть интересным также. Для суммирования точек, которые Anders Hejlsberg сделал с некоторыми дополнительными примечаниями: дженерики Java были сделаны для максимальной совместимости с существующим JVM, который привел к немногим нечетным вещам по сравнению с реализацией, которую Вы видите в C#:

  • стирание Типа вынуждает реализацию представить каждое универсальное параметрическое значение как Object. В то время как компилятор обеспечивает автоматические броски между Object и более определенный тип, он не удаляет негативное воздействие бросков типа и упаковывающий на производительности (например, Object брошен к определенному типу MyClass, или int должен был быть упакован в Integer, который был бы еще более серьезным для C#/.NET, если бы они следовали за подходом стирания типа из-за пользовательских типов значения). Поскольку Anders сказал: "Вы не получаете ни одной эффективности выполнения" (который овеществленные дженерики включают в C#)

  • , стирание Типа делает информацию доступной во время компиляции не доступный во время времени выполнения . Что-то, что раньше было List<Integer>, становится просто List без способа восстановить универсальный параметр типа во времени выполнения. Это делает трудным создать отражательные или динамические сценарии генерации кода вокруг дженериков Java. Более свежий ТАК ответ шоу путь вокруг этого через анонимные классы. Но без приемов, что-то как генерация кода во времени выполнения через отражение, которое получает элементы от одного экземпляра набора и помещает его в другой экземпляр набора, может перестать работать во времени выполнения во время выполнения динамично сгенерированного кода: отражение не помогает с ловлей несоответствия в List<Double> по сравнению с List<Integer> в этих ситуациях.

, Но +1 для ответа, связывающегося с Jonathan Pryor сообщение в блоге .

5
ответ дан IgorK 5 November 2019 в 08:50
поделиться

Различие сводится к проектному решению Microsoft и Sun.

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

Из Учебных руководств по Java, Дженерики: Введите Стирание :

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

Однако с дженерики в C# (.NET) , нет никакого стирания типа компилятором, и проверки типа выполнены во время времени выполнения. Это обладает его преимуществами, что информация о типе сохраняется в скомпилированном коде.

Из Википедии:

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

Вместо того, чтобы говорить "дженерики.NET лучше, чем дженерики Java", нужно изучить различие в подходе для реализации дженериков. В Java кажется, что сохранение совместимости было высоким приоритетом, в то время как в.NET (когда представлено в версии 2.0), понимание полного преимущества использования дженериков было более высоким приоритетом.

35
ответ дан coobird 5 November 2019 в 08:50
поделиться