簡體   English   中英

我如何使用財產{get; }?

[英]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)

我的猜測(不看源代碼)是屬性值( CenterBottom等)都在構造函數中設置。 你以后不能改變它們。要么尋找另一個要設置的屬性(即XY ),要么根據現有屬性創建一個新的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位置? 改變高度? 不可能知道。 因此,您必須根據實際需要決定自己並更改TopHeight

屬性的概念不僅僅是擁有變量並設置或獲取它。 如果它是我們可以只使用公共變量,就是這樣。 相反,我們的想法是允許驗證和計算屬性。

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; }

以上是使用較新的自動屬性語法創建只讀屬性的(無效)嘗試。

參考文獻:

  1. 什么時候應該使用Readonly和Get only屬性
  2. 為getter和setter使用支持變量
  3. 是否可以訪問自動實現屬性背后的支持字段?
  4. https://msdn.microsoft.com/en-us/library/bb384054.aspx
  5. https://msdn.microsoft.com/en-us/library/w86s7x04.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM