【问题标题】:Set Property based another property基于另一个属性设置属性
【发布时间】:2015-02-27 12:25:26
【问题描述】:

如果有用户数组,那么 SuperUserCount 应该是用户计数的总和,否则它应该有自己的值

 class MyUser
 {
 public int SuperUserCount { get; set; }

 private User[] users;
 public User[] Users
 {
  get { return users;}
  set
   {
    users= value;
    if(value!=null)
     {
      SuperUserCount  = value.Sum(user => user.count);
     }
   }
 }
 }

我编写了上面的代码来获取用户计数的总和。 尚未测试

但是,当填充 MyUser 对象时,如何确保 SuperUserCount 自己的值不会覆盖用户 get{} 中设置的 SuperUserCount 值,反之亦然

【问题讨论】:

  • 投反对票的原因?
  • _"...我如何确保 SuperUserCount 自己的值不会覆盖...":只是不要将值保存到 SuperUserCount 中。将它的支持字段更改为 int?如果它为空,它的getter可以直接计算值(假设性能不是问题)。反之亦然?好吧,定义如果你有用户并且你设置了 SuperUserCount 应该发生什么......
  • 你在问什么?您有一个公共设置器,但不希望写入该属性?如果你想设置一个初始值但稍后覆盖它然后防止覆盖,只需添加一个标志。不过我会重新考虑这个设计 - 很明显,这个班级正试图同时做两件事
  • @AdrianoRepetti 只有当用户为空时才应该写入公共属性
  • 所以写下你的 setter 的正文。 int SuperUserCount { get { return Users != null ? Users.Sum(x => x.count) : _superUserCount; } set { if (Users != null) throw new InvalidOperationException(); _superUserCount = value; } }。在您的Users 设置器中,您还可以检查是否在Users 之前设置了SuperUserCount 属性(以简单地覆盖原始值或在不允许时抛出异常)。当然,在Users 中,您直接设置_superUserCount 而不是SuperUserCount(对不起,注释中的代码格式错误)。

标签: c# properties


【解决方案1】:

您可以将 setter 设为私有,防止其被覆盖。

public int SuperUserCount { get; private set; }

如果您需要为拥有null 用户的MyUser 对象设置不同的值,请为此添加专门的方法。

public Boolean RequestOverrideSuperUserCount(int count)
{
    Boolean overrideAllowed = (null == users);
    if(overrideAllowed)
        SuperUserCount = count;
    return overrideAllowed;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 2016-07-21
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多