你自定义类型你不定义+号你能用+来连接吗?既然都叫自定义类型,那么此类型的行为当然也是由你来定义,每次new出新对象还是右值引用全取决于你自己,微软为何要自己做死去帮你定义自定义类型的链接行为
解决方案 »
- 文件重命名问题
- c#串口通讯类serialport的read事件的触发机制疑问?
- 300分求密码输入问题,分不够另外开贴补
- 如何正确使用HttpWebRequest和HttpWebResponse
- 问个正则表达式
- 求 C#2005 ASP 连接SQL数据库的 例子! (在线)
- 在listbox为空的情况下,ListBox.Items.Insert(9,“uuuu”) 将项插入列表框的指定索引处。报错:超出index 范围。。如何解决?
- 这是什么语法
- 各位好,我有一些关于DATAGRID的问题想请教一下
- 请教:.net程序发布
- winform窗体间传值问题
- C# form的滚动条如何通过timer控制
{
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;
}
但是这两种重载是不能同时出现的呀,会不会存在有时候需要上面的形式,有时候需要下面的形式的情况呢?“右值引用”是不是可以区分两种情况呢?也许我的理解根本就是错误的,恳请高手予以支出
凭什么new出来的就可以改了,而且你的方法里怎么能判断传入的对象是新new出来的还是旧new出来的,你又怎么判断新new出来的对象后面就不会再用了呢??
我new Custom(),而非var custom = new Custom(),没有将对象绑定到引用,在后面应该也没有办法绑定它了吧,那就没人能够用这个new出来的对象了,是不是可以说它是个临时的对象捏?那我修改临时对象应该没啥问题吧。
我new Custom(),而非var custom = new Custom(),没有将对象绑定到引用,在后面应该也没有办法绑定它了吧,那就没人能够用这个new出来的对象了,是不是可以说它是个临时的对象捏?那我修改临时对象应该没啥问题吧。
问题是,你代码里如何检测这个对象有没有赋值给任何变量??
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);
这不就后面也可以用了么
public void Plus(Custom rhs)
{
this.X += rhs.X;
this.Y += rhs.Y;
this.Z += rhs.Z;
}
其实我在1楼问的就是C#有没有办法检测这个对象没有赋值给任何变量=。=根据您的回答看来C#似乎并没有这个机制C++区分左值右值,这种没有赋值给任何变量的对象应该就是对应于“右值”,C++里面的“右值引用”可以实现这种区分。我在同时学习C++和C#,有时候会脑洞大开,感觉智商余额已不足,所以可能会问一些很混乱的问题=。=
我理解的,其实就是两种方式:加法和累加:
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那样实现右值引用。