none
请教一个关于等号重载的问题 RRS feed

  • 问题

  • 对=重载,想达成这样一种效果:等号左面的对象的值全部从右方复制而来。
    目前做的重载,只是返回一个新生成的对象,我不想开那么多内存……
    现在的代码是

       public static implicit operator MyClass(Class c)
       {
        return new MyClass(c);
       }

    这样每次都会新生成一个对象,当频繁调用时内存问题很严重。我想当

    MyClass c;

    c = new Class();时,如何使c的值对应到new Class()里的值而不是新生成一个MyClass ……

    另外,MyClass是有很多实例同时使用的,不可以用静态对象为其赋值……
    2010年6月2日 1:37

答案

  • 你好!

        首先,=是不能重载的,具体可以参考:

    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
    2010年6月2日 5:29
    版主

全部回复

  • 貌似你的问题不是在于等号,而是在于 new。

    你都 new 了。。。能不创建一个实例么。

     

    而且不是很明白你的需求,既要向要把左面的对象的值全部从右方复制过来,并且还不能生成新的对象。那么复制后的值放到什么地方去呢,是不是仅是替换掉左边的值?

    如果是那样,不如直接赋值就可以了

     

    MyClass c;

    MyClass a;

     

    c = a;

     

    应该这种效果不是你想要的吧。。。但是若不生成新的对象, a 的值应该复制到什么地方去。。。

    2010年6月2日 1:55
  • 我的需求是这样的:

    MyClass c = new Class(1);

    //=======================

    c = new Class(2);

    相当于:

    MyClass c = new MyClass();

    c.Fields = (new Class(1)).Fields;

    //=======================

    c.Fields = (new Class(2)).Fields;

    2010年6月2日 2:21
  • 请参阅 设计模式-原型模式

     MyClass在定义的时候继承于接口 Icloneable

    实现Clone方法

    public Object Clone(){
    
    return (Object)this.MemberwiseClone();
    }

     

     

     

    private Myclass myclass;
    public MyClass(MyClass mclass){
    
    myclass=(MyClass)mclass.clone();
    
    }
    2010年6月2日 3:04
  • 克隆的话是不行的,因为两个对象的类型是不同的。上例的结构应该是

    private Myclass myclass;
    public MyClass(Class mclass){
    
    myclass=(MyClass)mclass.clone();
    
    }
    
    但是很明显,强制类型转换总是static的……根本作用不到实例。
    2010年6月2日 3:13
  • 你好!

        首先,=是不能重载的,具体可以参考:

    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
    2010年6月2日 5:29
    版主
  • 就是因为普通函数写起来很麻烦才想着重载=号的……
    2010年6月2日 6:21