【发布时间】:2016-06-29 09:19:33
【问题描述】:
从 C++11 开始,可以编写类似的东西
#include <vector>
#include <string>
struct S
{
S(int x, const std::string& s)
: x(x)
, s(s)
{
}
int x;
std::string s;
};
// ...
std::vector<S> v;
// add new object to the vector v
// only parameters of added object's constructor are passed to the function
v.emplace_back(1, "t");
对于容器类 (System.Collections.Generic.List),是否有任何 C++ 函数的 C# 类似物,例如 emplace 或 emplace_back?
更新:
在 C# 中,类似的代码可能会写成 list.EmplaceBack(1, "t"); 而不是 list.Add(new S(1, "t"));。最好不要记住类名并在这种情况下每次都写new ClassName。
【问题讨论】:
-
不是所有的 C# 对象总是动态分配的,基本上总是指针持有的吗?这样一个 emplace 功能会带来什么?
-
@Angew 对于
struct数据类型,它会稍微快一些。对于大的struct数据类型,它可能会更快。但是struct数据类型不应该很大,所以这将是一个寻找问题的解决方案:-) -
@Angew 减少代码大小。使用 emplace,您无需在 C++ 中编写
v.insert(S(1, "t"));。在 C# 中,它可能写成list.EmplaceBack(1, "t");而不是list.Add(new S(1, "t"));。 -
如果你写
C#实现并说明它有什么问题会更好。 -
如果你觉得它对 C# 来说是一个有价值的特性,你可以随时在 connect.microsoft.com 添加特性请求。但是,如果它进入实现功能的最终列表,我会非常非常惊讶。已经有一种方法可以做到这一点,在 C# 存在的 17 年中很少有人抱怨必须键入类名,并且它在 C# 中没有实际用途(与 C++ 不同)。再加上设计、测试和文档的数量,可能远远超过感知到的好处。习惯输入类名...
标签: c# collections emplace