【问题标题】:Why isn't the property conditional working?为什么属性条件不起作用?
【发布时间】:2021-04-27 01:41:33
【问题描述】:

我已经编程了很短的时间,所以如果这是错误的提问方式,或者我使用的术语不正确,我深表歉意。

我正在使用类及其组件,但似乎无法获得有条件的属性才能工作。它是 Employee 类中的 MonthlySalary 属性。它应该防止小于 0 的值返回,但它不起作用并允许显示负值。

我还包含了使用该类的主要方法,因为我不确定这是否是问题的一部分。

感谢您的宝贵时间,我们将不胜感激。

 class Employee
   {
      private decimal _monthlySalary; //// private field

      public string FirstName { get; set; }   //public field  using auto constructor 
      public string LastName { get; set; }    // public field using auto constructor

      public Employee(string firstName, string lastName, decimal monthlySalary)  // Constructor
      {
         FirstName = firstName;
         LastName = lastName;
         _monthlySalary = monthlySalary;
      }


      public decimal MonthlySalary //property
      {
         get { return _monthlySalary; }

         set
         {
            if (value > 0.0m)
            {
               _monthlySalary = value;
            }

            else
            {
               _monthlySalary = 0.0m;
            }
         }
      }

      public decimal YearlySalary() //method
      {
       return MonthlySalary * 12;
      }


      public decimal Raise() //method
      {
         return YearlySalary() * 1.10m;
      }

   }
}
   class EmployeeTest
   {
      static void Main(string[] args)
      {

         
         string firstName, lastName;
         decimal monthlySalary;

         
         Console.WriteLine("Enter Employee's first name: ");
         firstName = Console.ReadLine();

         Console.WriteLine("Enter Employee's last name: ");
         lastName = Console.ReadLine();

         Console.WriteLine($"Enter monthly salary for employee {firstName} {lastName}");
         monthlySalary = decimal.Parse(Console.ReadLine());

         Employee one = new Employee(firstName, lastName, monthlySalary);
         
         Console.WriteLine("Employee Name: {0} {1}", one.FirstName, one.LastName);
         Console.WriteLine("Employee monthly salary: {0:C}", one.MonthlySalary);
         Console.WriteLine("Employee annual salary: {0:C}", one.YearlySalary());
         Console.WriteLine("Yearly Salary after raise: {0:C}", one.Raise());

         Console.WriteLine("Enter Employee's first name: ");
         firstName = Console.ReadLine();

         Console.WriteLine("Enter Employee's last name: ");
         lastName = Console.ReadLine();

         Console.WriteLine($"Enter monthly salary for employee {firstName} {lastName}");
         monthlySalary = decimal.Parse(Console.ReadLine());

         Employee two = new Employee(firstName, lastName, monthlySalary); 

         Console.WriteLine("Employee Name: {0} {1}", two.FirstName, two.LastName);
         Console.WriteLine("Employee monthly salary: {0:C}", two.MonthlySalary);
         Console.WriteLine("Employee annual salary: {0:C}", two.YearlySalary());
         Console.WriteLine("Yearly salary after raise: {0:C}", two.Raise());
      }
   }
}

【问题讨论】:

  • 更改:_monthlySalary =monthlySalary;到 MonthlySalary = 月薪;
  • 您需要在构造函数中写入MonthlySalary = monthlySalary;,否则不会调用setter,因此当您通过此处传递参数创建新实例时直接分配该字段而无需任何控制/验证:new Employee(firstName, lastName, --> monthlySalary <--);

标签: c# properties conditional-statements


【解决方案1】:

您不会在 Employee 的构造函数中执行任何验证逻辑。你可能想要

public Employee(string firstName, string lastName, decimal monthlySalary)  // Constructor
  {
     FirstName = firstName;
     LastName = lastName;
     MonthlySalary = monthlySalary;
  }

另一个提示是你可以使用

_monthlySalary = Math.Max(0.0m, value);

这只是确保薪水始终为正的一种更紧凑的方式。

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 2017-02-16
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多