想要在某些变量之间进行关联时的最佳实践

时间:2017-09-20 16:57:23

标签: c#

我在这里发布这个问题而不是软件工程SE,因为它听起来像一个会引起更多技术答案的问题。我之所以这样问是因为我经常担心,正如我编码一样,我正在以正确的方式做到这一点(换句话说,我的编码技术是健康的)。

简单地说,这是我在编写代码方法中的某些值之间实现相关性时编写的策略(请参阅示例以了解我的意思):

1)使用字典:

class Example
{
    private static Dictionary<Type, string> _types = new Dictionary<Type, string>()
    {
        { typeof(string), "string" },
        { typeof(Int32), "Int32" },
        { typeof(float), "float" }
    };

    public static string RetrieveTypeString(Type type)
    {
        return _types[type];
    }
}

这里我通常会使用一个可供整个类访问的字典(我不喜欢在一个方法范围内声明一个预先知道值的字典的想法,这个方法将被多次调用)。我喜欢这种非常简洁和性能友好的方法。

2)创建一个类来映射类型并循环实例:

    public class TypeInfo
    {
        public TypeInfo(Type type, string name)
        {
            Type = type;
            Name = name;
        }

        public Type Type { get; set; }
        public string Name { get; set; }
    }

    class Example
    {
        List<TypeInfo> _lst = new List<TypeInfo>();

        public void SomeMethod()
        {
            _lst.Add(new TypeInfo(typeof(string), "string"));
            _lst.Add(new TypeInfo(typeof(Int32), "Int32"));
            _lst.Add(new TypeInfo(typeof(float), "float"));
        }

        public string RetrieveTypeString(Type type)
        {
            foreach (TypeInfo t in _lst)
            {
                if (t.Type == type)
                {
                    return t.Name;
                }
            }

            throw new Exception();
        }
    }
}

每当我处理一对多的关系时,我喜欢使用它,具有许多特征。它有一个缺点,我需要在运行时实际创建实例,并在应用程序加载时将它们存储在某处以便以后检索它们。

3)使用带有switch语句的方法:

class Example
{
    public string RetrieveTypeString(Type type)
    {
        switch (Type.GetTypeCode(type))
        {
            case TypeCode.String:
                return "string";

            case TypeCode.Int32:
                return "Int32";

            case TypeCode.Double:
                return "double";

            default:
                throw new Exception();
        }
    }
}

根据它可以变得非常大的物品数量,所以我通常会避免这样做,但它对于小套装很有用。

4)其他方法,例如使用替代集合而不是字典。

  • 我的任何方法都是不良做法吗?
  • 是否有更好的替代方法可以避免在不使用外部存储的情况下在运行时填充内容?

建议非常赞赏!

谢谢!

编辑:我注意到这个问题可以根据上下文有不同的回答,这里有一种情况我不知道哪种方法最好:我写了一些代码,当一个TextBox或另一个控件时标记有验证错误,错误消息和其他图形元素根据特定控件的某些设置显示,这意味着我必须将控件与其设置相关联。我解决了这个问题,创建了一个类,它将我想要关联的所有东西重新组合到控件(我定义的设置),并创建一个类级别字典变量来将我的类与控件相关联。我还创建了第二个类级别字典,将其中一个设置与另一个将错误消息分组的类相关联(我希望每个类实例有多个错误消息)。这种方法是否可以接受,或者不推荐?

1 个答案:

答案 0 :(得分:1)

对我来说,所有这些看起来都很合理。

我不会使用选项2的列表 - 您不关心订单或重复项,因此一组可能是更好的选择。我对C#一无所知,但我认为查找也更快。

我总是优先考虑可读性,所以我可能最初选择了一个switch语句。在我看来,这是格式化它的最佳方式:

switch (Type.GetTypeCode(type))
{
    case TypeCode.String: return "string";
    case TypeCode.Int32:  return "Int32";
    case TypeCode.Double: return "double";

    default:
        throw new Exception();
}

如果这是性能瓶颈,我会将其切换为一组或一张地图。