簡體   English   中英

getter / setter中的屬性名稱

[英]Property name in getter/setter

我正在創建一些屬性,並遇到了一個我之前從未見過的場景。

考慮

private double _temperature;
private double _maxTemp;

public double Temperature
{
    get { return _temperature; }
    set { _temperature = value; }
}
public double MaxTemp
{
    get { return _maxTemp; }
    set { _maxTemp = value; }
}
public bool IsTempToHigh
{
    get
    {
        if (_temperature < _maxTemp)
            return true;
        else
            return false;
    }
}

沒問題,但是我有很多這種屬性,因此我將其重寫為:

public double Temperature { get; set; }
public double MaxTemp { get; set; }
public bool IsTempToHigh
{
    get
    {
        if (Temperature < MaxTemp)
            return true;
        else
            return false;
    }
}

我認為還算干凈一點,而且效果還不錯。 但是,我不安地看到或注意到有人直接在gettes(或setter)中使用屬性名稱,因此使用起來安全嗎?還是有任何陷阱。

也是為什么要編譯卻給出StackOverflowException:

public double Value
{
    get { return Value; }
    set { Value = value; }
}

如果您用IsTempTooHigh ,那很好(盡管條件是錯誤的名稱名稱)。 在另一個屬性中引用一個屬性是完全有效的,盡管您需要注意不要使其遞歸。 您自動實現的屬性仍然具有后備字段-它們只是由編譯器為您生成的,而不是出現在源代碼中。

我會在沒有if情況下重寫您的計算屬性,請注意:

public bool IsTempTooHigh { get { return Temperature >= MaxTemp; } }

或在C#6中:

public bool IsTempTooHigh => Temperature >= MaxTemp;

至於堆棧溢出,最簡單的是想象它們是方法:

public double GetValue()
{
    return GetValue();
}

public void SetValue(double value)
{
    SetValue(value);
}

你可以看到為什么叫這類原因會導致堆棧溢出? 嗯,屬性是一樣的-基本上,它們只是帶有一些元數據鏈接它們的方法。

第一個問題:是的,我認為您的更改使代碼更清晰。 如果需要不變性,則使用備用字段的有效情況是。 這些字段將變為只讀,並且您沒有設置器。

第二個問題:你的二傳手叫你的二傳手。 哪個叫您的二傳手。 哪個叫您的二傳手。 等等。 片刻之后,堆棧變得太大,您將收到錯誤消息。 :)

您可以輕松地在屬性內使用其他屬性,字段和方法。 完全不用擔心。

但是,您的第二個代碼塊會反復調用同一屬性。 您正在嘗試將自動實現的屬性與手寫的屬性混合使用。 這是不可能的。

或者 ,編譯器會為您生成后備字段(當您使用自動實現的屬性時), 或者您必須自己創建它們(手寫屬性)。

所以要么是這樣:

public double Value { get; set; }

要么:

private double _value;
public double Value
{
    get { return _value; }
    set { _value = value; }
}
  1. 在當前使用數據成員的私有成員函數中使用屬性名稱是安全無害的。

  2. 該代碼會引發StackOverFlow異常,因為通過將其賦給Value您實際上是在調用該屬性。 而是將基礎數據成員的名稱更改為_value

     public double Value { get { return _value; } set { _value = value; } } 

擁有一個可以評估其他2個屬性的屬性就可以了。 當然,您可以輕松地使用一種方法來完成相同的工作。 例如變化

public bool IsTempToHigh
{
    get
    {
        if (_temperature < _maxTemp)
            return true;
        else
            return false;
    }
}

public bool IsTempToHigh()
{
    return _temperature > _maxTemp;
}

(注意:假設正確,我已將您的<更改為>)

因為設置了對象本身,所以您的值會出現異常。 然后,這會更改其值,因此會嘗試再次進行設置。

所以這是錯誤的...

public double Value
{
    get { return Value; }
    set { Value = value; }
}

但是以下任何一個都可以

public double Value { get; set;}

要么

private double _myVal;

public double MyValue
{
    get{ return _myVal;}
    set{ _myVal = value;}

}

暫無
暫無

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

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