2017-03-24 6 views
0

Cアクセサはかなり新しいもらいます。私は別のプロパティに基づいてプロパティを変更しようとしていますが、別のプロパティを設定することはできません。基本的に私はそれをそうしたいと思っています。の変更は、単に速記を使用せずにアクセサを使用する#

public int Salary { get; set; } 
public int Tax 
{ 
    get 
    { 
     if (Salary > 2000) 
     { 
      return Tax = 20; 
     } 
     else if (Salary > 1500) 
     { 
      return Tax = 10; 
     } 
     else 
     { 
      return Tax = 5; 
     } 
    } 
} 

しかし、私は、「プロパティCustomer.Taxは、それが読み取り専用であるように割り当てることができない」と私は問題を理解するというエラーを取得し、税プロパティ自体を変更することができるようにすることは可能ではありませんようにするため、しかし、私はそれを解決する方法を取得しません。

+1

「Tax」に何かを割り当てることはできませんが、「Tax」に値を代入しようとしているというエラーを解決する方法は理解できません。あなたがそれをすることができないことを知っているなら、あなたはそれをやっている、あなたはそれをしない必要があることを知っている... – Servy

答えて

4

Taxが読み取り専用である場合、それは(GetTax()のような)「古典的」方法と非常によく似ています

public int Tax 
{ 
    get 
    { 
     if (Salary > 2000) 
     { 
      return 20; 
     } 
     else if (Salary > 1500) 
     { 
      return 10; 
     } 
     else 
     { 
      return 5; 
     } 
    } 
} 

何の割り当てはありません...あなたはTaxを照会するたびに、その値が算出されます。

最後にプロパティは、2つのメソッド、getterとsetterを「まとめて」保持するためのトリックだけです...通常、これらの2つのメソッドは、バッキングフィールド(プロパティの値保存されます)。明らかにあなたのケースでは、バッキングフィールドを持たず、セッターを持っていません。常に再計算されるゲッターだけがあります。 (Javaのような)一部の言語では、この「トリック」を持っている、とgetFoo()setFoo()のように直接プロパティを使用し、完全によく住んでいません。

5

それはゲッターです。ゲッターの値は設定しないでください。値を設定するために使用した場合は、代わりにセッターになります。ゲッターはちょうど値を取得します。 Taxは「持っている」という値のみがゲッターによって返されるものは何でもあります。

public int Tax 
{ 
    get 
    { 
     if (Salary > 2000) 
     { 
      return 20; 
     } 
     else if (Salary > 1500) 
     { 
      return 10; 
     } 
     else 
     { 
      return 5; 
     } 
    } 
} 

おばあちゃんが車輪を持っていたら、彼女は列車になるだろう。あなたが "ゲッターの中に何も置かない"というルールを作るだけなら、あなたの人生の不確実性はかなり落ち着きます。

唯一の例外は一度だけ初期化する必要があり、高価なオブジェクトを返す読み取り専用プロパティのプライベートバッキングフィールドを初期化されます。

private ReadOnlyCollection<String> _states; 
public ReadOnlyCollection<String> States; { 
    get { 
     if (_states == null) { 
      _states = new ReadOnlyCollection(DB.GetStates().ToList()); 
     } 
     return _states; 
    } 
} 
0

ます。また、設定したときに税金を判定することにより、この問題を解決することができますSalaryプロパティを使用して、Taxプロパティのプライベートセッターを使用します。 これは、あなたが呼び出すたびに税金を再計算する必要はないことを意味します(これらの小さな数字は大したことではありませんが、プロジェクトによってはこれが有用になります)

public class PayCheck { 

    private double _salary = -1; 

    public double Salary { 
     get => _salary; 
     set { 
      _salary = value; 
      if (value > 2000) 
       Tax = 20; 
      else if (value > 1500) 
       Tax = 10; 
      else 
       Tax = 5; 
     } 
    } 

    public double Tax { get; private set; } 

} 
関連する問題