C#中參數(shù)的傳遞方式詳解
值類(lèi)型參數(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é)果:
可見(jiàn),值類(lèi)型參數(shù)在被方法調(diào)用的時(shí)候,是對(duì)本身實(shí)例的拷貝和操作,在方法調(diào)用前后參數(shù)值不變。
引用類(lèi)型參數(shù)按值傳遞
當(dāng)引用類(lèi)型參數(shù)傳遞時(shí),是對(duì)托管堆上對(duì)象實(shí)例內(nèi)容的操作。
也就是引用類(lèi)型按值傳遞,傳遞的是引用變量的指針,指向托管堆上的對(duì)象實(shí)例。
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é)果
可見(jiàn),引用類(lèi)型參數(shù)在被方法調(diào)用的時(shí)候,是針對(duì)變量的引用的操作,一旦引用對(duì)象內(nèi)容發(fā)生改變,原來(lái)變量的值也隨著改變。
按引用傳遞 ref和out
引用類(lèi)型參數(shù)按值傳遞和按引用傳遞的不同之處:
- 按值傳遞,傳遞的是參數(shù)本身的值,即引用指針。
- 按引用傳遞,傳遞的是參數(shù)的地址,也就是實(shí)例指針。
另外,值類(lèi)型也有按引用傳遞,這時(shí)候,傳遞的是值類(lèi)型的地址。
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";
}
}可見(jiàn),不管是值類(lèi)型,還是引用類(lèi)型,加入關(guān)鍵字ref作為參數(shù),就意味著是對(duì)參數(shù)地址的操作,即托管堆上實(shí)例地址的改變。
另外:
- 如果需要按引用傳遞,方法的定義和方法的調(diào)用,都要顯式地使用ref和out。
- 如果一個(gè)方法的參數(shù)除了ref和out關(guān)鍵字不同,還有其他參數(shù)不同,這才構(gòu)成方法的2個(gè)重載。如果僅僅ref和out關(guān)鍵字不同,會(huì)報(bào)錯(cuò)"...不能僅在ref和out上有差別的重載方法"。
ref和out使用時(shí)的不同點(diǎn):
out告訴編譯器,參數(shù)會(huì)在方法內(nèi)部初始化,而在方法之前不需要初始化。
int x; Foo(out x);
ref告訴編譯器,參數(shù)在方法之前必須初始化。
int y = 0; Foo(ref y);
特殊引用類(lèi)型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é)果:
可見(jiàn),雖然string是引用類(lèi)型,但按值傳遞的表現(xiàn)和值類(lèi)型按值傳遞的表現(xiàn)一樣。
總結(jié)
- 引用類(lèi)型按值傳遞,改變的是引用變量指向的托管堆上對(duì)象實(shí)例的內(nèi)容。
- 引用類(lèi)型按引用傳遞,改變的是引用變量指向的托管堆上對(duì)象實(shí)例的地址。
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- C#使用Post調(diào)用接口并傳遞json參數(shù)
- C#往線(xiàn)程里傳遞參數(shù)的方法小結(jié)
- C#多線(xiàn)程傳遞參數(shù)及任務(wù)用法示例
- C#中的數(shù)組作為參數(shù)傳遞所引發(fā)的問(wèn)題
- 一道關(guān)于C#參數(shù)傳遞的面試題分析
- C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法
- C#傳遞參數(shù)到線(xiàn)程的方法匯總
- C#中的多線(xiàn)程多參數(shù)傳遞詳解
- c#線(xiàn)程間傳遞參數(shù)詳解
- asp.net(C#)函數(shù)對(duì)象參數(shù)傳遞的問(wèn)題
- C# 使用匿名函數(shù)解決EventHandler參數(shù)傳遞的難題
相關(guān)文章
C#反射實(shí)現(xiàn)插件式開(kāi)發(fā)的過(guò)程詳解
插件式架構(gòu),一種全新的、開(kāi)放性的、高擴(kuò)展性的架構(gòu)體系,插件式架構(gòu)設(shè)計(jì)好處很多,把擴(kuò)展功能從框架中剝離出來(lái),降低了框架的復(fù)雜度,讓框架更容易實(shí)現(xiàn),這篇文章主要介紹了C#反射實(shí)現(xiàn)插件式開(kāi)發(fā),需要的朋友可以參考下2023-09-09
關(guān)于c#二叉樹(shù)的實(shí)現(xiàn)
本篇文章小編為大家介紹,關(guān)于c#二叉樹(shù)的實(shí)現(xiàn)。需要的朋友參考下2013-04-04
Unity?Shader編輯器工具類(lèi)ShaderUtil?常用函數(shù)和用法實(shí)例詳解
Unity的Shader編輯器工具類(lèi)ShaderUtil提供了一系列函數(shù),用于編譯、導(dǎo)入和管理著色器,這篇文章主要介紹了Unity?Shader編輯器工具類(lèi)ShaderUtil?常用函數(shù)和用法,需要的朋友可以參考下2023-08-08
Unity3d實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)背景
這篇文章主要為大家詳細(xì)介紹了Unity3d實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)背景,一個(gè)完整的商店廣告牌組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C# httpwebrequest訪(fǎng)問(wèn)HTTPS錯(cuò)誤處理方法
下面小編就為大家?guī)?lái)一篇C# httpwebrequest訪(fǎng)問(wèn)HTTPS錯(cuò)誤處理方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
使用C#與設(shè)備接口進(jìn)行無(wú)縫通信的實(shí)現(xiàn)技巧
隨著物聯(lián)網(wǎng)、智能設(shè)備和自動(dòng)化技術(shù)的快速發(fā)展,越來(lái)越多的設(shè)備需要與計(jì)算機(jī)系統(tǒng)進(jìn)行實(shí)時(shí)通信,而C#作為一門(mén)強(qiáng)大的編程語(yǔ)言,憑借其廣泛的庫(kù)支持和高效的開(kāi)發(fā)效率,已成為與設(shè)備接口對(duì)接的理想選擇,在本篇文章中,我們將探討如何使用C#與設(shè)備進(jìn)行無(wú)縫通信2025-01-01
C#實(shí)現(xiàn)托盤(pán)程序并禁止多個(gè)應(yīng)用實(shí)例運(yùn)行的方法
這篇文章主要介紹了C#實(shí)現(xiàn)托盤(pán)程序并禁止多個(gè)應(yīng)用實(shí)例運(yùn)行的方法,涉及C#中NotifyIcon控件的使用及設(shè)置標(biāo)志位控制程序只運(yùn)行一個(gè)的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11






