ref 和out的区别就不说了,网上一搜,说的都是这个。
我现在想说一点:很多人都说ref对引用类型是没有意义的。我觉得这句话完全是凭自己的想象说出来的,都不去翻翻书。
MSDN原文是这么说的 “按引用传递值类型(如上所示)是有用的,但是ref对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。下面的示例显示出当引用类型作为ref参数传递时,可以更改对象本身。”
而他举了个字符串的例子,个人觉得这个例子并不好,因为字符串本身是一个比较特殊的引用类型,例子如下:
class RefRefExample{ static void Method(ref string s) { s = "changed"; } static void Main() { string str = "original"; Method(ref str); // str is now "changed" }}我也地ref的这一特征做了一个小测试,代码如下
PRotected void Page_Load(object sender, EventArgs e) { myclass myc = new myclass(); myc.Id = 1; myc.Name = "shit"; Response.Write(myc.Id + "<br>" + myc.Name + "<br>"); //没有ref 原变量myc的引用对象不会改变 ModifyMyclass(myc); Response.Write(myc.Id + "<br>" + myc.Name + "<br>"); //有ref 原变量myc的引用对象改变了,引用了新对象 ModifyMyclass(ref myc); Response.Write(myc.Id + "<br>" + myc.Name + "<br>"); } private void ModifyMyclass( myclass myc) { myc = new myclass(); myc.Id = 23; myc.Name = "new myclass"; } private void ModifyMyclass(ref myclass myc) { myc = new myclass(); myc.Id = 23; myc.Name = "ref new myclass"; }
故意写了一个myclass类作为参数传递
public class myclass{ private int id; public int Id { get { return id; } set { id = value; } } private string name; public string Name { get { return name; } set { name = value; } }}
打印结果:
1shit1shit23ref new myclass
很显然,ref对引用类型是有意义的。意义就在于变量本身能不能被改变。没有ref的时候,变量本身是不会被改变的。只能改变变量引用的那个对象。而有了ref,变量本身是可以改变的,当然变量引用的对象更是可以改变了。
所以,由此我也来想象一把:ref 标记的参数传递过程中,没有在栈中声明新的变量,而传递的就是栈原来的变量本身。不知道这样理解是否正确,还忘高手门深入剖析!
新闻热点
疑难解答