【问题标题】:C# do something before setting variable [duplicate]C#在设置变量之前做一些事情[重复]
【发布时间】:2021-11-09 07:36:28
【问题描述】:

我在一个类中有某些类变量,我想在设置它们时做一些事情(检查有效,用空格填充等)。我以前从未使用过 get set,我想知道使用这些方法是否正确,但出现堆栈溢出错误。

    public string DELIVERY_DATE
    {
        get { return DELIVERY_DATE; }
        set 
        {
            DELIVERY_DATE = checkDate(value, "yyyyMMdd");
        }
    }

【问题讨论】:

  • DELIVERY_DATE 是一个属性。您需要在 setter 和 getter 中使用支持字段(即变量)。参考this
  • 您在变量的 setter 中设置变量,导致无限递归...为值使用单独的 var。
  • 另外,您应该真正使用标准 C# 命名约定。供您欣赏docs.microsoft.com/en-us/dotnet/csharp/fundamentals/…
  • Setter 和 getter 只是编译器生成的方法,你可以在其中做任何你喜欢的事情,理想情况下你不想做任何繁重的(或异步工作),但是一个小的验证或突变很好。至于这些线在哪里以及有多少验证(例如投掷)是最佳实践,这是自以为是的。

标签: c#


【解决方案1】:

你在这里有一个递归。交货日期自称。试试这个

private string _DELIVERY_DATE
public string DELIVERY_DATE
   {
       get { return _DELIVERY_DATE; }
       set 
       {
           _DELIVERY_DATE = checkDate(value, "yyyyMMdd");
       }
   }

【讨论】:

  • 这是在设置变量之前做一些常规的好方法吗?
  • @bakalolo 是的,通常它用于验证。代码应该尽可能接近它验证的数据。这是最封闭的。例如,您可以检查交货日期是否应该在未来(或过去)并将其修复或设置为 null 或将其设置为错误(因为它是一个字符串)。
【解决方案2】:

属性是执行此操作的有效方法。但是你使用不当:

class myClass {

   // here will be stored the value
   private string deliveryDate;
   public string DELIVERY_DATE
   {
      // this "method" will be called 
      // when e.g. x = thisClass.DELIVERY_DATE line executed
      get 
      { 
         return deliveryDate; 
      }
      // this "method" will be called 
      // when e.g. thisclass.DELIVERY_DATE = "20211108" executed
      set 
      {
         deliveryDate = checkDate(value, "yyyyMMdd");
      }
   }

}

这里是 MS 文档:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多