首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有C#类似于C++11 emplace/emplace函数?

是否有C#类似于C++11 emplace/emplace函数?
EN

Stack Overflow用户
提问于 2016-03-14 11:04:54
回答 3查看 2.4K关注 0票数 12

从C++11开始,您可以编写以下内容

代码语言:javascript
复制
#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");

是否有类似于容器类( C# )的C++函数(如emplaceemplace_back )的emplace模拟?

更新:在C#中类似的代码可能被写成list.EmplaceBack(1, "t");而不是list.Add(new S(1, "t"));。最好不要记住类名,每次都在这种情况下编写new ClassName

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-14 15:14:45

您可以通过扩展来稍微改进@Boo变体

您可以使用Activator.CreateInstance创建对象实例,从而使解决方案更加通用。

代码语言:javascript
复制
public static class ListExtension
{
    public static void Emplace<S>(this IList<S> list, params object[] parameters)
    {
        list.Add((S)Activator.CreateInstance(typeof(S), parameters));
    }
}

注意:未选中类型和计数参数,因此,如果您做了错误的事情,您只会在运行时出现错误。

票数 4
EN

Stack Overflow用户

发布于 2016-03-14 11:26:59

一般来说,在C#中没有类似的东西,它的需求也比C++少得多。

在C#中,当您有一个List<SomeReferenceType>时,您真正拥有的是一个List<ReferenceToSomeType>,所以是一个引用列表,每个元素的大小为4或8个字节(参见.NET中的对象引用有多大?)。复制引用不会导致基础对象被复制,因此它非常快(您正在复制大约4或8个字节,并且处理器是针对此操作进行优化的,因为这是处理器的本机指针的大小)。因此,当您someList.Add(someReference)时,您要做的是向您的List<>添加一个引用。

在C++中,当您有一个std::vector<SomeType>时,您拥有的是一个SomeType向量,每个元素的大小等于sizeof(SomeType)。在std::vector<>中插入一个新元素将导致要插入的元素被复制(克隆、复制.选择一个你喜欢的动词)。这是个昂贵的手术。

通常,您使用的模式是创建一个对象,以便将其插入到std::vector<>中。为了在C++11中优化这个操作,他们增加了两种方法:std::vector<>::emplace方法和std::vector<>对移动语义的支持。不同之处在于,移动语义必须由SomeType类型支持(您需要一个带有noexcept说明符的移动构造函数),而每个类型都支持emplace (最终只使用放置构造函数)。

票数 6
EN

Stack Overflow用户

发布于 2016-03-14 11:24:04

在c#中,您可以使用扩展方法来实现您想要的

代码语言:javascript
复制
public static class ListExtension
{
    public static void Emplace(this IList<S> list, int x, string s)
    {
        list.Add(new S(x, s));
    }
}

那就像这样用吧

代码语言:javascript
复制
myList.Emplace(1,"t");
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35985797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档