屬性- C# 程式設計手冊
文章推薦指數: 80 %
_seconds = value * 3600; } } } class Program { static void Main() { TimePeriod t = new TimePeriod(); // The property assignment causes the ...
跳到主要內容
已不再支援此瀏覽器。
請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。
下載MicrosoftEdge
其他資訊
目錄
結束焦點模式
閱讀英文
儲存
共用
Twitter
LinkedIn
Facebook
電子郵件
WeChat
目錄
閱讀英文
儲存
目錄
閱讀英文
儲存
Twitter
LinkedIn
Facebook
電子郵件
WeChat
目錄
屬性(C#程式設計手冊)
發行項
03/23/2022
14位參與者
此頁面有所助益嗎?
Yes
No
還有其他意見反應嗎?
系統會將意見反應傳送給Microsoft:按下[提交]按鈕,您的意見反應將用來改善Microsoft產品和服務。
隱私權原則。
送出
謝謝。
本文內容
屬性是提供彈性機制以讀取、寫入或計算私用欄位值的成員。
使用屬性時可將其視為公用資料成員,但實際上屬性是名為「存取子」的特殊方法。
如此可讓資料更容易存取,同時有助於提升方法的安全性和彈性。
屬性概觀
屬性可讓類別公開取得和設定值的公用方式,同時隱藏實作或驗證程式碼。
get屬性存取子可用來傳回屬性值,而set屬性存取子則用來指派新值。
在c#9和更新版本中,只有在物件結構期間,才會使用init屬性存取子來指派新值。
這些存取子可以有不同的存取層級。
如需詳細資訊,請參閱限制存取子的存取範圍。
Value關鍵字是用來定義或init存取子所指派的值。
屬性可以是「讀寫」(同時具有和set存取子)、「唯讀」set(具有get存取子但沒有set存取子)或「唯寫」get(具有set存取子但沒有get存取子)。
唯寫屬性很少見,而且最常用來限制對機密資料的存取。
不需要自訂存取子程式碼的簡單屬性,則可以實作為運算式主體定義或自動實作屬性。
含有支援欄位的屬性
實作屬性的一種基本模式需要使用私用支援欄位,來設定和擷取屬性值。
get存取子會傳回私用欄位的值,而set存取子則可能會執行一些資料驗證,再將值指派給私用欄位。
這兩個存取子也可能會對資料執行一些轉換或計算,再儲存或傳回資料。
下列範例將示範這個模式。
在此範例中,TimePeriod類別代表時間間隔。
就內部而言,此類別會將時間間隔(秒)儲存在名為_seconds的私用欄位中。
名為Hours的讀寫屬性可讓客戶以小時為單位指定時間間隔。
get和set存取子都會執行小時與秒之間的必要轉換。
此外,set存取子會驗證資料,並在小時數無效時擲回ArgumentOutOfRangeException。
usingSystem;
classTimePeriod
{
privatedouble_seconds;
publicdoubleHours
{
get{return_seconds/3600;}
set{
if(value<0||value>24)
thrownewArgumentOutOfRangeException(
$"{nameof(value)}mustbebetween0and24.");
_seconds=value*3600;
}
}
}
classProgram
{
staticvoidMain()
{
TimePeriodt=newTimePeriod();
//Thepropertyassignmentcausesthe'set'accessortobecalled.
t.Hours=24;
//Retrievingthepropertycausesthe'get'accessortobecalled.
Console.WriteLine($"Timeinhours:{t.Hours}");
}
}
//Theexampledisplaysthefollowingoutput:
//Timeinhours:24
運算式主體定義
屬性存取子通常是由只會指派或傳回運算式結果的單行陳述式所組成。
您可以將這些屬性實作為運算式主體成員。
運算式主體定義包含=>符號,後面接著要從屬性指派或擷取的運算式。
從C#6開始,唯讀屬性可將get存取子實作為運算式主體成員。
在此情況下,不會使用get存取子關鍵字和return關鍵字。
下列範例會將唯讀Name屬性實作為運算式主體成員。
usingSystem;
publicclassPerson
{
privatestring_firstName;
privatestring_lastName;
publicPerson(stringfirst,stringlast)
{
_firstName=first;
_lastName=last;
}
publicstringName=>$"{_firstName}{_lastName}";
}
publicclassExample
{
publicstaticvoidMain()
{
varperson=newPerson("Magnus","Hedlund");
Console.WriteLine(person.Name);
}
}
//Theexampledisplaysthefollowingoutput:
//MagnusHedlund
從C#7.0開始,可同時將get和set存取子實作為運算式主體成員。
在此情況下,必須同時有get和set關鍵字。
下列範例說明如何使用運算式主體定義來表示這兩個存取子。
請注意,return關鍵字不能搭配get存取子使用。
usingSystem;
publicclassSaleItem
{
string_name;
decimal_cost;
publicSaleItem(stringname,decimalcost)
{
_name=name;
_cost=cost;
}
publicstringName
{
get=>_name;
set=>_name=value;
}
publicdecimalPrice
{
get=>_cost;
set=>_cost=value;
}
}
classProgram
{
staticvoidMain(string[]args)
{
varitem=newSaleItem("Shoes",19.95m);
Console.WriteLine($"{item.Name}:sellsfor{item.Price:C2}");
}
}
//Theexampledisplaysoutputlikethefollowing:
//Shoes:sellsfor$19.95
自動實作屬性
在某些情況下,屬性get和set存取子只會指派值給支援欄位,或從支援欄位中擷取值,而不會包含任何其他邏輯。
藉由使用自動實作屬性,您可以簡化程式碼,同時讓C#編譯器無障礙地為您提供支援欄位。
如果屬性同時get具有和set(或是get和init)存取子,則兩者都必須是自動實作為。
您可以使用get和set關鍵字,但不提供任何實作,來定義自動實作屬性。
下列範例會重複上一個範例,不同之處在於Name和Price為自動實作屬性。
此範例也會移除參數化的函式,因此SaleItem現在會使用無參數的函式和物件初始化SaleItem來初始化物件。
usingSystem;
publicclassSaleItem
{
publicstringName
{get;set;}
publicdecimalPrice
{get;set;}
}
classProgram
{
staticvoidMain(string[]args)
{
varitem=newSaleItem{Name="Shoes",Price=19.95m};
Console.WriteLine($"{item.Name}:sellsfor{item.Price:C2}");
}
}
//Theexampledisplaysoutputlikethefollowing:
//Shoes:sellsfor$19.95
相關章節
使用屬性
介面屬性
屬性與索引子之間的比較
限制存取子協助工具
自動實作的屬性
C#語言規格
如需詳細資訊,請參閱C#語言規格的屬性。
語言規格是C#語法及用法的限定來源。
另請參閱
C#程式設計指南
使用屬性
索引子
get關鍵字
set關鍵字
本文內容
延伸文章資訊
- 1屬性(Property) 與欄位(Field) - mrkt 的程式學習筆記
Property:FullDescription為主要資料取得的地方,對外公開;. Field:_FullDescription為物件私有成員,是用來存放屬性的資料。 MSDN - 使用屬性(C...
- 2[C#.NET] 使用屬性(Property) 的好處| 余小章@ 大內殿堂- 點部落
[C#.NET] 使用屬性(Property) 的好處. 我相信很多人寫很久的程式從沒有習慣使用property,甚至連property 是什麼都不知道,長期以來都是一直 ...
- 3屬性- C# 程式設計手冊
_seconds = value * 3600; } } } class Program { static void Main() { TimePeriod t = new TimePeriod...
- 4C# 属性(Property) | 菜鸟教程
C# 属性(Property) 属性(Property) 是类(class)、结构(structure)和接口(interface)的命名(named)成员。类或结构中的成员变量或方法称为域(F...
- 5使用屬性- C# 程式設計手冊 - Microsoft Docs
C# 複製. public class Date { private int _month = 7; // Backing store ... the name field public str...