我在这里发布这个问题而不是软件工程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或另一个控件时标记有验证错误,错误消息和其他图形元素根据特定控件的某些设置显示,这意味着我必须将控件与其设置相关联。我解决了这个问题,创建了一个类,它将我想要关联的所有东西重新组合到控件(我定义的设置),并创建一个类级别字典变量来将我的类与控件相关联。我还创建了第二个类级别字典,将其中一个设置与另一个将错误消息分组的类相关联(我希望每个类实例有多个错误消息)。这种方法是否可以接受,或者不推荐?
答案 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();
}
如果这是性能瓶颈,我会将其切换为一组或一张地图。