.net 在属性设置器中添加日志语句可以吗?

bz4sfanl  于 2023-04-22  发布在  .NET
关注(0)|答案(2)|浏览(127)

我有一个类,它有一个属性,该属性不应该包含超过某个最大值的值。

public abstract class MyBaseClass
{
    private int adjustedInt;

    public int NotGreaterThanFifty
    {
        get => this.adjustedInt;
        set
        {
            this.adjustedInt = value < 50 ? value : 50;
        }
    }
}

我们希望记录所有试图为属性分配大于50的值的示例。我在一个业务类中添加了一个为该属性分配值的日志。这涵盖了大多数情况。但很少有可以设置相同属性的罕见示例。我收到反馈,询问为什么不在属性设置器中添加日志。
在setter中有一个log语句听起来很奇怪,这是一个好的实践吗?

igetnqfo

igetnqfo1#

不是没听说过,我以前见过。
在我看来,如果你的类已经把logger作为一个依赖项,那么这种事情没有什么错。毕竟,公开一个属性而不仅仅是一个字段的一个要点是在设置(或者在一些奇怪的情况下,甚至在获取)底层值时允许逻辑。如果你想跟踪这个逻辑,在你的属性设置器中使用logger是有道理的。
但是,如果这是您的类使用日志记录器的唯一原因,我会考虑将该属性作为公共get/私有set属性,并使用一个方法来设置它,该方法可以返回所设置的值的指示,甚至可以返回一些消息,说明发生了什么问题-类似于

public abstract class MyBaseClass
{
      public int NotGreaterThanFifty { get; private set; }

      public string TrySetNotGreaterThanFifty(int value)
      {
          var result = "";
          if(value > 50) {
              result = "Can't set value to more than 50";
              value = 50;
          }
          NotGreaterThanFifty = value;
          return result;
      }
}
voj3qocg

voj3qocg2#

下面是我在一个情况下会做的事情,我现在不知道所有的示例,其中属性被试图分配一个大于50的值。
我将引入第二个属性NotGreaterThanFiftySave,并逐个检查所有对NotGreaterThanFifty的引用。如果我确认该值是合法的,我会让他们调用NotGreaterThanFiftySave。
这样,NotGreaterThanFifty上的调用者就更少了

private int adjustedInt;

  [Obsolete("Callers have to be checked")]
  public int NotGreaterThanFifty
  {
        get => this.adjustedInt;
        set
        {
            Log.Error("invalid caller");
            this.adjustedInt = value < 50 ? value : 50;
        }

  }

  private int adjustedIntSave;

  public int NotGreaterThanFiftySave
  {
     get => this.adjustedInt;
     set
     {
        this.adjustedIntSave = value < 50 ? value : 50;
     }

  }

当你完成后,你可以删除NotGreaterThanFiftySave并检查所有调用者。

相关问题