与C++不同,在C#中,您不能重载赋值运算符.
我正在为具有非常大数字的算术运算做一个自定义Number类,我希望它具有内置数值类型的外观,如int,decimal等.我已经重载了算术运算符,但是任务仍然是......
这是一个例子:
Number a = new Number(55);
Number b = a; //I want to copy the value, not the reference
Run Code Online (Sandbox Code Playgroud)
该问题是否有解决方法?
小智 44
您可以使用'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.
}
Run Code Online (Sandbox Code Playgroud)
完成后,您可以在代码中使用以下内容:
Foo x = "whatever";
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 28
我真的不清楚你真的需要这个.或者:
要么:
因为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 */
Run Code Online (Sandbox Code Playgroud)
在C++中(它将丢失对第一个对象的引用,并创建内存泄漏.但是让我们忽略它).你也不能在C++中为assign操作符重载.
解决方法很简单:
MyType a = new MyType();
MyType b = new MyType();
// instead of a = b
a.Assign(b);
Run Code Online (Sandbox Code Playgroud)
免责声明:我不是C#开发人员
你可以像这样创建一个只写属性.然后做一个.Self = b; 以上.
public MyType Self {
set {
/* copy content of value to this */
this.Assign(value);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这是不是好.因为它违反了最不惊讶的原则(POLS).如果一个人做了a.Self = b,就不会发生改变.
归档时间: |
|
查看次数: |
24416 次 |
最近记录: |