.NET 幫助

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

發佈 2023年11月13日
分享:

C# ref 關鍵字 是一種每個初學者都應該了解的重要工具。它用於通過引用傳遞參數(或稱為 args),而不是按值傳遞,允許在被調用的方法內對引用類型變量所做的更改在方法外部反映出來。在本教程中,我們將詳細介紹 **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
VB   C#

在上述代碼中,即使我們在 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
VB   C#

注意在方法簽名和調用中都使用了 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
VB   C#

在此範例中,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
VB   C#

在上面的範例中,我們重載了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
VB   C#

在此示例中,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
VB   C#

編譯器錯誤和 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 Manipulation at Your Fingertips

使用 C# 處理 Excel 文件可能具有挑戰性,但 IronXL 簡化這個任務。它使您能夠在未安裝 Excel 的情況下讀取、寫入、編輯和操作 Excel 文件。從導入數據到創建新試算表,IronXL 使在 C# 中處理 Excel 變得簡單。

IronOCR 光學文字識別 (適用於 C#)

光學文字識別 (光學字符識別) 可能會很複雜,但 IronOCR 簡化過程。有了這個庫,您可以從圖像中讀取文本並將其轉換為機器可讀文本。無論您需要從掃描文檔中提取文本還是識別圖像中的字符,IronOCR 都具備此功能來幫助您。

IronBarcode 條碼生成和讀取

條碼在各種行業中被廣泛使用,在您的應用程式中處理它們現在更加容易,使用 IronBarcode此函式庫讓您可以在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 中的每款產品提供了一個 免費試用,讓您在沒有立即投資的情況下探索和利用廣泛的功能。如果您決定繼續使用完整授權,價格從對應的組件的 $749 起。

如果您發現整個 Iron Suite 符合您的需求,有一個很棒的優惠在等著您。您只需支付兩個單一組件的價格即可獲得整個套件。

< 上一頁
C# Datatable 轉換為 List(開發人員如何使用)
下一個 >
NLog C#(它如何為開發人員工作)

準備開始了嗎? 版本: 2024.9 剛剛發布

免費 NuGet 下載 總下載次數: 10,840,061 查看許可證 >