跳至頁尾內容
.NET幫助

C# Getter Setter(開發者的工作原理)

Getter 和 Setter 是物件導向程式語言中如 C# 的基本概念。 這兩種方法允許我們控制類別屬性的存取和修改。 在本教程中,我們將透過程式碼塊探索 C# 中 getter 和 private setter 的初學者和中級層面。

Getter 和 Setter 簡介

什麼是 Getter 和 Setter?

基本上,getter 和 setter 只是允許存取類別中私有變數的方法。 Getter 返回私有欄位變數的值,而 Setter 則修改它。 這些方法確保類別的內部資料(欄位)能夠被安全且正確地存取或修改。

為什麼我們需要它們?

想像有一個 public class Car 具有一個 private string description 屬性。 如果類別外的人想知道描述,因為它是私有的,他們不能直接存取它。 這時 Getter 和 Setter 就派上用場了。

Getter 可以允許使用者檢索 private string description 的值,而不讓他們直接修改。 而 Setter 則允許我們設定條件下的使用者修改描述。

存取修飾符

存取修飾符定義了從類別外部存取欄位或屬性的可見性和可存取性等級。 最常使用的修飾符是 publicprivate

  • Public:宣告為 public 的欄位或屬性可以在程式中的任何地方被存取。 例如,您可能有一個 public int Age 屬性可以被任意部分的程式碼存取和修改。
  • Private:宣告為 private 的屬性或欄位只能在定義的類別內部存取,例如 private int age。 這種封裝有助於防止未授權的修改,並確保類別的內部狀態能被適當維護。

簡單的 Getter 和 Setter

讓我們從一個簡單的例子開始。

using System;

public class Person
{
    private string name;  // This is a private string name property variable

    // This is the getter
    public string GetName()
    {
        return name;
    }

    // This is the setter
    public void SetName(string newName)
    {
        name = newName;
    }
}

class Program
{
    static void Main()
    {
        Person person = new Person();
        person.SetName("John");
        Console.WriteLine(person.GetName());
    }
}
using System;

public class Person
{
    private string name;  // This is a private string name property variable

    // This is the getter
    public string GetName()
    {
        return name;
    }

    // This is the setter
    public void SetName(string newName)
    {
        name = newName;
    }
}

class Program
{
    static void Main()
    {
        Person person = new Person();
        person.SetName("John");
        Console.WriteLine(person.GetName());
    }
}
Imports System

Public Class Person
	Private name As String ' This is a private string name property variable

	' This is the getter
	Public Function GetName() As String
		Return name
	End Function

	' This is the setter
	Public Sub SetName(ByVal newName As String)
		name = newName
	End Sub
End Class

Friend Class Program
	Shared Sub Main()
		Dim person As New Person()
		person.SetName("John")
		Console.WriteLine(person.GetName())
	End Sub
End Class
$vbLabelText   $csharpLabel

在上面的 class Person 中,我們有一個名為 GetName 的 getter 和一個名為 SetName 的 setter 用於 name 屬性。 當您執行 static void Main 方法時,它將列印 "John",因為我們利用 setter 為名稱設置了這個值。

自動實作屬性

現在,您可能在想,"我總是需要為 getter 和 setter 寫單獨的方法嗎?"答案是"不。"C# 引入了一個叫做"自動實作屬性"的概念來簡化這個過程。

在 C# 中,您可以使用自動屬性,給您一個聲明 private field 和其相關屬性的簡便方法。 這裡有一個範例:

using System;

public class Student
{
    public string Name { get; set; } // This is an auto-implemented or automatic property
    public string Title { get; set; } // Another auto-implemented property
}

class Program
{
    static void Main()
    {
        Student student = new Student();
        student.Name = "Alice";  // Using setter
        Console.WriteLine(student.Name);  // Using getter
    }
}
using System;

public class Student
{
    public string Name { get; set; } // This is an auto-implemented or automatic property
    public string Title { get; set; } // Another auto-implemented property
}

class Program
{
    static void Main()
    {
        Student student = new Student();
        student.Name = "Alice";  // Using setter
        Console.WriteLine(student.Name);  // Using getter
    }
}
Imports System

Public Class Student
	Public Property Name() As String ' -  This is an auto-implemented or automatic property
	Public Property Title() As String ' -  Another auto-implemented property
End Class

Friend Class Program
	Shared Sub Main()
		Dim student As New Student()
		student.Name = "Alice" ' Using setter
		Console.WriteLine(student.Name) ' Using getter
	End Sub
End Class
$vbLabelText   $csharpLabel

Student 類別中,Name 屬性是自動實作的 getter 和 setter。 C# 編譯器在幕後建立一個 private string name 欄位,Name 屬性提供存取這個欄位的方法。

屬性中的進階存取修飾符

唯讀屬性

有時,您可能希望提供一個可以讀取而不能外部修改的屬性。 這就是唯讀屬性派上用場的時候。 您可以省略屬性中的 setter 使其為唯讀。

假設我們想為 Person 類別新增一個唯讀的 string Description 屬性:

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

    public Person(string name, string description)
    {
        Name = name;
        Description = description;
    }
}
public class Person
{
    public string Name { get; set; }
    public string Description { get; }

    public Person(string name, string description)
    {
        Name = name;
        Description = description;
    }
}
Public Class Person
	Public Property Name() As String
	Public ReadOnly Property Description() As String

	Public Sub New(ByVal name As String, ByVal description As String)
		Me.Name = name
		Me.Description = description
	End Sub
End Class
$vbLabelText   $csharpLabel

在這個例子中,Description 屬性只能在 Person 類別的構造函式內設置。 一旦設置,它無法在外部修改。

私有 Setter

有時,您可能希望允許屬性從類別外部讀取,但只能在類別內設置。 這是利用 private set 實現的。

using System;

public class Program
{
    public string Description { get; private set; }

    public Program()
    {
        Description = "This is a program about getters and setters.";
    }
}

class ProgramTest
{
    static void Main()
    {
        Program myProgram = new Program();
        Console.WriteLine(myProgram.Description);  // Allowed
        // myProgram.Description = "New Description";  // Not allowed
    }
}
using System;

public class Program
{
    public string Description { get; private set; }

    public Program()
    {
        Description = "This is a program about getters and setters.";
    }
}

class ProgramTest
{
    static void Main()
    {
        Program myProgram = new Program();
        Console.WriteLine(myProgram.Description);  // Allowed
        // myProgram.Description = "New Description";  // Not allowed
    }
}
Imports System

Public Class Program
	Private privateDescription As String
	Public Property Description() As String
		Get
			Return privateDescription
		End Get
		Private Set(ByVal value As String)
			privateDescription = value
		End Set
	End Property

	Public Sub New()
		Description = "This is a program about getters and setters."
	End Sub
End Class

Friend Class ProgramTest
	Shared Sub Main()
		Dim myProgram As New Program()
		Console.WriteLine(myProgram.Description) ' Allowed
		' myProgram.Description = "New Description";  // Not allowed
	End Sub
End Class
$vbLabelText   $csharpLabel

class Program 中,Description 屬性有一個 private set,這意味著它無法在類別外部改變,從而確保資料的完整性。

繼承與覆蓋

當使用派生類別時,您可以覆蓋 getter 和 setter 方法來自定義其行為。 這允許您在取得或設置值時新增額外的邏輯。

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

public class Student : Person
{
    private string studentID;

    public override string Name
    {
        get { return base.Name; }
        set
        {
            if (!string.IsNullOrEmpty(value))
                base.Name = value;
        }
    }
}
public class Person
{
    public virtual string Name { get; set; }
}

public class Student : Person
{
    private string studentID;

    public override string Name
    {
        get { return base.Name; }
        set
        {
            if (!string.IsNullOrEmpty(value))
                base.Name = value;
        }
    }
}
Public Class Person
	Public Overridable Property Name() As String
End Class

Public Class Student
	Inherits Person

	Private studentID As String

	Public Overrides Property Name() As String
		Get
			Return MyBase.Name
		End Get
		Set(ByVal value As String)
			If Not String.IsNullOrEmpty(value) Then
				MyBase.Name = value
			End If
		End Set
	End Property
End Class
$vbLabelText   $csharpLabel

在這個例子中,Student 類別繼承自 Person 並覆蓋 Name 屬性的 setter。 在設置名稱之前新增了一個檢查,確保其不為空或 null。

Introducing Iron Suite to Enhance Your C# Development

Iron Suite 是一組提供顯著提高 C# 開發能力的研究工具。 它包含 IronPDF、IronXL、IronOCR 和 IronBarcode。 每個工具都有獨特的用途,可以整合到 C# 的各個方面。

IronPDF - 強大的 PDF 管理工具

進一步了解 IronPDF,這是一個允許開發人員在 C# 中建立、讀取和編輯 PDF 文件的程式庫。 無論是將 HTML 轉換為 PDF 還是透過 getters 和 setters 管理 PDF 元資料,IronPDF 都能滿足您的需求。

IronPDF在HTML到PDF轉換方面表現出色,確保精確保留原始設計和樣式。 它非常適合從基於網路的內容如報告、發票和文件中建立PDF。 IronPDF支持HTML文件、URLs和原始HTML字串,輕鬆生成高品質的PDF文件。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

IronXL - Excel 操作變得簡單

在處理 Excel 檔案時,IronXL Excel Library 簡化了讀寫過程。 這個工具可以用來操作 Excel 文件的私有和公共字串或整數,就像在類別中使用 getter 和 setter 的相同語法一樣。

IronOCR - Optical Character Recognition in C

探索 IronOCR,這是一個將影像轉換為可搜尋文字的光學文字識別程式庫。 如果您的應用程式涉及從掃描文件中讀取文字,IronOCR 的強大功能可以輕鬆整合。 它可以處理私有欄位和公共字串描述,就像您在前面的例子中設定的 Person 或 Student 類別一樣。

IronBarcode - 條碼讀取與書寫程式庫

發掘 IronBarcode 的功能,適用於需要條碼讀取和書寫的應用程式。 它允許直接存取條碼資料和透過自動屬性自訂,就像 C# 程式設計中使用的 getters 和 setters 一樣。

Iron Suite and Getters and Setters

Iron Suite 套件無縫整合於 C# 開發,包括 getters 和 setters。 這些工具為任何 C# 專案增值。

結論

總結:

  1. Getter and Setter:它們有助於存取和修改類別的私有欄位。
  2. Auto Properties:透過自動屬性提供一種優雅的方法來擁有自動的 getters 和 setters。
  3. Access Modifiers:它們有助於微調屬性的可存取性。

到目前為止,您應該對如何在 C# 中使用 getters 和 setters 有了一個紮實的理解。

Iron Suite 的工具集合為 C# 開發人員提供了強大的功能。 這些產品,包括 IronPDF、IronXL、IronOCR 和 IronBarcode,均附帶Iron Software 工具的免費試用,允許您無需任何初始投資就能探索並整合這些強大的程式庫到您的項目中。

當您準備好承諾時,單獨的授權價格從 $999 開始。 如果您發現有多個工具符合您的需求,您可以利用這個機會,以僅僅兩個單獨授權的價格購買完整的 Iron Suite 套件。

常見問題

C# 中的 getters 和 setters 的目的為何?

C# 中的 getters 和 setters 用於控制對類別私有屬性的存取。Getters 取得屬性的值,而 setters 允許修改屬性。這種封裝確保了對類別資料的安全和控制存取。

存取修飾符如何影響 C# 中屬性可見性?

存取修飾符如 publicprivate 確定 C# 中類別屬性的可見性和可存取性。Public 屬性可以從任何地方存取,而 private 屬性則限於它們宣告所在的類別之內。

C# 中的自動實現屬性是什麼?

自動實現屬性提供了一種簡便的方法來在 C# 中宣告屬性。它們允許您定義屬性,而不明確寫出單獨的欄位、getter 和 setter。編譯器會自動為您建立一個支持欄位。

如何在 C# 中建立只讀屬性?

在 C# 中,您可以通過在屬性宣告中省略 setter 來建立只讀屬性。這意味著屬性只能在類別中設定,例如在建構函式中,不能從外部修改。

如何在 C# 中使用 private setters?

C# 中的 private setters 允許屬性僅在其宣告的類別內部修改,同時仍允許外部程式碼讀取該屬性。這對於在提供控制存取的同時維持資料完整性非常有用。

您能否在 C# 的衍生類別中覆寫屬性行為?

是的,在 C# 中,您可以通過將基類中的屬性標記為 virtual 並在衍生類別中使用 override 關鍵字來覆寫屬性行為。這允許客製化 getter 和 setter 行為。

如何在 C# 中將 HTML 轉換為 PDF?

您可以使用IronPDF的RenderHtmlAsPdf方法將HTML字串轉換成PDF。您也可以使用RenderHtmlFileAsPdf將HTML文件轉換為PDF。

有哪些工具可以增強 C# 開發中的 PDF 和條碼功能?

Iron Suite 提供如 IronPDF 和 IronBarcode 等工具,通過提供如 PDF 管理和條碼讀寫等功能來增強 C# 開發。這些工具與 C# 專案無縫整合。

Iron Suite 對 C# 開發者有何益處?

Iron Suite 對 C# 開發者有益,因為它提供了一系列與 C# 專案無縫整合的強大工具。這些工具提供先進功能,如 PDF 管理、Excel 操作、OCR 功能和條碼讀寫。

Jacob Mellor,首席技術官 @ Team Iron
首席技術官

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話