ref 的贞操
作者:互联网
原文链接:http://www.cnblogs.com/XChWaad/p/ref%e5%80%bc%e5%be%97%e6%b7%b1%e5%85%a5%e7%9a%84%e7%bb%86%e8%8a%82.html
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; } }
}
打印结果:
1
shit
1
shit
23
ref new myclass
很显然,ref对引用类型是有意义的。意义就在于变量本身能不能被改变。没有ref的时候,变量本身是不会被改变的。只能改变变量引用的那个对象。而有了ref,变量本身是可以改变的,当然变量引用的对象更是可以改变了。
所以,由此我也来想象一把:ref 标记的参数传递过程中,没有在栈中声明新的变量,而传递的就是栈原来的变量本身。不知道这样理解是否正确,还忘高手门深入剖析!
转载于:https://www.cnblogs.com/XChWaad/p/ref%e5%80%bc%e5%be%97%e6%b7%b1%e5%85%a5%e7%9a%84%e7%bb%86%e8%8a%82.html
标签:Name,贞操,myclass,myc,ref,Id,引用 来源: https://blog.csdn.net/weixin_30765475/article/details/97515426