# ref v.s. out ### 生活中的比喻 * ref 參數: 比喻: 想像你有一個可以調整的家用電視機,你把遙控器(ref 參數)給你的朋友。你告訴他調整音量或更改頻道。當他使用遙控器時,他的調整會直接影響到你的電視機,因為他控制的是同一台電視機。 解釋: 在這個比喻中,==電視機代表原始變數==,==遙控器代表 ref 參數==。你需要在使用遙控器之前==先開啟電視機==(初始化變數),因為你希望他可以直接修改電視機的設置(修改變數的值)。 * out 參數: 比喻: 想像你給你的朋友一個空盒子(out 參數),告訴他把一些資料放到盒子裡面(例如,放入一份文件)。當他完成後,你可以取回這個裝滿資料的盒子。你在給他盒子時==並不要求他事先填入任何資料==,但他必須在返回盒子之前填滿資料。 解釋: 在這個比喻中,盒子代表 out 參數。==你不需要提前準備好資料(初始化)==,但是你的==朋友必須在盒子裡放入資料(初始化 out 參數)==,這樣你才能拿到完整的資料(返回結果)。 --- | 特點 | `ref` 參數 | `out` 參數 | |----------------|-------------------------------------------------|-------------------------------------------------| | **初始化要求** | 必須在調用方法前初始化(打開電視) | 不需要在調用方法前初始化 | | **使用方式** | 在方法定義和調用時都必須使用 `ref` 關鍵字 | 在方法定義和調用時都必須使用 `out` 關鍵字 | | **方法內要求** | 方法內可以讀取和修改參數值 | 方法內必須對參數進行初始化 | | **目的** | 主要用於修改傳入參數的值,並且將這些修改反映到調用者中 | 主要用於從方法中返回多個結果 | | **比喻** | 就像給你的朋友一個遙控器,讓他控制你的電視機(修改變數值) | 就像給你的朋友一個空盒子,讓他在盒子裡放入資料(返回結果) | ### 例子 * ref 參數例子: ``` using System; class Program { static void Increment(ref int number) { number++; } static void Main() { int value = 10; // 必須初始化 Increment(ref value); Console.WriteLine(value); // Output: 11 } } ``` 在這個例子中,value 在調用 Increment 方法之前被初始化為 10,Increment 方法中對 value 的修改會反映到調用者中。 * out 參數例子: ``` using System; class Program { static void Divide(int numerator, int denominator, out int quotient, out int remainder) { // 這裡不需要對 quotient 和 remainder 進行初始化,但它們在方法結束前必須被初始化。 quotient = numerator / denominator; // 必須初始化 remainder = numerator % denominator; // 必須初始化 } static void Main() { int num = 10; int denom = 3; int resultQuotient; //未初始化 int resultRemainder; //未初始化 Divide(num, denom, out resultQuotient, out resultRemainder); Console.WriteLine($"Quotient: {resultQuotient}, Remainder: {resultRemainder}"); // Output: Quotient: 3, Remainder: 1 } } ``` 在這個例子中,resultQuotient 和 resultRemainder 在方法 Divide 中被初始化。調用方法之前不需要對它們進行初始化,但方法內部必須對它們進行賦值。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up