c 基礎練習 03 引數中的 ref out

2021-09-28 19:34:51 字數 2075 閱讀 4387

從程式結構上來說,ref和out是把return的工作給搶了。

using system;

namespace

ref和out

",max)

;max

(m, n,

out max)

; console.

writeline

("out最大值為:"

,max)

;maxref

(m, n,

ref max)

; console.

writeline

("ref最大值為:"

,max)

; console.

read()

;}static

intmax

(int a,

int b)

static

void

max(

int a,

int b,

outint max)

static

void

maxref

(int a,

int b,

refint max)

}}

所以c#方法返回引數可分為兩個類別,一種是return,另一種是out,ref。

out和ref在功能上是等價的,唯一區別在於out隱含著傳入引數原值必須被改變,而fef可以改變原值也可以不改。

為什麼c#有了return還額外弄了out,ref,原因在於需求要不要改變值型別的傳入引數上。

不過c#好像沒有一種機制,來保證不會改變引用型別的傳入引數?

另外前面已經測試過,string儘管是引用型別,但在引數傳遞上,表現的是值型別。

using system;

namespace

ref和out

ref和out

static

void

test

(ref

string a)

}}

就必須使用out或者ref來改變string原值。

那麼什麼時候用return,什麼時候用out,ref

return與out,ref在返回功能上有重合的地方,很多返回值既可以用return,也可以用out,ref

①return:更適合單一型別單個值或者單一型別多個值,比如return int ,return int,return bool

②out與ref: 更適合返回多個不同型別的值,分別用out int,out double,out bool

事實上,return也可以返回多個不同型別,用結構體包裹起來,只不過如果引數個數不多,沒必要專門去宣告乙個結構體,用out更簡潔。而out也能返回多個單一型別,out int

核心還是在於業務邏輯,要不要改變傳入引數原值?

比如想驗證輸入的使用者和密碼字串是否正確,正確則登入成功,方法islogin不光能判斷是否成功,還能返回登入資訊:

需要返回2個不同型別的值,return用結構體未免小題大做,直接用out更簡潔。

using system;

namespace

ref和out

console.

writeline

(msg)

;

console.

read()

;}static

bool

islogin

(string name,

string pwd,

outstring msg)

else}}

}

C 基礎 C 中方法中的四種引數

值引數 當利用值向方法傳遞引數時,編譯程式給實參的值做乙份拷貝,並且將此拷貝傳遞給該方法,被呼叫的方法不會修改記憶體中實參的值,所以使用值引數時,可以保證實際值是安全的,在呼叫方法時,如果形式化引數的型別是值引數的話,呼叫的實參的表示式必須保證是正確的值表示式 publicclass class1 ...

迴圈的中斷操作(C 基礎回顧03)

break 立即終止迴圈 continue 立即終止當前的迴圈 繼續執行下一次迴圈 return 跳出迴圈及包含該迴圈的方法 函式 list mylist new list break 立即終止迴圈 for int i 0 i 10 i mylist.add i.tostring 迴圈結束mylis...

C 中const的用法 03 類

前面介紹了const 在常量與指標和const 在函式中的用法,雖然放在不同的位置會有不同的用法,但歸根結底,const 的思想都沒有變 那就是用來修飾乙個不能被改變的量。然而,const 在類中的含義有所不同。下面我們來介紹const在類中的具體情況。const 不僅被用來修飾類的成員,還可以在類...