private static double _currInterestRate = 0.04;

  // Статическое свойство.

  public static double InterestRate

  {

    get { return _currInterestRate; }

    set { _currInterestRate = value; }

  }

  ...

}

Если вы хотите использовать свойство InterestRate вместо предыдущих статических методов, тогда можете модифицировать свой код следующим образом:

// Вывести текущую процентную ставку через свойство.

Console.WriteLine("Interest Rate is: {0}", SavingsAccount.InterestRate);

<p id="AutBody_Root240">Сопоставление с образцом и шаблоны свойств (нововведение в версии 8.0)</p>

Шаблон свойств позволяет сопоставлять со свойствами объекта. В качестве примера добавьте к проекту новый файл (EmployeePayTypeEnum.cs) и определите в нем перечисление для типов оплаты сотрудников:

namespace EmployeeApp

{

    public enum EmployeePayTypeEnum

    {

        Hourly,     // почасовая оплата

        Salaried,   // оклад

        Commission  // комиссионное вознаграждение

    }

}

Обновите класс Employee, добавив свойство для типа оплаты и инициализировав его в конструкторе. Ниже показаны изменения, которые понадобится внести в код:

private EmployeePayTypeEnum _payType;

public EmployeePayTypeEnum PayType

{

  get => _payType;

  set => _payType = value;

}

public Employee(string name, int id, float pay, string empSsn)

  : this(name,0,id,pay, empSsn, EmployeePayTypeEnum.Salaried)

{

}

public Employee(string name, int age, int id,

  float pay, string empSsn, EmployeePayTypeEnum payType)

{

  Name = name;

  Id = id;

  Age = age;

  Pay = pay;

  SocialSecurityNumber = empSsn;

  PayType = payType;

}

Теперь, когда все элементы на месте, метод GiveBonus() можно обновить на основе типа оплаты сотрудника. Сотрудники с комиссионным вознаграждением получают премию 10%, с почасовой оплатой — 40-часовой эквивалент соответствующей премии, а с окладом — введенную сумму. Вот модифицированный код метода GiveBonus():

public void GiveBonus(float amount)

{

  Pay = this switch

  {

    {PayType: EmployeePayTypeEnum.Commission }

      => Pay += .10F * amount,

    {PayType: EmployeePayTypeEnum.Hourly }

      => Pay += 40F * amount/2080F,

    {PayType: EmployeePayTypeEnum.Salaried }

      => Pay += amount,

    _ => Pay+=0

  };

}

Как и с другими операторами switch, в которых используется сопоставление с образцом, должен быть предусмотрен общий оператор case или же оператор switch обязан генерировать исключение, если ни один из операторов case не был удовлетворен.

Чтобы протестировать внесенные обновления, добавьте к операторам верхнего уровня следующий код:

Employee emp = new Employee("Marvin",45,123,1000,"111-11-1111",

                             EmployeePayTypeEnum.Salaried);

Console.WriteLine(emp.Pay);

emp.GiveBonus(100);

Console.WriteLine(emp.Pay);

<p id="AutBody_Root241">Понятие автоматических свойств</p>

При создании свойств для инкапсуляции данных часто обнаруживается, что области set содержат код для применения бизнес-правил программы. Тем не менее, в некоторых случаях нужна только простая логика извлечения или установки значения. В результате получается большой объем кода следующего вида:

// Тип Car, использующий стандартный синтаксис свойств.

class Car

{

   private string carName = "";

   public string PetName

   {

     get { return carName; }

     set { carName = value; }

   }

}

В подобных случаях многократное определение закрытых поддерживающих полей и простых свойств может стать слишком громоздким. Например, при построении класса, которому нужны девять закрытых элементов данных, в итоге получаются девять связанных с ними свойств, которые представляют собой не более чем тонкие оболочки для служб инкапсуляции.

Перейти на страницу:

Похожие книги