需要注意的是一些「喃喃自語」是可能相對於匿名類型,非常感謝C#兩點:
- 類型推斷
- 相同的匿名類型
的統一。如果你是快樂的依靠這兩件事仍然是固定的(對此沒有保證,特別是與2有關),那麼以下內容可能會有用。
public static class Mumble
{
public static HashSet<T> HashSet<T>(T prototype)
{
return new HashSet<T>();
}
public static List<T> List<T>(T prototype)
{
return new List<T>();
}
}
您可以使用它像這樣:
var set = MumbleSet(new { Foo="", Bar="", Baz=0 });
var list = MumbleList(new { Foo="", Bar="", Baz=0 });
set.Add(new { Foo="x", Bar="y", Baz=1 });
set.Add(new { Foo="a", Bar="b", Baz=1 });
list.Add(new { Foo="a", Bar="b", Baz=1 });
var intersection = list.Intersect(set);
var concat = list.Concat(set);
這,你必須要在方法中的其他地方填充到一些其他的收集使用匿名類型的案件效果很好。常見的用法是將數據庫查詢讀入一個集合中,以便後面檢查是否存在於循環中,將此表示爲一系列linq查詢太麻煩或太昂貴。
爲了您的激勵例子中,你將不得不增加以下內容:
class TimeSerie<TValue>
{
// or some other constructor equivalent
public TimeSerie(TValue value) { /* assign the value */ }
}
static class TimeSerieMumble
{
public static TimeSerie<TValue> New<TValue>(TValue value)
{
return new TimeSerie<TValue>(value);
}
}
然後,你可以使用的代碼如下所示:
var tsList = Mumble.List(TimeSerieMumble.New(new { Name="", Value=0 }));
foreach (var x in from c select new { c.Name, c.Value })
{
tsList.Add(TimeSerieMumble.New(new { x.Name, x.Value }));
}
喃喃其中「泄漏」到公共API不在C#3中是可行的。5,除非類型要通過一系列類型推斷的泛型方法與上例相同。考慮到調用代碼所需的扭曲,我從未見過這種情況是有用的。我不認爲這會提高可讀性。根據經驗,在Name/Value示例中使用兩個以上的嘟嘟聲可能會導致嚴重的併發症。
你可以做列表>等等,但我很好奇這將如何有用。 –
2009-12-03 15:48:49
我們稱這個功能爲「嘟嘟型」。也就是說,你會說「這是一個愚蠢的時間表列表」,編譯器必須弄清楚「笨拙」的含義。特別適用於「嘟嘟」是匿名類型的情況。我們認爲它適用於C#4,但最終決定此次不實施它。也許在假設的未來版本中。如果您對此功能有非常棒的場景,請隨時通過電子郵件發送給我(來自我博客上的聯繫人鏈接)。我們擁有的場景越多,未來實際發佈的功能就越有可能。 – 2009-12-03 16:02:09