Что такое Система. Linq. Выражения в C#, используемом для?

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

namespace EntityType {
    enum Enum {
        Ground = 0,
        Human,
        Aerial,
        Total
    };
}

void foo(EntityType::Enum entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}

РЕДАКТИРОВАНИЕ : Однако эта техника стала устаревшей в C++ 11. Ограниченное по объему перечисление (объявленный с enum class или enum struct) должно использоваться вместо этого: это более безопасно с точки зрения типов, кратко, и гибко. С перечислениями старого стиля значения помещаются во внешний объем. С модернизированным перечислением они размещаются в рамках эти enum class имя.
Предыдущий пример, переписанный с помощью ограниченного по объему перечисления (также известный как перечисление со строгим контролем типов ):

enum class EntityType {
    Ground = 0,
    Human,
    Aerial,
    Total
};

void foo(EntityType entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}

существуют другие значительные преимущества от использования ограниченных по объему перечислений: отсутствие неявного броска, возможного предописания и способности использовать пользовательский базовый тип (не значение по умолчанию int).

5
задан Palec 23 April 2019 в 09:33
поделиться

7 ответов

LINQ - это функция .NET 3.5 со встроенной поддержкой языков из C # 3.0 и Visual Basic 2008. В MSDN имеется множество примеров.

0
ответ дан 18 December 2019 в 05:43
поделиться

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

Еще одна важная вещь, которую нужно поднять о деревьях выражений, - это построение дерева выражений для определения того, что вы будут делать, вам не нужно на самом деле что-либо делать. Я имею в виду отложенное выполнение.

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());
5
ответ дан 18 December 2019 в 05:43
поделиться

LINQ был представлен в .NET 3.5. На этом сайте много примеров.

1
ответ дан 18 December 2019 в 05:43
поделиться

Linq был добавлен в .Net 3.5 (и добавлен в компилятор C # 3.0, а также в немного ограниченной форме в компилятор VB.net в том же выпуске)

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

Функциональность Expression - это просто возможность программы во время выполнения, проверять абстрактный синтаксис некоторых передаваемых конструкций кода. Их называют лямбдами. И, по сути, они представляют собой способ более легкого написания анонимных функций, упрощая самоанализ их структуры во время выполнения.

Функциональность Linq, подобная SQL, наиболее тесно связана (хотя и не единственная) называется Linq to Sql, где примерно так:

from f in Foo where s.Blah == "wibble" select f.Wobble;

компилируется в представление этого запроса, а не просто код для выполнения запроса. Часть, которая делает его linq to sql, - это «бэкэнд», который преобразует его в sql. Для этого выражение транслируется в операторы sql server для выполнения запроса к связанной базе данных с сопоставлением строк с объектами .net и преобразованием логики C # в эквивалентные предложения where. Вместо того, чтобы просто привести к функции, они предоставляют способ построения функции (как выражение), чтобы другие аспекты программы могли управлять ею.

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

Многие аспекты того, что делает это возможным, помещены под заголовком "Linq", несмотря на то, что на самом деле они не являются Linq themsleves.
Например, анонимные типы требуются для легкого использования проекции (выбор подмножества возможных свойств), но анонимные типы могут использоваться и вне Linq.

Linq, особенно через лямбды (которые делают написание анонимных делегатов, очень легких с точки зрения синтаксиса) привело к расширению функциональных возможностей C #. это подкрепляется методами расширения в IEnumerable , такими как Select (), соответствующие map во многих функциональных языках, и Where (), соответствующие фильтру . Как и анонимные типы, это не является само по себе Linq, хотя многие считают его сильно благоприятным влиянием на разработку C # (это не универсальная точка зрения, но широко распространенная). В общем, вы могли бы заботиться о выражениях только в том случае, если бы вы пытались написать поставщиков linq, которые представляют собой код, который принимает выражение, а не просто функцию, и использует его для чего-то другого, кроме того, что будет делать обычная функция, например, поговорить с внешним источником данных .

Другие варианты использования могут быть, когда вы хотите чтобы получить некоторые метаданные о том, что делают внутренние компоненты функции, возможно, затем скомпилируя выражение (в результате получится делегат, который позволит вам выполнить выражение как функцию) и что-то сделать с ним или просто взглянув на метаданные объекты для создания отражающего кода, который проверяется во время компиляции как , этот ответ показывает .

22
ответ дан 18 December 2019 в 05:43
поделиться

Это также довольно подробно рассматривается здесь, на SO .

1
ответ дан 18 December 2019 в 05:43
поделиться

System.Linq.Expressions предназначен для ручного построения (или машинной генерации) деревьев выражений. У меня такое ощущение, что, учитывая сложность создания более сложных функций, это пространство имен используется недостаточно. Однако он чрезвычайно мощный. Например, один из моих сотрудников недавно реализовал дерево выражений, которое может автоматически масштабировать любой объект LINQ to SQL с помощью функции совокупной плотности. Каждый столбец получает свое собственное дерево, которое так быстро компилируется. Я создавал специализированный компилятор, который широко использует их для реализации основных функций, а также для склеивания остальной части сгенерированного кода.

Для получения дополнительной информации и идей см. эту запись в блоге .

1
ответ дан 18 December 2019 в 05:43
поделиться

Вот много примеров Linq:
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

0
ответ дан 18 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

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