是否可以在 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)
这是因为您没有调用参数化构造函数。看看下面的代码:
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字符串获得值。
由于其他人已经回答了有关如何调用“复制构造函数”的问题(即将另一个实例传递给构造函数:)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)