在您的公共接口中,通常应尽可能地暴露一个抽象类型,以有用地满足您的用户需求(即使您的“用户”是您自己的代码)。
您应该为这些通用类型分配良好的默认值,以便在您的代码中尽快开始使用它们,而不必每次都创建和分配具体类型。
例如:
public class Something
{
public Something()
{
this.Map = new Dictionary<string, string>();
}
public IDictionary<string, string> Map { get; set; }
}
这使得类的使用者或实现者可以在不破坏现有代码的情况下切换到新的字典类型,但也不需要每次使用时编写此代码:
var something = new Something()
something.Map = new Dictionary<string, string>()
他们可以直接开始使用它:
var something = new Something()
something.Map["test"] = "some value"
其他类型的示例:
public IEnumerable<string> ValuesReadOnly { get; private set; }
public IEnumerable<string> ValuesReadWrite { get; set; }
public IList<string> ValuesRandomReadWrite { get; set; }
做到这一点的一个好理由是,这样你就可以在未来插入任何类型,而无需先将其转换为您定义的特定类型。最污染代码的事情莫过于不得不进行各种类型之间的转换。
例如,我在使用Linq时经常使用。如果我的公共成员是,那么在分配值之前,我总是需要将值转换为列表,这不仅使我的代码变得臃肿,而且还会影响性能。您必须在内存中再次复制列表结构,并且无法利用懒惰评估序列/ yield return等功能。
这是一个例子:
public class Something2
{
public IEnumerable<string> SomeValues { get; set; }
}
var dbQuery = BuildQuery("select item from inventory where item.Price > 5.00");
var something = new Something();
something.SomeValues = dbQuery.Evaluate();
改为:
public class Something2
{
public List<string> SomeValues { get; set; }
}
var dbQuery = BuildQuery("select item from inventory where item.Price > 5.00");
var something = new Something();
something.SomeValues = dbQuery.Evaluate().ToList();