声明并创建对象,然后添加到集合VS使用new关键字将对象添加到集合以创建对象

时间:2010-03-27 00:03:23

标签: c#

好吧所以标题可能令人困惑,所以我发布了2个代码片段来说明我的意思。

注意:allUsers只是一个集合。

RegularUser regUser = new RegularUser(userName, password, name, emailAddress);
        allUsers.Add(regUser);

VS

        allUsers.Add(new RegularUser(userName, password, name, emailAddress));
  1. 哪个片段A或B更好,为什么?
  2. 有什么优点或缺点?
  3. 我写的例子是C#,但语言(C#,Java等)是否有所作为?

4 个答案:

答案 0 :(得分:2)

就C#而言,两个代码示例在IL级别上几乎完全相同。第二个示例仍然创建对创建的对象的引用并将其推送到堆栈,您只是没有连接到它的本地变量。这根本不会产生任何性能问题。

答案 1 :(得分:0)

我真的很想以第一种方式创造它们,除非我真的知道发生了什么。如果你不先创建对象,那么进行调试要困难得多......

无论如何,编译器只会将第二个版本转换为第一个版本,因此没有净负面影响。

#1的优点:

  • 更容易调试(!)
  • 理论上更容易阅读,更清晰
  • 以后可以使用该对象

缺点:

  • 更详细
  • 可能是不必要的,特别是对于琐碎的对象

结果:

  • 1表示任何复杂的创建,或者可能需要在调试时轻松检查
  • 2对于很多讨厌的小东西,如下所示。

var list = new List<NameValuePair>(3);
list.Add( new NameValuePair("name", "valuable");
list.add( new NameValuePair("age",  "valuable");
list.add( new NameValuePair("height", "not valuable");

var dates = new List<date>();
dates.Add(DateTime.Now());
dates.Add(DateTime.Now().Date().AddYears(-2));

据我所知,语言之间并没有真正的区别。但有些人可能不允许这样做。

答案 2 :(得分:0)

1)哪个片段A或B更好,为什么?

他们真的相同。编译后的代码几乎相同,因为临时对象被压入堆栈,然后在方法调用中使用。

2)有哪些优点或缺点?

该方法的主要优点和缺点实际上只是可读性。

您的第一个示例的优点是每行代码保持一个“操作”,这在很多方面更易于维护。

第二个示例删除了不必要的变量声明,这可能更易于维护。

就我个人而言,我觉得RegularUser构造函数中的参数数量可能会让我(在这种情况下)朝向您的第一个选项。我通常会发现,当一行代码在普通显示器上超过屏幕宽度的一半时,如果它被拆分则更容易阅读和理解。通过引入临时和单独调用Add来分割这一点使得这一点更加明确。

但是,如果您只是添加一个非常小的整数或类,我可能会投票跳过不必要的变量。然而,这完全是个人偏好 - 你的milage可能(并且可能会)变化。

3)我写的例子是C#,但语言(C#,Java等)是否有所作为?

不,大部分时间。这实际上取决于语言/实现,但大多数语言在两种情况下都具有相同的基本行为和性能。有可能(很有可能)某些语言可能会对此有所不同,但大多数主流语言都不会这样做。

答案 3 :(得分:0)

两者在性能方面都是平等的。

就可维护性而言,第二种情况是噩梦,在调试器中(几乎)无法跟踪。所以我倾向于选择第一个。在我早期的那些日子里,我总是在写第二篇,因为“我知道它们是物体而且我很擅长抓住物体,我......等等等等”,但随着时间的推移而特别是维持时间

另外,假设有人要你

FilterClass.FilterUser(regUser)

Database.AddToDatabase(regUser)

因为它是正确的地方,所以第一种情况更好。

最后,你什么时候停止?

allUsers.Add(new RegularUser(new ReadFromInput(new EscapedName(new Name(new String(userName)))), password, name, emailAddress));