当前位置:  开发笔记 > 编程语言 > 正文

是否有在C#中重载赋值运算符的解决方法?

如何解决《是否有在C#中重载赋值运算符的解决方法?》经验,为你挑选了3个好方法。

与C++不同,在C#中,您不能重载赋值运算符.

我正在为具有非常大数字的算术运算做一个自定义Number类,我希望它具有内置数值类型的外观,如int,decimal等.我已经重载了算术运算符,但是任务仍然是......

这是一个例子:

Number a = new Number(55); 
Number b = a; //I want to copy the value, not the reference

该问题是否有解决方法?



1> 小智..:

您可以使用'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";


这不是只有在你试图将一种类型分配给另一种类型时才有效吗?毕竟,这是一个隐含的演员.如果您想将`Number`分配给`Number`,我认为这不会有所帮助.
很酷,这回答了我要问的一个问题;)

2> Jon Skeet..:

我真的不清楚你真的需要这个.或者:

您的数字类型应该是结构(很可能 - 数字是结构的最常见示例).请注意,您希望类型的所有类型(int,decimal等)都是结构体.

要么:

您的数字类型应该是不可变的,使每个变异操作返回一个新实例,在这种情况下,您无需在分配时复制数据.(事实上​​,你的类型应该是不可变的,无论它是否是一个结构.可变结构是邪恶的,一个数字肯定不应该是一个可变的引用类型.)


如果可以防止对象共享,可变性并不邪恶.这可以通过实现需要某种形式的赋值重载的线性类型来完成.http://en.wikipedia.org/wiki/Linear_type_system.

3> Johannes Sch..:

因为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,就不会发生改变.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有