Различие между CLR 2.0 и CLR 4.0

Если количество размеров фиксируется, это просто SelectMany:

var qry = from a in A
          from b in B
          from c in C
          select new {A=a,B=b,C=c};

Однако, если количеством размеров управляют по условию, необходимо использовать рекурсию:

static void Main() {
    List<List<int>> outerList = new List<List<int>>
    {   new List<int>(){1, 2, 3, 4, 5},
        new List<int>(){0, 1},
        new List<int>(){6,3},
        new List<int>(){1,3,5}
    };
    int[] result = new int[outerList.Count];
    Recurse(result, 0, outerList);
}
static void Recurse<TList>(int[] selected, int index,
    IEnumerable<TList> remaining) where TList : IEnumerable<int> {
    IEnumerable<int> nextList = remaining.FirstOrDefault();
    if (nextList == null) {
        StringBuilder sb = new StringBuilder();
        foreach (int i in selected) {
            sb.Append(i).Append(',');
        }
        if (sb.Length > 0) sb.Length--;
        Console.WriteLine(sb);
    } else {
        foreach (int i in nextList) {
            selected[index] = i;
            Recurse(selected, index + 1, remaining.Skip(1));
        }
    }
}
22
задан Yogesh 26 October 2009 в 18:21
поделиться

6 ответов

Одна новая вещь CLR, о которой я знаю, - это форма структурной типизации для интерфейсов, структур и делегатов ради поддержки NoPIA - в основном, это позволяет среде выполнения обрабатывать отдельные типы с эквивалентными определениями, как если бы они были одними и теми же - так, если две сборки A и B имеют объявленный в них COM-импортированный интерфейс IFoo , с одинаковые IID и те же члены, среда выполнения будет рассматривать их как эквивалентные типы; поэтому, если есть экземпляр некоторого класса Foo , реализующего [A] IFoo , вы можете преобразовать его в [B] IFoo , и приведение будет работать.

] Еще одна вещь - возможность разместить несколько версий CLR бок о бок в одном процессе. Например, вы не можете разместить 1.x и 2.0 в одном процессе, но можете разместить 2. 0 и 4.0. Основным преимуществом этого является возможность загружать плагины, написанные для любой версии CLR одновременно.

Еще один незначительный момент заключается в том, что еще несколько исключений стали неуловимыми, например StackOverflowException было в 2.0 - вы не можете поймать AccessViolationException , например.

Кроме того, здесь представляет собой презентацию PowerPoint на CLR 4.0 от PDC 2008. Сейчас это может быть немного устаревшим, но большинство вещей, которые упоминаются там, похоже, в бета-версиях.

11
ответ дан 29 November 2019 в 05:40
поделиться

Я попытался взглянуть на некоторые новые вещи C # в Reflector, чтобы узнать, есть ли что-нибудь новое внизу:

  • динамические типы преобразуются в объект s с помощью магии компилятора, которая добавляет вызовы библиотеки для обработки привязки времени выполнения.
  • Необязательные параметры обрабатываются через компилятор. Если вы вызовете Foo (int x = 5) без указания значения для x, вы увидите вызов как Foo (5) в Reflector.

Так что, я думаю, вы не заметите никаких изменений (например, общую поддержку в CLR 2.0).

0
ответ дан 29 November 2019 в 05:40
поделиться

Я не верю, что есть какие-либо новые инструкции IL. В новой среде CLR улучшены такие вещи, как встраивание и сборка мусора, которые выполняют ту же работу, что и среда CLR 2.0, но лучше. Виртуальная машина (например, CLR или JVM) - это абстрактное понятие с множеством возможных реализаций. Я считаю, что CLR 4.0 - это та же абстрактная машина, что и в CLR 2.0, только с улучшенной реализацией.

Даже новый динамический материал - это просто уловка компилятора с новыми API (в отличие от Java, где он предлагается как новый код операции .)

Если я ошибаюсь, я хотел бы знать!

2
ответ дан 29 November 2019 в 05:40
поделиться

Есть огромное количество изменений.

В самой CLR есть несколько изменений. Сборщик мусора изменяется для поддержки одновременной сборки gen0 / 1 и gen2 в режиме рабочей станции. Кроме того, есть некоторые изменения в реализации безопасности. Параллельная структура меняет некоторые реализации пула потоков в CLR (который не полностью управляется, но является частью самой среды выполнения). Кроме того, есть некоторые изменения в системе типов, в основном связанные с новой поддержкой PIA COM.

Самыми большими изменениями, вероятно, являются больше изменений библиотеки / фреймворка, чем изменения среды CLR. такие как интеграция DLR в структуру и новый динамический тип. Что касается фреймворка, у вас есть реактивный фреймворк, расширения параллельных библиотек, контракты кода, поддержка кортежей и множество мелких изменений (например:

4
ответ дан 29 November 2019 в 05:40
поделиться

Для каждого выпуска документации команды создают документы «Что нового».

Вот один для C # 4.0 Beta2: Что нового в Visual C # 2010

А вот один для .NET Framework 4.0 Beta2: Что нового в .NET Framework версии 4

Это наиболее полные списки изменений, которые вы можете найти.

2
ответ дан 29 November 2019 в 05:40
поделиться

Многие основные типы интерфейсов и делегатов в CLR были обновлены для поддержки общей ковариации и контравариантности . Например, IEnumerable был изменен на IEnumerable .

1
ответ дан 29 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

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