Pull to refresh

Анонимные типы за пределами функции

Reading time2 min
Views12K
Анонимные типы — очень приятное расширение C#, появившееся в версии 3.0. С помощью анонимных типов мы можем налету создать объект-хранилище и наполнить его данными.
Основное применение анонимных типов — это, конечно, LINQ. Фактически, они и были созданы для него (вообще говоря, все нововведения C# 3.0 были сделаны для LINQ, за исключением, пожалуй, частичных методов).
var o = new {Bar=2, Foo="string"};


Однако, мы не сможем использоваь этот объект вне метода, в котором он был объявлен и проинициализирован:
??? GetFullName()
{
  return new {Name="Иван", Surname="Иванов"};
}

object PrintFullName()
{
  var fullname = GetFullName() as ???;
}


Фактически, мы не знаем, какой тип нужно использовать вместо ???.. Однако есть еще один, не совсем очевидный способ использования анонимных типов — в качестве ключей для Dictionary:
Dictionary<object, string> dict = new Dictionary<object, string>();
public void Add()
{
   dict.Add(new {x=5, y=6}, "test");
}
      
public void Get(){
   Console.WriteLine(dict[new{x=5, y=6}]);
}
* This source code was highlighted with Source Code Highlighter.

Это становится возможным благодаря тому, что сгенерированные компилятором оболочки для анонимных типов реализуют методы Equals() и GetHashCode(). Правда, остается та же проблема — мы не сможем получить значения из такого ключа, потому как опять не сможем явно указать его тип, поэтому использования ключа ограничивается только методами Get(), Set() и ContainsKey().
Итак, если вам необходимо организовать хранение данных в Dictionary по сложному ключу, состоящему из нескольких полей, и вам не нужно получать значения этого ключа — смело используете анонимные типы.
Tags:
Hubs:
+17
Comments31

Articles