如下代码中,newStr是对oldStr的引用还是一个获得赋值的新字符串变量?
string oldStr = "aaaaa";
string newStr = GetHtmlArea(ref oldStr)
public string GetHtmlArea(ref string htmlCont){
return htmlCont;
}
另外,在vs.net中,我用什么方法来判断两个变量是否指向同一个位置,也就是说,是否含有引用关系。还请哪位大侠帮忙解答下。先谢了。
------解决思路----------------------
1、可以查看IL,确定两个字符串的内存地址
2、通过GCHandle获取字符串地址
string getMemory(object o)
{
GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
return "0x" + addr.ToString("X");
}
3、就你上面的代码,oldStr和newStr相同的地址空间
------解决思路----------------------
传值和传引用,只是对于方法参数而言的,对方法返回值不存在这个说法。
当然你可以问一个对象是在什么堆上、还是栈上之类的,但是这跟“传值、传引用”无关。
注意.net的传引用跟c的引用传递完全是两个概念,不要张冠李戴。只要先注意这个原则,那么就容易识别一些诈误的说法。所谓传引用,是指在传值的基础上再把返回值重新赋值给输入变量。从这角度,方法函数返回值有点像是传引用。但是它根本没有输入,只有输出,所以实际上也谈不上什么传引用。
如果要问问“非要计较这个概念的目的是什么呢?”,你会怎样回答?
------解决思路----------------------
首先这跟“传引用无关”,这是方法返回而不是方法参数输入。
引用类型的方法返回,自然是返回着一个引用类型对象实例。但是在你考虑这类问题同时,先要明白一个.net的基本String机制。在.net中对String类型的赋值操作做了重载,因此虽然String是引用类型的,但是它内部不允许修改其值,如果要修改则会拷贝一个副本然后再副本上修改。因此String 虽然是引用类型,但是其对象的运算则是类似于值类型的。
------解决思路----------------------
返回对象、数组、string是引用
返回结构体、简单类型、枚举是值。