C# 结构上的复制构造函数,其工作方式类似于 C++ 复制构造函数

mat*_*att 3 c# c++

是否可以在 C# 结构上有一个复制构造函数,它像 C++ 复制构造函数一样工作?因为我的不工作。

具体来说,它不会在赋值期间自动调用,就像 C++ 复制构造函数会发生的那样。

struct TestStruct
{
    public TestStruct(TestStruct other)
    {
        // this function is never called
    }
}

public void Afunction()
{
    TestStruct A = new TestStruct();
    TestStruct B = new TestStruct();

    A = B; // in c++ copy constructor would be called here
}
Run Code Online (Sandbox Code Playgroud)

Mah*_*ari 7

这是因为您没有调用参数化构造函数。看看下面的代码:

struct TestStruct
{
    public string WhoIsCalled;
    public TestStruct(TestStruct other)
    {
        // this function is never called
        WhoIsCalled = "Constructor with argument";
    }

}

public string Afunction()
{

    TestStruct A = new TestStruct();
    return A.WhoIsCalled;

}
public string Bfunction()
{

    TestStruct B = new TestStruct(new TestStruct());
    return B.WhoIsCalled;

}
Run Code Online (Sandbox Code Playgroud)

当您运行Afunction 时,它返回 null。这意味着您的代码正在使用 default-parameterless-constructor。但是在Bfunction 中,您的代码提供了参数,因此您的构造函数被调用,因此WhoIsCalled字符串获得值。

  • 我给你加一,因为你现在可能会因为在 -5 个问题上获得 +5 而获得徽章;)(如果它达到 -5) (3认同)

Ruf*_*s L 2

由于其他人已经回答了有关如何调用“复制构造函数”的问题(即将另一个实例传递给构造函数:)TestStruct B = new TestStruct(A);),我将尝试回答其他问题。

“能否为 C# 结构提供一个像 C++ 复制构造函数一样工作的复制构造函数?”

不会。在 C++ 中,在将一个类型分配给该类型的另一个实例期间,会自动调用复制构造函数。在C#中,对对象进行浅拷贝,即复制值类型成员的值,复制引用类型成员的引用。

来自评论:“你可以重载赋值运算符吗?”

不可以。赋值运算符不是可以重新定义的。该语言的默认行为是每次都会发生的情况。当然,您可以编写自己的方法,根据另一个实例的属性值返回类型的新实例,但该方法必须显式调用,并且不能定义为在赋值期间调用。

还来自评论:“我正在尝试用结构或类透明地替换本机值类型(int)”

好吧,现在听起来你可能有一些工作要做。虽然我真的不确定“替换本机值类型”是什么意思,但 c#确实允许您编写自己的用户定义的转换运算符,这些运算符允许在两种类型之间进行隐式(和显式)转换。当您从不同类型进行赋值时,这会有效地覆盖赋值运算符。

当然,这不是您的示例所做的,但根据您的评论,它可能有用。

例如,如果您想从 an 创建结构实例int,您可以执行以下操作:

struct MyIntReplacement
{
    public int MyValue { get; set; }

    public static implicit operator MyIntReplacement(int value)
    {
        return new MyIntReplacement { MyValue = value };
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以做类似的事情:

int someValue = 5;
MyIntReplacement foo = someValue;
Run Code Online (Sandbox Code Playgroud)