[英]how do i use a property { get; }?
我注意到在Microsoft.Xna.Framework.Rectangle
struct
,有很多屬性只是public int Bottom { get; }
public int Bottom { get; }
或public Point Center { get; }
public Point Center { get; }
。 對於我的生活,我無法弄清楚這里發生了什么。 我試過在我自己的一些結構中復制這個,但我不知道如何在沒有set;
情況下首先給它一個值set;
關鍵詞。 Rectangle
struct
對{get;}
做了什么?
這意味着以后無法設置屬性為您提供訪問權限的基礎值。您只能“獲取”基礎值。
實例化Rectangle
,必須傳遞一些值:
public Rectangle (int x, int y, int width, int height)
我的猜測(不看源代碼)是屬性值( Center
, Bottom
等)都在構造函數中設置。 你以后不能改變它們。要么尋找另一個要設置的屬性(即X
或Y
),要么根據現有屬性創建一個新的Rectangle
。
var newRect = new Rectangle(oldRect.X, oldRect.Y, oldRect.Width, oldRect.Height);
為了比較,這里是System.Drawing.Rectangle
結構的源代碼的一部分,它可能與您正在處理的內容非常接近。 請注意,您可以通過構造函數設置某些值,然后將這些值存儲在私有變量中,並且可以訪問(但在某些情況下只能更改 )屬性。
public struct Rectangle
{
public static readonly Rectangle Empty = new Rectangle();
private int x;
private int y;
private int width;
private int height;
public Rectangle(int x, int y, int width, int height)
{
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public int X
{
get { return x; }
set { x = value; }
}
public int Left
{
get { return X; }
}
public int Y
{
get { return y; }
set { y = value; }
}
public int Top
{
get { return Y; }
}
...
...
}
Rectangle.Bottom
沒有集合的原因是因為它是計算值Top + Height
。 如果你願意,那你想發生什么? 改變y位置? 改變高度? 不可能知道。 因此,您必須根據實際需要決定自己並更改Top
或Height
。
屬性的概念不僅僅是擁有變量並設置或獲取它。 如果它是我們可以只使用公共變量,就是這樣。 相反,我們的想法是允許驗證和計算屬性。
public int Bottom
{
get { return Top + Height; }
}
如您所見,沒有必要將其設置為任何內容,因為它將基於其他值推斷其值。
(當然在內部它很可能不會使用其他屬性,而是由於性能而導致的實際變量)
考慮以下:
private int myVar;
public int MyProperty
{
get { return myVar; }
}
在這里,您可以看到一個直接從Visual Studio的C#片段中獲取的示例,其中顯示了如何實現get-only屬性。 您需要設置支持字段 ,但不能通過屬性來完成,因為該屬性被稱為只讀屬性或沒有setter方法的屬性 。 這些屬性的目的是制作關於您的對象的合同聲明“此屬性無法設置”。
這類似於擁有私有setter,但是,您不能在接口定義中強制執行訪問修飾符。 因此,在定義數據協定和對象接口時,此語法用於特定目的,也就是說“不能通過契約設置此屬性,並且任何子類都不會將公共setter作為此契約的一部分公開”。
順便說一句, 你可以使用反射規避訪問修飾符 ,但這不是常見的情況(99%的.NET開發人員可能沒有意識到這一點。)
通常, 支持字段通過構造函數,通過反射或作為對象初始化的一部分來設置。
這也是核心語法,它構成了現代句法糖的基礎。 考慮以下屬性定義:
public int MyProperty { get; set; }
這完全是語法糖,實際上對C#1.0編譯器無效。 今天在編譯時,代表您生成一個支持字段 。 因此,以下語法僅對接口定義有效(否則它將永遠不會返回有意義的值。)
public int MyProperty { get; }
參考文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.