积极答复者
请教一个关于等号重载的问题

问题
-
对=重载,想达成这样一种效果:等号左面的对象的值全部从右方复制而来。
目前做的重载,只是返回一个新生成的对象,我不想开那么多内存……
现在的代码是public static implicit operator MyClass(Class c)
{
return new MyClass(c);
}这样每次都会新生成一个对象,当频繁调用时内存问题很严重。我想当
MyClass c;
c = new Class();时,如何使c的值对应到new Class()里的值而不是新生成一个MyClass ……
另外,MyClass是有很多实例同时使用的,不可以用静态对象为其赋值……
答案
-
你好!
首先,=是不能重载的,具体可以参考:
http://msdn.microsoft.com/zh-cn/library/8edha89s%28VS.80%29.aspx
所以你这样做肯定会发生编译错误!抛开语法错误不提,就是可以重载,你的类型也会十分的别扭和难于使用,因为你的=号的含义和通常程序员理解的不同,很可能引起混淆,这也是C#编译器不让你重载这个运算符的原因!
其次,实现ICloneable接口并不是一个好主意,存在类型转换的问题,而且,这个接口一般不推荐使用,因为你一旦使用了这个接口,那你的所有派生类也必须实现这个接口,其所有成员也必须支持这个接口或提供其他复制机制!当继承链很复杂的情况下,这个工作量十分巨大!
最后,你的问题可以通过定义一个普通的函数来解决,不想创建新对象也很容易解决,只要把目标实例传递进来,在函数内部赋值就可以了!
周雪峰- 已建议为答案 用心 2010年6月2日 5:35
- 已标记为答案 KeFang Chen 2010年6月8日 3:16
全部回复
-
你好!
首先,=是不能重载的,具体可以参考:
http://msdn.microsoft.com/zh-cn/library/8edha89s%28VS.80%29.aspx
所以你这样做肯定会发生编译错误!抛开语法错误不提,就是可以重载,你的类型也会十分的别扭和难于使用,因为你的=号的含义和通常程序员理解的不同,很可能引起混淆,这也是C#编译器不让你重载这个运算符的原因!
其次,实现ICloneable接口并不是一个好主意,存在类型转换的问题,而且,这个接口一般不推荐使用,因为你一旦使用了这个接口,那你的所有派生类也必须实现这个接口,其所有成员也必须支持这个接口或提供其他复制机制!当继承链很复杂的情况下,这个工作量十分巨大!
最后,你的问题可以通过定义一个普通的函数来解决,不想创建新对象也很容易解决,只要把目标实例传递进来,在函数内部赋值就可以了!
周雪峰- 已建议为答案 用心 2010年6月2日 5:35
- 已标记为答案 KeFang Chen 2010年6月8日 3:16