【问题标题】:How do I set a default value that is invalidated by property setter checking?如何设置被属性设置器检查无效的默认值?
【发布时间】:2015-01-21 19:47:41
【问题描述】:

我有两个具有匹配属性的字段,每个字段都在 setter 中进行数据验证。我希望默认值明显不正确。因此,我默认将它们初始化为'\0'-1

private char _zoneLetter = '\0';
private short _zoneNumber = -1;

这是为了让这些值可能存在的唯一方式是如果它们从未被设置,因为我在设置器中抛出了一个异常。

public char ZoneLetter
{
    get { return _zoneLetter; }
    private set
    {
        if (!char.IsLetter(value)) throw new ArgumentException("No special characters are allowed.");
        _zoneLetter = value;
    }
}

public short ZoneNumber
{
    get { return _zoneNumber; }
    private set
    {
        if (!Enumerable.Range(1, 60).Contains(value)) throw new ArgumentException("Must be an integral value in the range [1,60].");
        this._zoneNumber = value;
    }
}

麻烦的是,当我输入完全有效的数据时,仍然抛出异常,告诉我'\0'的值不正确,即使在构造函数参数中输入了'a'

public UtmEvent(double unixTime, double easting, double northing, short zoneNumber, char zoneLetter)
    : base(unixTime)
{
    this.Easting = easting;
    this.Northing = northing;
    this.ZoneNumber = zoneNumber;
    this.ZoneLetter = ZoneLetter;
}

当我将默认值更改为有效值(例如 'a'30)时,我的测试检查是否没有抛出异常通过。请告诉我我错过了什么。我是 .Net 新手,不知道发生了什么,哈哈。

【问题讨论】:

  • 语法高亮有点泄露了它。像 Resharper 这样的东西也可以告诉你你有一个未使用的参数。我想编译器或 vanilla IDE 也可以。
  • 更具体地说,请仔细查看this.ZoneLetter = ZoneLetter;这一行
  • 不相关的注释:最小的样本可能会有所帮助......但它会扼杀提问的需要......所以感谢您提出具有所有必要细节的可读问题,但为了将来尝试提供最小可能示例(即使在创建一个您解决问题的过程中)。
  • 天哪,那是愚蠢的错误。出于某种原因,即使在构建期间,VS 也没有告诉我有关未使用参数的任何信息。无论如何,我想我可以选择一个更好的参数名称来防止这样的事情发生。谢谢
  • VS 在您编写代码时没有这些功能,但是如果您运行 Code Analysis 它会告诉您。您需要获得像 Resharper 这样的第 3 方工具,以便在您编码时实时告诉您(您还可以告诉 Code Analysis 在每次构建后运行 in the project settings)。

标签: c# exception argumentexception


【解决方案1】:

你有一个大写错误,

this.ZoneLetter = ZoneLetter;

应该是

this.ZoneLetter = zoneLetter;

【讨论】:

    【解决方案2】:

    我的眼睛错过了构造函数中的this.ZoneLetter = ZoneLetter; 行。我试图将属性分配给自身,导致 getter 获取默认值 '\0' 并将其反馈回 setter 的验证条件。让这成为一个教训,表明不选择糟糕的参数名称的重要性。 Note to self: should not be the exact same as property or field names, with only the capitalization differing.

    哦,羞辱。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多