关于ref,比如,定义了一个结构:
struct Point
{
public int x;
public int y;
}C++可以这样调用:
void Fun(const Point &point)
{}但C#只能这样:
void Fun(ref Point point)
{}
C#不能保证point不被修改如果是小结构,复制一份,传值调用当然没问题,但如果是大的结构,而且是频繁调用呢,用结构就为了栈上分配,提高性能,结构有什么办法可以传引用又不被修改呢?
struct Point
{
public int x;
public int y;
}C++可以这样调用:
void Fun(const Point &point)
{}但C#只能这样:
void Fun(ref Point point)
{}
C#不能保证point不被修改如果是小结构,复制一份,传值调用当然没问题,但如果是大的结构,而且是频繁调用呢,用结构就为了栈上分配,提高性能,结构有什么办法可以传引用又不被修改呢?
解决方案 »
- c#调用存储过程时,SqlDbType.Decimal 类型的参数,如何指定小数的精度呢?
- 我这样还适合做程序员吗?求助大家给点意见~!
- datalist与checkbox判断问题
- DataGridViewButtonColumn对象设置问题
- 请问一个关于文本解析成程序的问题
- 请教一下backgroundWorker控件的问题
- TextBox里面的多行文本怎么入库?
- 用C#怎么实现exlel单元格自动换行?
- 谁可以把这段代码改成c#的,谢谢了。小弟拜谢了。
- C#可实现语音录入功能吗?
- socketf发送结构体,结构体中的string转换为byte[]出现问题
- C# 在使用serialport实现串口通信遇到的问题
因为lz很有闲功夫纠缠他根本“测不出来的”的所谓“性能问题”。csdn也没有这个闲心啊!
SomeStruct foo()
{
SomeStruct x;
x.somevalue = 1;
return x;
}这个代码在C++里面居然是不行的。这说明C#也有C++做不了的嘛,嘿嘿。
不能这么说,有时缺陷就是为了完美,要知道传一个地址跟传一份拷贝差别有多大吗?托管堆费了多少个ticks,可能,将来怎么优化也就是找不回那些ticks呢C#学起来看似容易,但没有真正理解C++,将来用C#可能也会成为一个代码工人,呵呵
不要用“既然”这样的假设。否则“既然C++有这样的特性,你干嘛用C#呢”。还有,C++性能是不如C#的。
另外除非必要,完全可以用class替代,因为class就是传递的引用地址,在列表中添加删除对象的时候,只会添加删除对象的引用,但是你用struct,不管是添加还是删除都是对象的拷贝,而且列表(或数组)本事无法使用ref关键字来操作内部的元素。
void Fun(const Point &point)
{}
在C#里面的等效定义:
class Point
{
public int x;
public int y;
}
void Fun(Point point)
{}
将struct变为class后,直接传递对象就是传递的对象的地址,因此和C++的地址传递完全相同,而C++限制了该地址为只读,而C#默认该地址也是改变无效的(虽然可以改变,但是不影响原来的那个变量,就好比帮你新建一个变量,方便你对其修改而不需要自己新建变量了),如果C#里面多了个ref关键字的话,那么就等效于C++的无const修饰的函数了。
#include <iostream>using namespace std;struct A
{
int x;
};void foo(const A &a)
{
int * p = (int *)&a;
*p = 8;
}int main(int argc, char** args)
{
A a;
a.x = 3;
foo(a);
cout << a.x << endl;
}输出结果
8http://codepad.org/7Cs0AthX
(由于)结构是:值类型
,当你向某个方法传递一个结构的时候
,方法接收并复制结构.(这个)方法无法访问,也不可能有任何途径修改调用层的结构原件