而且在语言的本质上我认为也不允许 定义非const成员 在之后修改为const属性.这在语言层上就不可能办到.可能C++实现诸如 Fun(const &A a) 的功能也是基于 对象拷贝传递,然后在语法上作了限制,如果你非要对a进行修改,那么编译器预判断会让你编译失败以此达到你的目的. 但实际上 那个[预判断]是强加的.
void Fun(A a) {} 不改变外部变量的值void Fun(ref A a) {} 按引用传递,才改变外部变量
void Fun(A a) {} 不改变外部变量的值void Fun(ref A a) {} 按引用传递,才改变外部变量这个方法还是不行的,由于本身a就是引用类型,所以在函数Fun(a){}中若修改了a的值,在函数外部也会更改的。如果采用克隆的办法,也可以达到目的,但是若要大量调用函数Fun,假设上几十万次或者百万次,若a数据结构较为复杂情况下,开销会很大。而且最主要目的是防止在函数Fun(){}中无意修改了a的值,但是在函数外部是可以更改的。
{}就算传了A对象为参数,在方法中,对象A内部的属性是可以改变的,但引用对象本身无法改变。如果LS要完全不改变A对象的一切,可以在方法中只使用即可。如果LS要完全改变A对象可以加ref A a
哎...---------------------
LZ说的功能我不知道C#是否提供. 不过我有个变通的方法: 你把a克隆一份出来传递过去即可. 别人改也改的是克隆体,对你关心的a没有影响.
{}
不改变外部变量的值void Fun(ref A a)
{}
按引用传递,才改变外部变量
{}
不改变外部变量的值void Fun(ref A a)
{}
按引用传递,才改变外部变量这个方法还是不行的,由于本身a就是引用类型,所以在函数Fun(a){}中若修改了a的值,在函数外部也会更改的。如果采用克隆的办法,也可以达到目的,但是若要大量调用函数Fun,假设上几十万次或者百万次,若a数据结构较为复杂情况下,开销会很大。而且最主要目的是防止在函数Fun(){}中无意修改了a的值,但是在函数外部是可以更改的。