C#中變量之間的傳遞默認是值傳遞,什麼叫值傳遞呢?就是說,當一個方法需要我事先定義的變量作爲參數的時候,默認只是把變量的值傳遞過去了。
例如:
namespace ConsoleApplication1
{
class Program
{
static void A(int x)
{
Console.WriteLine(x);
x++;
Console.WriteLine(x);
}
static void Main(string[] args)
{
int x=0;
A(x);
Console.WriteLine(x);
Console.ReadKey();
}
}
}
A方法需要Main()方法中的變量x作爲參數,此時知識把“0”傳遞給了方法A,A裏面做了x++的運算,但是不影響Main()方法裏面x的值,折舊相當於A方法中定義了另一個變量y用來承接x,A裏面操作的是y,而不是x,因爲A裏面定義了一個int x,這兩個x是不一樣的,因爲它們指向不同的地址。
那麼我們希望Main()和A()都指向同一個地址的x怎麼辦呢?
那就不用值傳遞,用引用傳遞吧,把一個值作爲一個引用傳遞過去。
ref和out就是專門幹這種勾當的!
它們的區別是:用ref的時候要確保值已經被賦值了,而有的時候事先賦值沒有意義,那就用out;
namespace ConsoleApplication1
{
class Program
{
static void A(ref int x) //區別在這裏
{
Console.WriteLine(x);
x++;
Console.WriteLine(x);
}
static void Main(string[] args)
{
int x=0;
A(ref x); //區別在這裏
Console.WriteLine(x);
Console.ReadKey();
}
}
}
最後輸出:
注意,上面的代碼中,int x=0;不給它賦值的話就會報錯:
不賦值怎麼辦呢?那就用out唄:
namespace ConsoleApplication1
{
class Program
{
static void A(out int x)
{
x = 2; //這裏再給它賦值
Console.WriteLine(x);
x++;
Console.WriteLine(x);
}
static void Main(string[] args)
{
int x;
A(out x);
Console.WriteLine(x);
Console.ReadKey();
}
}
}
運行結果:
事實證明:ref和out都可以把變量從值傳遞變換爲引用傳遞。