关于ref,比如,定义了一个结构:
struct Point
{
public int x;
public int y;
}C++可以这样调用:
void Fun(const Point &point)
{}但C#只能这样:
void Fun(ref Point point)
{}
C#不能保证point不被修改如果是小结构,复制一份,传值调用当然没问题,但如果是大的结构,而且是频繁调用呢,用结构就为了栈上分配,提高性能,结构有什么办法可以传引用又不被修改呢?

解决方案 »

  1.   

    ref 是有进又出既然你得Point 的x,y 是 public 那么肯定是可以修改的.不加ref 不就可以保证Point不被修改吗?
      

  2.   


    因为lz很有闲功夫纠缠他根本“测不出来的”的所谓“性能问题”。csdn也没有这个闲心啊!
      

  3.   

    C#并非完全和C++等价。不必纠结这样的问题了。看这样的代码:
    SomeStruct foo()
    {
        SomeStruct x;
        x.somevalue = 1;
        return x;
    }这个代码在C++里面居然是不行的。这说明C#也有C++做不了的嘛,嘿嘿。
      

  4.   

    C语言语法缺陷很多,比如strcpy函数,传入字符数组,它都不能知道字符数组的长度。
      

  5.   


    不能这么说,有时缺陷就是为了完美,要知道传一个地址跟传一份拷贝差别有多大吗?托管堆费了多少个ticks,可能,将来怎么优化也就是找不回那些ticks呢C#学起来看似容易,但没有真正理解C++,将来用C#可能也会成为一个代码工人,呵呵
      

  6.   


    不要用“既然”这样的假设。否则“既然C++有这样的特性,你干嘛用C#呢”。还有,C++性能是不如C#的。
      

  7.   

    抛开语言比较不谈,如果你要按地址传递又不想被修改,最佳的做法是将字段设置为私有,公开只读属性访问这个私有字段。
    另外除非必要,完全可以用class替代,因为class就是传递的引用地址,在列表中添加删除对象的时候,只会添加删除对象的引用,但是你用struct,不管是添加还是删除都是对象的拷贝,而且列表(或数组)本事无法使用ref关键字来操作内部的元素。
      

  8.   

    楼上一个错别字纠正下:“而且列表本身”现在谈谈你的C++
    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修饰的函数了。
      

  9.   

    首先你C++就没搞清楚,const说到底,只是编译器的一种限制,但是不代表说,这个结构体是不可改的。没有任何runtime的机制限制这一点,看如下代码:
    #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
      

  10.   

    Because a struct is a value type, when you pass a struct by value to a method, the method receives and operates on a copy of the struct argument. The method has no access to the original struct in the calling method and therefore can't change it in any way. The method can change only the copy. 
    (由于)结构是:值类型
    ,当你向某个方法传递一个结构的时候
    ,方法接收并复制结构.(这个)方法无法访问,也不可能有任何途径修改调用层的结构原件