2012-07-27 166 views
1

我要去一个通过MVC教程时,我碰到这样的:添加项目到列表

public ActionResult Index() 
{ 
    dynamic genres = new List<Genre> { 
     new Genre { Name = "Disco" }, 
     new Genre { Name = "Jazz" }, 
     new Genre { Name = "Rock" } 
    }; 
    return View(genres); 
} 

有什么区别,如果我使用Genre.Add("Disco"); ...相反。谢谢。

+0

或者是'Add'是一个静态方法在Genre上创建它自己的对象,由字符串Name命名。除非我们看到体裁班,没有什么可以说:) – nawfal 2012-07-27 08:29:12

回答

3

我想你的意思是说Genre.Addgenres.Add(该List<T>.Add法)之间的差异可能是在Genre一个静态方法或在Genre变量,无论它已经发布了一个实例方法。

没有行为最终代码的区别,它只是一个视觉差异。

不知道为什么你正在使用dynamic(也许你正在寻找var?),但不同的是,这个被称为collection initialization syntax,基本上糖在手动调用.Add

var genres = new List<Genre> { 
    new Genre { Name = "Disco" }, 
    new Genre { Name = "Jazz" }, 
    new Genre { Name = "Rock" } 
}; 

相当于:

var genres = new List<Genre>(); 
genres.Add(new Genre { Name = "Disco" }); 
genres.Add(new Genre { Name = "Jazz" }); 
genres.Add(new Genre { Name = "Rock" }); 

编译器为您输出.Add您的情况。

Whats the difference between these three ways of creating a new List<string> in C#?

在你的榜样

而且,你所看到的对象初始化语法有:

new Genre { Name = "Disco" } 

这相当于:

var g = new Genre(); 
g.Name = "Disco"; 
1

以汇编术语无。它实际上是语法糖

dynamic genres = new List<Genre(); 
genres.Add(new Genre... 

这就是我假设你的意思,因为Genre.Add(string)没有描述。

+0

你是如何确定它没有描述? :) – nawfal 2012-07-27 08:30:04

3

不清楚为什么您在这里使用dynamic开始,说实话。但如果你使用

List<Genre> genres = new List<Genre>(); 
genres.Add(new Genre { Name = "Disco" }); 
genres.Add(new Genre { Name = "Jazz" }); 
genres.Add(new Genre { Name = "Rock" }); 

它会有同样的效果。

请注意,它是genres.Add,而不是Genre.Add。我也建议如果你创建一个名称为类型构造函数,它会使代码变得更简单 - 或者如果你还想让名称部分明确,你可以创建一个Genre.FromName静态方法。