好吧所以标题可能令人困惑,所以我发布了2个代码片段来说明我的意思。
注意:allUsers只是一个集合。
RegularUser regUser = new RegularUser(userName, password, name, emailAddress);
allUsers.Add(regUser);
VS
allUsers.Add(new RegularUser(userName, password, name, emailAddress));
答案 0 :(得分:2)
就C#而言,两个代码示例在IL级别上几乎完全相同。第二个示例仍然创建对创建的对象的引用并将其推送到堆栈,您只是没有连接到它的本地变量。这根本不会产生任何性能问题。
答案 1 :(得分:0)
我真的很想以第一种方式创造它们,除非我真的知道发生了什么。如果你不先创建对象,那么进行调试要困难得多......
无论如何,编译器只会将第二个版本转换为第一个版本,因此没有净负面影响。
#1的优点:
缺点:
结果:
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));