【问题标题】:Using a KeyValuePair<> as Property vs. Separate Class vs. something else使用 KeyValuePair<> 作为属性与单独的类与其他东西
【发布时间】:2012-02-20 17:01:41
【问题描述】:

在我的“业务对象”中显示“管理表”的正确方法是什么?我的地址对象上有以下内容。

public class Address
{
    public int AddressID { get; set; }
    public KeyValuePair<short, string> County { get; set; }
    ...
}

现在我将如何实例化这个对象,就KeyValuePair&lt;,&gt; 属性而言?

我的猜测是:

var myAddress = new Address { AddressID = 3, County = new KeyValuePair<short, string>(32, "La Crosse")}

编辑

这是我根据另一位程序员的建议用KeyValuePair&lt;&gt; 替换的内容。

.....Address.cs..... 
public County County { get; set; }

.....County.cs.....
public class County
{
    public short? CountyID { get; set; }

    public string CountyName { get; set; }
}

在这两种方法之间有更好的方法还是第三种更好的方法?

【问题讨论】:

  • KVP 的值是否来自数据库?是否可以将它们提取为枚举类型,以便您的幻数/字符不那么神奇?
  • 我建议不要在这种情况下使用KeyValuePair;开发人员无法清楚地看到 KeyValue 实际上是什么(KeyCounty 是什么?。创建具有适当属性名称的自己的类型,以使您和同事的生活更轻松。
  • 我已经删除了不相关的成员。如果您不同意,请回复。
  • 您的代码有效。那你的问题是什么?
  • @Lukazoid:请查看我的编辑,让我知道这是否更有意义或者您的陈述是否仍然成立。

标签: c# object-initializers


【解决方案1】:

KeyValuePair&lt;T1, T2&gt; 在这种情况下不会给你买任何东西。

为什么不直接说清楚?

public class Address
{
    public int AddressID { get; set; }
    public int CountyCode { get; set; }
    public string CountyName { get; set; }
}

或者另一个版本是你定义一个类型County 与这两个属性,然后有一个该类型的属性来代替。

在代码中,清晰为王。

【讨论】:

    【解决方案2】:

    我刚刚运行了您的代码,它按预期运行。

    country 属性具有正确的值 Key = 32Value = La Crosse


    你的新代码很难看。我要么删除 Country 属性的设置器,要么使 Country 类不可变。这种双重可变性,是一个等待发生的错误。

    使Country 类不可变,这可能是正确的决定,因为Id=>Name 映射是固定的。

    我会使用:

    public class County
    {
        public short? ID { get; private set; }
        public string Name { get; private set; }
    
        private Country(short? id,string name)
        {
          ID=id;
          Name=name;
        }
    }
    

    【讨论】:

    • 那么County的名称是否需要更改?这是一个非常可能的可能性。创建一个新的County 感觉不对,因为它需要实际更新现有的。我很想听听您对此的处理方法。
    • 大多数时候您不需要在运行时更改国家/地区名称,只需在加载时更改一次。这不像国家一直在改变名称。但即使你这样做了,更改也应该只发生在 Country 类本身内部,而不是通过刚刚使用国家/地区的地方发生。例如,通过加载新的国家/地区定义文件。
    【解决方案3】:

    Lukazoid 给出了一个很好的提示,为什么不这样做,实际上,总线,您显示的初始化会很好地工作。您可以使用调试器轻松证明这一点。什么问题?

    【讨论】:

      【解决方案4】:

      创建一个 Country 对象,以便清楚该短字符串应该代表什么。

      【讨论】:

        猜你喜欢
        • 2014-02-27
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多