class P
{
public int a = 10;
public void math(object c)
{
c = (int)c +a;
Console.WriteLine(c);
}
static void Main(string[] args)
{
P a1 = new P();
object d = 4;
a1.math(d);
Console.WriteLine(d); }
}
答案14
4这道题目我想问,d不是引用类型的字段么,照理说不用加ref也可以引用传递,可这里d最后还是4,没有变化。请问高手怎么理解?
{
public int a = 10;
public void math(object c)
{
c = (int)c +a;
Console.WriteLine(c);
}
static void Main(string[] args)
{
P a1 = new P();
object d = 4;
a1.math(d);
Console.WriteLine(d); }
}
答案14
4这道题目我想问,d不是引用类型的字段么,照理说不用加ref也可以引用传递,可这里d最后还是4,没有变化。请问高手怎么理解?
{
private int xVal;
private int yVal; public Location( int xCoordinate, int yCoordinate )
{
xVal = xCoordinate;
yVal = yCoordinate;
} public int x
{
get
{
return xVal;
}
set
{
xVal = value;
}
} public int y
{
get
{
return yVal;
}
set
{
yVal = value;
}
} public override string ToString()
{
return ( String.Format( "{0}, {1}", xVal, yVal ) );
} } public class Tester
{
public void myFunc( Location loc )
{
loc.x = 50;
loc.y = 100;
Console.WriteLine( "In MyFunc loc: {0}", loc );
}
static void Main()
{
Location loc1 = new Location( 200, 300 );
Console.WriteLine( "Loc1 location: {0}", loc1 );
Tester t = new Tester();
t.myFunc( loc1 );
Console.WriteLine( "Loc1 location: {0}", loc1 );
}
}
}
答案是200,300
50,100
50,100
那这里locl是class引用类型,为什么它前面不加 ref,直接可以引用传递
public void math(object c)
{
c = (int)c +a;
Console.WriteLine(c);
}
object c 注意這個,傳遞參數的時候,是重新開辟新的空間給c, c = (int)c +a這個結果是要重新開闢新的空間給最後的結果,引用類型定義好后,它的值並不會改變的,比如 string s="a";string s1=s; s=s+"b",
s1還是等於s,s的值並沒有改變
引用 9 楼 vrhero 的回复:
当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值
引用所指向的数据包括引用本身的值...另外可能还有该值的从属数据如该值的属性值...
能说的详细点么?
[/Quote
s1的值当然不会发生变化,始终为"a",而s不是应该变为"ab"了吗?当s=s+"b"的时候,内存新开辟了1个空间给s,此时s为"ab",原来的s则被销毁
当s=s+"b"的时候,内存新开辟了1个空间给s,此时s为"ab",原来的s则被销毁,這里的銷毀好像不是很合適,應該是到s的作用域結束才銷毀或者其他的,s原來的地址空間的內容始終存在的
c = (int)c +a;
拆箱
public void math(object c)
{
c = (int)c +a;
Console.WriteLine(c);
}
object c 注意這個,傳遞參數的時候,是重新開辟新的空間給c,重新new了一個新的對象,并不是在原來實參的空間上進行加的,所以原來的沒有變化,還是指向原來的地址