はこの考えてみましょう:.NETは「名前付き匿名」タイプのメリットはありますか?
var me = new { FirstName = "John", LastName = "Smith" };
私たちは、この行うことができますので、これは素晴らしいです:私たちは知らないので
public T GetMe()
{
return new { FirstName = "John", LastName = "Smith" };
}
:我々はこれを行うことはできませんしかし
Console.WriteLine("{0} {1}", me.FirstName, me.LastName);
をタイプT.
public object GetMe()
{
return new { FirstName = "John", LastName = "Smith" };
}
が、その後、我々はそれらにアクセスするためにリフレクションを使用して、オブジェクトのプロパティを検査する必要があるだろう:
var p = new Prog();
object o = p.GetMe();
Type t = o.GetType();
foreach (var prop in t.GetProperties())
{
Console.WriteLine(prop.Name + ": " + prop.GetValue(o, null));
}
しかし私たちはそれを定義するよう、我々は匿名型に名前を付けることができればどうですか?もちろん、それはもはや匿名ではありませんが、通常のクラス定義よりも簡潔で保守的です。
public Person GetMe()
{
return new public class Person { FirstName = "John", LastName = "Smith" };
}
その後、明示的にクラスを定義することなく、方法から複雑なLINQクエリの結果を返すことも可能であるという利点:
が、この考えてみましょう。我々だけではなく、これを行うことができますメソッドからクエリ変数を返すために
public class MyNumbers
{
public int Number { get; set; }
public int Square { get; set; }
public int Absolute { get; set; }
public IEnumerable<int> Range { get; set; }
}
:代わりにそのようなクラスを定義するので
List<int> list = new List<int>();
var query = from number in list
select
new
{
Number = number,
Square = number*number,
Absolute = Math.Abs(number),
Range = Enumerable.Range(0, number)
};
:
は、この比較的複雑なLINQクエリを考えてみます。
List<int> list = new List<int>();
return from number in list
select new public class MyNumbers
{
Number = number,
Square = number*number,
Absolute = Math.Abs(number),
Range = Enumerable.Range(0, number)
};
これは、他のコンテキストでMyNumbersを使い始めたときに非常に醜いものになります。メソッドの境界を越えた型を使用している場合は、その型がインラインで宣言されていないと、より保守性と読みやすさが向上します。 –
+1 to spoon16さんのコメント。 – strager
私はこれらの問題を緩和するためにコンパイラにいくつかの賢いものを置くことができると思います。 –