【问题标题】:Get/Set as different types获取/设置为不同的类型
【发布时间】:2011-03-22 19:27:55
【问题描述】:

我想定义一个变量,该变量将接受 SET 中的字符串,然后将其转换为 Int32 并在 GET 期间使用它。

这里是我目前拥有的代码:

private Int32 _currentPage;

public String currentPage
{
   get { return _currentPage; }
   set 
   {
      _currentPage = (string.IsNullOrEmpty(value)) ? 1 : Convert.ToInt32(value);
   }
}

【问题讨论】:

    标签: c# .net properties


    【解决方案1】:

    我建议使用明确的Set 方法:

    private int _currentPage;
    
    public int CurrentPage
    {
        get
        {
            return _currentPage;
        }
    }
    
    public void SetCurrentPage(string value)
    {
            _currentPage = (string.IsNullOrEmpty(value)) ? 1 : Convert.ToInt32(value);
    }
    

    附带说明一下,您的 parse 方法可能会做得更好:

    if (!int.TryParse(value, out _currentPage)
    {
        _currentPage = 1;
    }
    

    这样可以避免格式异常。

    【讨论】:

    • 一个返回 int 的字符串属性。
    • 为什么你会有一个谨慎的设置方法,它接受一个与被设置的属性类型相同的参数?他问题中的例子更有意义。在 setter 中包含代码并没有错。如果您的方法采用不同类型的参数(例如 int),那么将其与 setter 分开是有意义的。
    • @Tangled2 - 这很有意义。唯一的其他选择是使用无论如何都需要约束的对象。此选项允许完整的编译时类型安全。
    • @John Gietzen:那么您的示例中的 CurrentPage 属性可能是 Int,而不是 String。
    • @John Gietzen:我看到了你的忍者编辑。 ;) 现在已经修复了,忽略我之前的 cmets。
    【解决方案2】:

    请注意,对不同类型使用属性 get 和 set 确实是个坏主意。 可能有几个方法会更有意义,而传递任何其他类型只会打击提升这个属性。

    public object PropName
    {
        get{ return field; }
        set{ field = int.Parse(value);            
    }
    

    【讨论】:

      【解决方案3】:

      你所拥有的就是它需要的样子。没有您想要的自动转化。

      【讨论】:

      • 好吧,我认为他可能想要处理集合中的无效(非空)数据,但他也可能有充分的理由不这样做。
      【解决方案4】:

      使用神奇的 get 和 set 块,您别无选择,只能使用返回的相同类型。在我看来,更好的处理方法是让调用代码进行转换并将类型设为 Int。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 2018-10-11
        • 1970-01-01
        相关资源
        最近更新 更多