与C++不同,在C#中,您不能重载赋值运算符.
我正在为具有非常大数字的算术运算做一个自定义Number类,我希望它具有内置数值类型的外观,如int,decimal等.我已经重载了算术运算符,但是任务仍然是......
这是一个例子:
Number a = new Number(55); Number b = a; //I want to copy the value, not the reference
该问题是否有解决方法?
您可以使用'implicit'关键字为赋值创建重载:
假设您有类似Foo的类型,您认为可以从字符串中隐式转换.您可以在Foo类中编写以下静态方法:
public static implicit operator Foo(string normalString) { //write your code here to go from string to Foo and return the new Foo. }
完成后,您可以在代码中使用以下内容:
Foo x = "whatever";
我真的不清楚你真的需要这个.或者:
您的数字类型应该是结构(很可能 - 数字是结构的最常见示例).请注意,您希望类型的所有类型(int,decimal等)都是结构体.
要么:
您的数字类型应该是不可变的,使每个变异操作返回一个新实例,在这种情况下,您无需在分配时复制数据.(事实上,你的类型应该是不可变的,无论它是否是一个结构.可变结构是邪恶的,一个数字肯定不应该是一个可变的引用类型.)
因为a = b,你将无法解决C++外观问题.在C++中有其他语义而不是在C#中.在C#中,a = b; 指向像b这样的同一个对象.在C++中,a = b改变了a的内容.两者都有起伏.就像你一样
MyType * a = new MyType(); MyType * b = new MyType(); a = b; /* only exchange pointers. will not change any content */
在C++中(它将丢失对第一个对象的引用,并创建内存泄漏.但是让我们忽略它).你也不能在C++中为assign操作符重载.
解决方法很简单:
MyType a = new MyType(); MyType b = new MyType(); // instead of a = b a.Assign(b);
免责声明:我不是C#开发人员
你可以像这样创建一个只写属性.然后做一个.Self = b; 以上.
public MyType Self { set { /* copy content of value to this */ this.Assign(value); } }
现在,这是不是好.因为它违反了最不惊讶的原则(POLS).如果一个人做了a.Self = b,就不会发生改变.