小风风~~~这两天我也突然想到了这个问题一直在纠结,正打算发帖呢,以前在传递引用类型的时候,如果在方法中需要修改传递的引用类型的参数我都要加ref。这两天我突然想到既然引用类型传递的是引用那就因该是地址了,那如果是地址的话,在方法中就指向同一个地址喽,为什么会不修改传进去的参数的原始值呢?对于【41楼】解释,我不太理解啊:————“可以把形参 a 和实参 s1 理解成指向同一个对象的指针,修改了 a 的所指,不会影响到 s1。仅此而已”————难道传递进去后形参a和实参s1指向的不是一个地址码?在方法中会另外开辟一个内存地址来存放传进来的s1的值,然后形参a指向这个新的地址??求详细解释。
s2="1111"
object temp=a; //temp=>a
a=b; //a=>b a="2222"
b=temp; //b=>temp=>a b="1111"
{
dt = new DataTable();
}此方法执行后,dt还是原来的dt。不是新对象--------------------------------------另一个:public void Modify(DataTable dt)
{
dt.Rows[0]["dd"] = "dir";
}
此方法执行后,你发现单元格被修改了。
如果s1,s2是引用类型值才会变
引用传递传递进去的是指针
默认的为值传递static void Main(string[] args)
{
string s1 = "111111";
string s2 = "222222";
Swap(ref s1, ref s2);
Console.WriteLine(string.Format("s1:{0},s2:{1}", s1, s2));
Console.Read();
}
public static void Swap(ref string a,ref string b)
{
string temp = a;
a = b; b = temp;
}
这样就会s1="2222"
s2="1111"
其次结果应该是:s1="1111";s2="2222";
为什么捏?
不要将“通过引用传递”概念与“引用类型”概念相混淆。 这两个概念不同。 方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。 通过引用传递值类型时没有值类型装箱。
{
object temp = a;
a = b;
b = temp;
}调用的时候这个样子就行了 string s1 = "1111";
string s2 = "2222"; object o1 = s1;
object o2 = s2; Swap(ref o1, ref o2);
this.textBox1.Text = (string)o1;
this.textBox2.Text = (string)o2;
swap() 交换i=1
j=2
swap(i,j)
i=2
j=1赞同1| 评论
LZ应该看看马士兵讲的java的视频,这个问题类似于C中的值传递。
string s1="2222";很基础的问题 楼主
.net中 string到底值传递 如果你指定 out ref 就是引用传递
string类与其它常见的类有一个很大的区别:string类的值是不变的。
这与类的特性没有关系,而是string类的内部实现造成的。
同意。LZ可以调试一下这个,string a=a+a;注意观察a的各项属性什么的,会有新发现。
string s1="1111";
string s2="2222";在swap方法内部:
string s1="2222";
string s2="1111";
{
object temp=a;
a=b;b=temp;
}
string s1="1111";
string s1="2222";
Swap(s1,s2);
Swap(object a,object b)运行是只是改变了a 和 b的只 s1和s2并没有改变!
{
...
}
var a="111";
a="222"; 这个情况下,a本来指向的"111"这个字符串对象并没有被更改成"222",而是a的引用现在指向了一个新的字符串对象"222"
LZ的这个题目的原因在于 传入的虽然是引用 但是事实上是引用的一份 拷贝, 虽然在方法内部交换了引用 但是对于外部来说 由于你传进去的是自身引用的拷贝 所以实际上没有任何影响
请教,如果形参是传入引用的拷贝,那么为什么 private static void ChangeContent(DataTable dt, int colIndex, int rowIndex)
{
dt.Rows[rowIndex][colIndex] = "Changed";
}
当我调用这个方法的时候,外面的dt中的值也跟着变了呢?真的不理解,请帮忙。
贴过来:static void teststring(string s){s += "A1";}
static void testref(List<string> l) //引用类型{l.Add("hello");}static void Main(string[] args){List<string> l1 = new List<string>();l1.Add("hi");testref(l1);l1.ToList().ForEach(n => Console.Write(n + " "));//hi hellostring str = "A2";teststring(str);Console.WriteLine(str);//A2}
static void teststring(ref string s)
{ s += "A1"; }
static void testref(ref List<string> l) //引用类型
{ l.Add("hello"); } static void Main(string[] args)
{ List<string> l1 = new List<string>(); l1.Add("hi"); testref(ref l1); l1.ToList().ForEach(n => Console.Write(n + " "));//hi hello string str = "A2"; teststring(ref str); Console.WriteLine(str);//A2A1
Console.Read(); }
string str="123";
string str1= str;
str1="234";//这时str等于多少??
普通的引用类型,
public class a
{
public int c;
}
a a1= new a();
a1.c=10;
a a2 = a1;
a2.c =100;//这时 a1.c等于多少?
====================
ps:这是基本的知识
{
object temp=a;
a=b;b=temp;
}
string s1="1111";
string s2="2222";
Swap(s1,s2);
没有对 s1,s2 进行操作
你可以 你可以在 swap里面输出 a b
其实这就是装箱 和 拆箱的问题。
string 是值类型,虽然他被装箱了,但是程序只是在堆里开辟一段内存,用以拷贝string对象。所以封装后的对象和封装前的对象完全指向两个不同内存段,你的Swap语句根本就是在操纵装箱后的对象,这样你Swap以后根本,原来的string对象根本就没有反应!
str1="b";//继续会在托管堆里申请一段空间。原来申请的会引用丢失。gc后直接回收
swap()方法传进来的时候,string 虽然是引用类型,但是MS做了处理,他只是吧string的副本传进来了。即重新申请了2个变量过来的。即方法体力2个东西和外面的两个东西引用地址都不一样的。
所以你这个在怎么变。
object temp=a;
a=b;b=temp;
都是不会改变外面的变量的。除非ref
object s2="2222";