.NET 幫助

C# ref 關鍵字(開發者如何運作)

C# ref 關鍵字 是每位初學者都應該了解的基本工具。 它用來通过引用而非值传递参数或参数,允許在被调用的方法內对引用類型變量所做的更改反映在外部。 在本教程中,我們將詳細介紹**ref 關鍵字,並探討各種控制台代碼範例,以說明其運作方式。

ref 關鍵字介紹

在 C# 中,當你傳遞方法參數時,預設是以值傳遞。 這意味著會創建參數值的副本,且在呼叫方法中所做的任何更改都不會影響方法之外的原始變數。 ref 關鍵字改變了這種行為,允許您以傳址方式傳遞參數。 當參數以引用方式傳遞時,方法內所做的任何更改將直接影響方法外的原始變數。

關鍵概念

  • ref 關鍵字:用來指示變數是以參考方式傳遞的。
  • 引用變數:指參考數據存儲位置的類型。
  • 值類型:保存實際數據的類型。
  • 原始變數:當使用ref關鍵字時,方法外的變數會反映方法內所做的更改。

按引用傳遞

讓我們先了解變數是如何透過引用傳遞的概念。 假設您有一個方法可以增量整數,如以下代碼所示:

class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
Friend Class Program
'method returns incremented value
	Private Shared Sub IncrementByOne(ByVal num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOne(value)
		Console.WriteLine(value) ' Output: 5
	End Sub
End Class
$vbLabelText   $csharpLabel

在上面的程式碼中,即使我們在 IncrementByOne 方法內遞增了 num,原始的 value 仍然保持不變。 這是因為num是原始變數的複本,對其所做的變更不會影響到原始變數。

使用 ref 關鍵字

現在,讓我們看看ref關鍵字如何改變這種行為。 通過使用ref,您可以按引用將變量傳遞給方法,如下方其中一個代碼示例所示。

class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
Friend Class Program
'ref int
	Private Shared Sub IncrementByOneRef(ByRef num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOneRef(value)
		Console.WriteLine(value) ' Output: 6
	End Sub
End Class
$vbLabelText   $csharpLabel

請注意方法簽名和呼叫中的 ref 關鍵字。 這告訴 C# 您想要通過引用傳遞 value 變量。 因此,在IncrementByOneRef方法中所做的更改會反映在原始的value變數中。

處理值類型

ref 關鍵字在處理整數、雙精度數字和結構等類型時特別有用。 這些類型直接儲存在記憶體中,以引用方式傳遞它們可以提升性能並對數據操作進行更精確的控制。

修改引用變數

雖然ref關鍵字通常與值類型相關聯,但它也可以用於參考類型變量。 引用類型,如類和陣列,儲存的是記憶體中實際資料的引用,而不是資料本身。 這意味著你正在處理類似指標的結構,通過引用傳遞可以產生不同的結果,如以下範例所示:

class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
Friend Class Person
	Public Property Name() As String
End Class

Friend Class Program
	'method
	Private Shared Sub ChangeName(ByRef person As Person)
		'new object
		person = New Person With {.Name = "Alice"}
	End Sub

	Shared Sub Main()
		Dim person As New Person With {.Name = "Bob"}
		ChangeName(person)
		Console.WriteLine(person.Name) ' Output: Alice
	End Sub
End Class
$vbLabelText   $csharpLabel

在此示例中,ChangeName 方法將 person 變量的引用更改為新的 Person 對象。 因此,原始person變數現在指向另一個對象,其名稱為「Alice」。

參考型別參數的方法多載

您可以擁有多個同名但參數不同的方法。 這叫做方法重載。 當使用ref關鍵字時,方法重載變得更加強大。

class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
Friend Class Calculator
	Public Shared Sub Add(ByRef x As Integer, ByVal y As Integer)
		x += y
	End Sub

	Public Shared Sub Add(ByRef x As Double, ByVal y As Double)
		x += y
	End Sub
End Class

Friend Class Program
	Shared Sub Main()
		Dim intValue As Integer = 5
		Dim doubleValue As Double = 7.5
		'ref parameter
		Calculator.Add(intValue, 3)
		Calculator.Add(doubleValue, 2.5)

		Console.WriteLine(intValue) ' Output: 8
		Console.WriteLine(doubleValue) ' Output: 10.0
	End Sub
End Class
$vbLabelText   $csharpLabel

在上面的範例中,我們重載了Add方法以用於intdouble類型。ref關鍵字允許方法直接修改原始變數。

使用 out 關鍵字

另一個相關的關鍵字是out。 這類似於ref,但目的略有不同。 雖然ref要求變數在傳遞之前初始化,但out關鍵字用於當您希望方法為不一定有初始值的參數賦值時:

class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
Friend Class Program
	Private Shared Sub Divide(ByVal dividend As Integer, ByVal divisor As Integer, ByRef quotient As Integer)
		quotient = dividend \ divisor
	End Sub

	Shared Sub Main()
		Dim result As Integer = Nothing
		Divide(10, 2, result)
		Console.WriteLine(result) ' Output: 5
	End Sub
End Class
$vbLabelText   $csharpLabel

在此範例中,Divide 方法計算商並使用 out 關鍵字將其賦值給 quotient 變數。 值得注意的是,您不需要在將result傳遞給方法之前初始化它。

ref 和 out 關鍵字之間的區別

out 關鍵字與 ref 關鍵字相似,但有顯著的不同。 out 參數不需要初始值,而 ref 參數在方法調用之前必須有初始值。

潛在陷阱

雖然refout關鍵字是強大的工具,但應謹慎使用。 不正確使用這些關鍵字可能會導致代碼混亂和意外行為。 例如,您不能在使用 refout 參數時使用未初始化的非 ref 變數,因為這會導致編譯錯誤。

ref 關鍵字的進階用法

操作參考類型和值類型

了解兩個引用和值類型之間的差異在使用ref關鍵字時至關重要。

  • 參考類型:變數指的是資料儲存在記憶體中的位置,例如對象、陣列等。
  • 值類型:變數直接包含數據,例如整數、浮點數等。

    使用 ref 與值類型一起使用可以使更改在方法外反映出來,而引用類型變量天生就是這樣的行為。

使用​ref​關鍵字的擴展方法

您也可以在擴充方法中使用ref關鍵字。 範例:

public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
Public Module StringExtensions
'example
	Public Sub AppendValue(ByRef Me input As String, ByVal value As String)
		input &= value
	End Sub
End Module
$vbLabelText   $csharpLabel

編譯器錯誤和 ref 關鍵字

如果您忘記在方法簽名或方法調用中包含ref關鍵字,則會在編譯時出現編譯器錯誤。

Async 方法和 ref 參數

請注意,您無法在迭代器方法或async方法中使用ref參數,因為這些方法需要按值傳遞參數。

推出Iron Suite

除了了解 C# 中的 ref 關鍵字等關鍵概念之外,還有一套強大的工具可以讓開發者的生活變得更輕鬆。 Iron Suite 是一套強大的工具和庫,包括 IronPDF、IronXL、IronOCR 和 IronBarcode。 讓我們探索這些工具,看看它們如何在沒有任何爭議的情況下提升您的編程體驗。

IronPDF PDF 處理變得簡單

了解 IronPDF 作為 Iron Suite 的重要組成部分。這是一個庫,允許開發人員在 C# 中創建、閱讀和編輯 PDF 文件。 如果您想將 HTML 轉換為 PDF,IronPDF 擁有您需要的工具。 查看將 HTML 轉換為 PDF 的教程來了解更多有關此功能的資訊。

IronXL Excel 操作盡在指尖

在 C# 中處理 Excel 文件可能很有挑戰性,但IronXL 功能簡化了這項任務。 它使您能夠在未安裝 Excel 的情況下讀取、寫入、編輯和操作 Excel 檔案。 從匯入數據到創建新電子表格,IronXL 在 C# 中輕鬆處理 Excel。

IronOCR 光學字符識別 for C

光學字符識別(OCR)可能很複雜,但了解 IronOCR以簡化此過程。 使用此函式庫,您可以從影像中讀取文字並將其轉換為機器可讀的文字。 無論您是需要從掃描文件中提取文字,還是識別圖像中的字符,IronOCR 都具備相應的功能來幫助您。

IronBarcode 條碼生成與讀取

條碼在各種行業中被廣泛使用,現在可以使用 IronBarcode library 更加輕鬆地在您的應用程式中處理它們。 此函式庫可讓您在 C# 中創建、讀取和處理條碼。 IronBarcode 支援多種 QR 和條碼格式。

Iron Suite 與 ref 關鍵字的關係如何

您可能會想知道這些工具與我們討論過的ref關鍵字有什麼關係。 在處理涉及 PDF、Excel、OCR 或條碼的複雜專案時,有效地使用 ref 關鍵字和其他 C# 原則對於有效管理您的代碼將是至關重要的。

例如,在使用 IronXL 操作大型 Excel 文件時,使用 ref 關鍵字按引用傳遞對象可以使您的代碼更高效且易於維護。 同樣地,使用 IronPDF 處理 PDF 文件可能涉及使用 ref 關鍵字的方法。

了解核心語言功能,如ref關鍵字,並能夠使用像Iron Suite這樣的工具,為您提供了一個強大的組合,以構建高效、穩健和多功能的應用程式。 Iron Suite 設計與您現有的 C# 知識無縫協作,能夠幫助您創建更專業和精緻的解決方案。

結論

C# 語言具有像 ref 關鍵字這樣的特性,為開發人員提供了強大的功能。 與 Iron Suite 結合,包括 IronPDF、IronXL、IronOCR 和 IronBarcode,可能性變得更加廣泛。

Iron Suite 中的每個產品都提供Iron Suite 免費試用,讓您無需立即投資即可探索和利用其廣泛功能。 如果您決定購買完整授權,個別元件的價格從$749起。

如果您發現整個 Iron Suite 符合您的需求,有一個絕佳的優惠等著您。 您可以用僅僅兩個獨立組件的價格獲得完整套件。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# Datatable 轉換為 List(開發人員如何使用)
下一個 >
NLog C#(它如何為開發人員工作)