【问题标题】:Auto-properties: Checking/validating during the "set"自动属性:在“设置”期间检查/验证
【发布时间】:2010-07-20 22:52:59
【问题描述】:

我想我们都同意 C# 3.0 中的自动属性很棒。像这样的:

private string name;
public string Name
{
    get { return name; }
    set { name = value; }
}

简化为:

public string Name { get; set; }

可爱!

但是,如果我想在“设置”时使用 ToUpperInvariant() 方法转换名称字符串,我该怎么办。我需要恢复到旧的 C# 2.0 创建属性的风格吗?

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value.ToUpperInvariant(); }
    }

或者有没有更优雅的方式来实现这一点?

【问题讨论】:

  • 恐怕你被 C# 2.0 的方式卡住了。
  • 我认为改变值使得外部调用者不会得到与设置相同的值是“副作用”并且不可取(即:string s = "blah"; foo.Name = s; (foo.Name==s) 有时是错误的,这对你的类的消费者来说是意想不到的)你应该把它保留为自动属性并执行 ToUpperInvariant();当您需要在内部使用它时,或者提供一个仅包含执行 ToUpperInvariant() 的 getter 的私有属性。
  • @David:我的脑海里也闪过同样的想法。我仍然不确定我希望它以哪种方式运行。在我现在正在处理的特定情况下,我正在处理主要是数字的条形码,但其中包含 2 个字母字符。它们是大写还是小写并不重要,但如果它们一直都是大写的,那就太好了。所以我认为我对你描述的“副作用”没有意见。但总的来说,我想我会同意你的评价。感谢您的提示。

标签: c#-3.0 setter automatic-properties


【解决方案1】:

是的,您必须将其转换回来。自动属性无法进行此类检查。

【讨论】:

  • 感谢您的确认!我读过的关于自动属性的每一篇参考资料都没有提到过这个。一些文章和书籍的写作方式似乎暗示了这一点,但从未明确表示实际上是这样。再次感谢您证实了我的怀疑。
  • 看起来我给你的“绿色支票”让你升到了 10K。恭喜!你现在可以缓和了。 :D 请善待我们其他下属... :O
  • @Pretzel:谢谢,你是对的,这是你的“绿色检查”^^ 获得这 10K 的路还很长。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 2021-04-09
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多