При создании перечислений, помещает их в пространство имен так, чтобы можно было получить доступ к ним с понятным именем:
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
).
LINQ - это функция .NET 3.5 со встроенной поддержкой языков из C # 3.0 и Visual Basic 2008. В MSDN имеется множество примеров.
Одна из областей этого вопроса, которая еще не была рассмотрена, - это деревья выражений. Есть действительно хорошая статья о деревьях выражений (и лямбда-выражениях), доступная здесь .
Еще одна важная вещь, которую нужно поднять о деревьях выражений, - это построение дерева выражений для определения того, что вы будут делать, вам не нужно на самом деле что-либо делать. Я имею в виду отложенное выполнение.
//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());
LINQ был представлен в .NET 3.5. На этом сайте много примеров.
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, которые представляют собой код, который принимает выражение, а не просто функцию, и использует его для чего-то другого, кроме того, что будет делать обычная функция, например, поговорить с внешним источником данных .
Другие варианты использования могут быть, когда вы хотите чтобы получить некоторые метаданные о том, что делают внутренние компоненты функции, возможно, затем скомпилируя выражение (в результате получится делегат, который позволит вам выполнить выражение как функцию) и что-то сделать с ним или просто взглянув на метаданные объекты для создания отражающего кода, который проверяется во время компиляции как , этот ответ показывает .
Это также довольно подробно рассматривается здесь, на SO .
System.Linq.Expressions предназначен для ручного построения (или машинной генерации) деревьев выражений. У меня такое ощущение, что, учитывая сложность создания более сложных функций, это пространство имен используется недостаточно. Однако он чрезвычайно мощный. Например, один из моих сотрудников недавно реализовал дерево выражений, которое может автоматически масштабировать любой объект LINQ to SQL с помощью функции совокупной плотности. Каждый столбец получает свое собственное дерево, которое так быстро компилируется. Я создавал специализированный компилятор, который широко использует их для реализации основных функций, а также для склеивания остальной части сгенерированного кода.
Для получения дополнительной информации и идей см. эту запись в блоге .
Вот много примеров Linq:
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx