你自定义类型你不定义+号你能用+来连接吗?既然都叫自定义类型,那么此类型的行为当然也是由你来定义,每次new出新对象还是右值引用全取决于你自己,微软为何要自己做死去帮你定义自定义类型的链接行为

解决方案 »

  1.   

    你的所谓"自定义类型",难道是从string类型继承?
      

  2.   

    比如说我有这样一个自定义类型:    public class Custom
        {
            public int X, Y, Z;
            public Custom(int x, int y, int z)
            {
                X = x;
                Y = y;
                Z = z;
            }
        }
    如果我想对两个具名的Custom实例做加法,即:var custom1 = new Custom(1, 1, 1);
    var custom2 = new Custom(2, 2, 2);
    var sum = custom1 + custom2;
    我不能更改custom1和custom2的内容,所以operator+我是不是得new出新的Custom呢?        public static Custom operator +(Custom lhs, Custom rhs)
            {
                return new Custom(lhs.X + rhs.X, lhs.Y + rhs.Y, lhs.Z + rhs.Z);
            }
    如果我想对两个临时的Custom实例做加法,即:
    var sum = new Custom(1, 1, 1) + new Custom(2, 2, 2);
    那我就没必要new出新的对象了,可以直接修改lhs,即:        public static Custom operator +(Custom lhs, Custom rhs)
            {
                lhs.X += rhs.X;
                lhs.Y += rhs.Y;
                lhs.Z += rhs.Z;
                return lhs;
            }
    但是这两种重载是不能同时出现的呀,会不会存在有时候需要上面的形式,有时候需要下面的形式的情况呢?“右值引用”是不是可以区分两种情况呢?也许我的理解根本就是错误的,恳请高手予以支出
      

  3.   

    已经有StringBuilder了,现在的String已经重载了+这个可以处理字符串相加,只是不是安你说的方式,我认为以后不会修改。
      

  4.   

    理解的不对.
    凭什么new出来的就可以改了,而且你的方法里怎么能判断传入的对象是新new出来的还是旧new出来的,你又怎么判断新new出来的对象后面就不会再用了呢??
      

  5.   


    我new Custom(),而非var custom = new Custom(),没有将对象绑定到引用,在后面应该也没有办法绑定它了吧,那就没人能够用这个new出来的对象了,是不是可以说它是个临时的对象捏?那我修改临时对象应该没啥问题吧。
      

  6.   


    我new Custom(),而非var custom = new Custom(),没有将对象绑定到引用,在后面应该也没有办法绑定它了吧,那就没人能够用这个new出来的对象了,是不是可以说它是个临时的对象捏?那我修改临时对象应该没啥问题吧。
    问题是,你代码里如何检测这个对象有没有赋值给任何变量??
      

  7.   

    var custom1 = new Custom(1, 1, 1);
    var custom2 = new Custom(2, 2, 2);
    var sum = custom1 + custom2;
    完全可以写成
    var custom1 ;
    var custom2 ;
    var sum = (custom1=new Custom(1, 1, 1)) + (custom2= new Custom(2, 2, 2);
    这不就后面也可以用了么
      

  8.   

    可以给Custom加上Plus方法来实现你的需求。
     public void Plus(Custom rhs)
            {
                this.X += rhs.X;
                this.Y += rhs.Y;
                this.Z += rhs.Z;
            }
      

  9.   


    其实我在1楼问的就是C#有没有办法检测这个对象没有赋值给任何变量=。=根据您的回答看来C#似乎并没有这个机制C++区分左值右值,这种没有赋值给任何变量的对象应该就是对应于“右值”,C++里面的“右值引用”可以实现这种区分。我在同时学习C++和C#,有时候会脑洞大开,感觉智商余额已不足,所以可能会问一些很混乱的问题=。=
      

  10.   


    我理解的,其实就是两种方式:加法和累加:
    1. Custom  c=Custom  a+ Custom  b;
    这时候a和b是不会被修改的,但是要new一个c。
    2.Custom  a +=  Custom  b;
    这是后a存储执行加法后的结果。不需要new 一个临时变量c。
    ----------------------
    如果我想对两个临时的Custom实例做加法,即:
    var sum = new Custom(1, 1, 1) + new Custom(2, 2, 2);
    那我就没必要new出新的对象了,可以直接修改lhs,即:        public static Custom operator +=(Custom lhs, Custom rhs)
            {
                lhs.X += rhs.X;
                lhs.Y += rhs.Y;
                lhs.Z += rhs.Z;
                return lhs;
            }
    下面重载加法运算符的方法是错误的,它违反了加法的交换律:        public static Custom operator +(Custom lhs, Custom rhs)
            {
                lhs.X += rhs.X;
                lhs.Y += rhs.Y;
                lhs.Z += rhs.Z;
                return lhs;
            }c++ 11中引入的右值引用,是通过转移构造器(就是复制内部数据结构的指针,重向一个内存地址)实现的。c++中定义变量都有初始化内存空间。
    c++中的右值引用:有了右值引用,一个参数为指向某个vector的右值引用的std::vector的转移构造器就能够简单地将该右值中C式数组的指针复制到新的vector,然后将该右值清空。这里没有数组拷贝,并且销毁被清空的右值也不会销毁保存数据的内存
    c#中变量对象是托管的,内存(受.NET的CLR运行时管理)管理机制是否可以做到上面所描述的“指针复制和保留指针所指向的数据”?
    我们知道,C#是移除了指针的,因为这与内存托管相冲突。如果要使用指针,必须使用不安全代码,用unsafe定义,直接操作内存。这样或许就可以类似c++ 11那样实现右值引用。
      

  11.   

    如果你对c++的vector内部构造和实现非常熟悉,相信看了就非常明白了。