C#中參數(shù)的傳遞方式詳解
值類型參數(shù)按值傳遞
class Program
{
static void Main(string[] args)
{
int a = 10;
Add(a);
Console.WriteLine("傳遞之后的值為:" + a);
Console.ReadKey();
}
private static void Add(int i)
{
Console.WriteLine("傳遞之前的值為:" + i);
i = i + 10;
}
}結(jié)果:
可見,值類型參數(shù)在被方法調(diào)用的時候,是對本身實例的拷貝和操作,在方法調(diào)用前后參數(shù)值不變。
引用類型參數(shù)按值傳遞
當(dāng)引用類型參數(shù)傳遞時,是對托管堆上對象實例內(nèi)容的操作。
也就是引用類型按值傳遞,傳遞的是引用變量的指針,指向托管堆上的對象實例。
class Program
{
static void Main(string[] args)
{
Student student = new Student();
Add(student);
Console.WriteLine("參數(shù)傳遞之后的值為:" +student._score);
Console.ReadKey();
}
private static void Add(Student s)
{
Console.WriteLine("參數(shù)傳遞之前的值為:" + s._score);
s._score = 90;
}
}
public class Student
{
public int _score = 80;
}結(jié)果
可見,引用類型參數(shù)在被方法調(diào)用的時候,是針對變量的引用的操作,一旦引用對象內(nèi)容發(fā)生改變,原來變量的值也隨著改變。
按引用傳遞 ref和out
引用類型參數(shù)按值傳遞和按引用傳遞的不同之處:
- 按值傳遞,傳遞的是參數(shù)本身的值,即引用指針。
- 按引用傳遞,傳遞的是參數(shù)的地址,也就是實例指針。
另外,值類型也有按引用傳遞,這時候,傳遞的是值類型的地址。
class Program
{
static void Main(string[] args)
{
int i = 100;
string str = "one";
ChangeByValue(ref i);
ChangeByRef(ref str);
Console.WriteLine(i);
Console.WriteLine(str);
Console.ReadKey();
}
private static void ChangeByValue(ref int iValue)
{
iValue = 200;
}
private static void ChangeByRef(ref string sValue)
{
sValue = "One more";
}
}可見,不管是值類型,還是引用類型,加入關(guān)鍵字ref作為參數(shù),就意味著是對參數(shù)地址的操作,即托管堆上實例地址的改變。
另外:
- 如果需要按引用傳遞,方法的定義和方法的調(diào)用,都要顯式地使用ref和out。
- 如果一個方法的參數(shù)除了ref和out關(guān)鍵字不同,還有其他參數(shù)不同,這才構(gòu)成方法的2個重載。如果僅僅ref和out關(guān)鍵字不同,會報錯"...不能僅在ref和out上有差別的重載方法"。
ref和out使用時的不同點:
out告訴編譯器,參數(shù)會在方法內(nèi)部初始化,而在方法之前不需要初始化。
int x; Foo(out x);
ref告訴編譯器,參數(shù)在方法之前必須初始化。
int y = 0; Foo(ref y);
特殊引用類型string的傳遞
class Program
{
static void Main(string[] args)
{
string str = "Old String";
Console.WriteLine("傳遞之前的值為:" + str);
ChangeStr(str);
Console.WriteLine("傳遞之后的值為:"+str);
Console.ReadKey();
}
private static void ChangeStr(string astr)
{
astr = "Change String";
}
}結(jié)果:
可見,雖然string是引用類型,但按值傳遞的表現(xiàn)和值類型按值傳遞的表現(xiàn)一樣。
總結(jié)
- 引用類型按值傳遞,改變的是引用變量指向的托管堆上對象實例的內(nèi)容。
- 引用類型按引用傳遞,改變的是引用變量指向的托管堆上對象實例的地址。
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法
這篇文章主要介紹了C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法,較為詳細的分析了DeflateStream方法對文件進行壓縮及解壓縮的步驟與技巧,需要的朋友可以參考下2015-04-04






