C#函數(shù)參數(shù)修飾符out和in的用法詳解
前言
嗨,大家好!
前兩天有小伙伴問:“在 C# 里函數(shù)傳遞參數(shù)時(shí)加上 out 和 in 到底有什么用?”
這確實(shí)是個(gè)值得探討的好問題!
在 C# 中,out 和 in 是兩種非常有用的參數(shù)修飾符,它們各自有著獨(dú)特的用途和優(yōu)勢,能夠極大地提升我們的編程體驗(yàn)。
或許很多人對這兩個(gè)修飾符的作用還不太了解,今天就讓我們一起來揭開它們神秘的面紗吧!
話不多說,直接進(jìn)入正題!
out 參數(shù)修飾符
核心作用
out 參數(shù)的主要作用是突破 return 只能返回單一值的限制,使得函數(shù)可以返回多個(gè)結(jié)果。
如果你需要一個(gè)函數(shù)同時(shí)返回兩個(gè)或更多的值,out 參數(shù)就是你的最佳選擇之一。
比如下面這個(gè)例子,它同時(shí)返回了兩個(gè)值:
private int OutTest(int a, out int b)
{
b = a; // 必須對 out 參數(shù)賦值
a -= 100; // 修改 a 的值
return a; // 返回 a 的新值
}
public void Main()
{
int a = 2;
int b; // 聲明 out 參數(shù)
int c = OutTest(a, out b); // 調(diào)用方法并傳遞 out 參數(shù)
Console.WriteLine($"c 值 = {c}"); // 輸出 c 的值
Console.WriteLine($"b 值 = "); // 輸出 b 的值
}
運(yùn)行結(jié)果如下:

使用規(guī)則
out 參數(shù)的使用很簡單,主要是以下 2 條:
out參數(shù)的設(shè)計(jì)意圖是由被調(diào)用方法賦值,所以調(diào)用方傳遞的變量無需預(yù)先賦值,比如上例。- 調(diào)用時(shí)需顯式使用
out關(guān)鍵字,例如上例中的OutTest(a, out b)
應(yīng)用場景
out 參數(shù)通常應(yīng)用在下面這 2 個(gè)場景:
- 解析操作,比如C#的內(nèi)置方法
int.TryParse(string, out int result) - 需要返回多個(gè)計(jì)算結(jié)果的方法,比如坐標(biāo)轉(zhuǎn)換、狀態(tài)碼+結(jié)果分離等
in 參數(shù)修飾符
核心作用
in 的作用是傳遞一個(gè)只讀的參數(shù)給方法,這意味著方法只能使用這個(gè)參數(shù),而不能改變它的值。
這在處理大型結(jié)構(gòu)體時(shí)非常有用,可以避免不必要的數(shù)據(jù)復(fù)制,從而提高性能。
如果你試圖修改 in 參數(shù)的值,就會(huì)引發(fā)如下的錯(cuò)誤:

但是,有一個(gè)特殊情況是,如果參數(shù)是一個(gè)類型,雖然你不能重新賦值這個(gè)參數(shù),但可以改變參數(shù)的成員的數(shù)據(jù),比如:
public class Point
{
public int x;
public int y;
}
private void InTest(in Point point)
{
Point point2 = new Point();
// point = point2; // 這行代碼會(huì)導(dǎo)致編譯錯(cuò)誤
point.x = 10; // 這是允許的
}
使用規(guī)則
使用 in 參數(shù)的規(guī)則也很簡單:
- 方法不能對
in參數(shù)重新賦值。 - 調(diào)用時(shí)可以顯式使用
in關(guān)鍵字,也可以省略。
應(yīng)用場景
in 參數(shù)主要用于下成這 2 個(gè)場景:
- 需要確保方法不會(huì)意外修改輸入?yún)?shù)時(shí),比如數(shù)學(xué)庫中的計(jì)算函數(shù)
- 在確定無需改變輸入?yún)?shù)的情況下,使用
in修飾符以改善性能,例如傳遞3D圖形計(jì)算中的矩陣或向量
總結(jié)
總的來說,在 C# 中合理使用 out 和 in 參數(shù)修飾符,不僅能優(yōu)化代碼性能,還能增強(qiáng)數(shù)據(jù)安全性,實(shí)現(xiàn)更靈活的參數(shù)傳遞邏輯。
到此這篇關(guān)于C#函數(shù)參數(shù)修飾符out和in的用法詳解的文章就介紹到這了,更多相關(guān)C#參數(shù)修飾符out和in內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式
這篇文章主要介紹了C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C#實(shí)現(xiàn)計(jì)算一個(gè)點(diǎn)圍繞另一個(gè)點(diǎn)旋轉(zhuǎn)指定弧度后坐標(biāo)值的方法
這篇文章主要介紹了C#實(shí)現(xiàn)計(jì)算一個(gè)點(diǎn)圍繞另一個(gè)點(diǎn)旋轉(zhuǎn)指定弧度后坐標(biāo)值的方法,涉及C#針對坐標(biāo)的數(shù)學(xué)運(yùn)算相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#/VB.NET 在PDF中添加文件包(Portfolio)的方法
這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-06-06
C# 延遲Task.Delay()和Thread.Sleep()的具體使用
Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
C#關(guān)于Task.Yeild()函數(shù)的討論
這篇文章主要介紹了C#中關(guān)于Task.Yeild()函數(shù)的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C# 數(shù)獨(dú)求解算法的實(shí)現(xiàn)
這篇文章主要介紹了C# 數(shù)獨(dú)求解算法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
C#?利用Autofac批量接口注入依賴的問題小結(jié)
這篇文章主要介紹了C#?利用Autofac批量接口注入依賴的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Unity?AssetPostprocessor模型函數(shù)Model實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity?AssetPostprocessor模型Model函數(shù)實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

