從程式結構上來說,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 不僅被用來修飾類的成員,還可以在類...