我已经尝试了两天谷歌搜索,但似乎无法找到答案。
我希望Category类根据输入的id提供描述,如果id无效则返回错误。这是最好的方法吗?
public class Category
{
private int _id;
private string _desc;
public Category(int id)
{
ID = id;
}
public int ID
{
get
{
return _id;
}
set
{
_id = value;
//_desc = value from data access layer or throw error if the ID is invalid
}
}
public string Description
{
get
{
return _desc;
}
}
}
public class Person
{
public int ID {get; set;}
public Category Category {get; set;}
}
public class MyApp
{
static void Main()
{
Person p = new Person();
Category c = new Category(2);
p.Category = c;
}
}
答案 0 :(得分:2)
由于可能存在类Category的几个实例,因此在类本身中包含查找值将是一种浪费内存。相反,他们应该在别处访问。例如,另一个类中的静态函数。
public class CategoryHelper
{
public static string GetCategoryDesc(int CatgeoryId)
{
...access database to get description
}
}
我们可以在Category类的Description getter中使用它:
public string Description
{
get
{
return CategoryHelper.GetCategoryDesc(this.ID);
}
}
现在,由于我们将GetCategoryDesc放在一个单独的类中,我们现在可以优化它以提高性能。例如,如果您非常确定查找的值在运行期间不会更改,则可以将描述缓存在内存中以避免数据库跳闸。在下面的代码中,我们只在第一次调用时调用DB并缓存结果。这被称为“memoization”。
public class CategoryHelper
{
Dictionary<int,string> cachedDesc; //Dictionary used to store the descriptions
public static string GetCategoryDesc(int CatgeoryId)
{
if (cachedDesc==null) cachedDesc = new Dictionary<int,string>(); // Instatiate the dictionary the first time only
if(cachedDesc.ContainsKey(CatgeoryId)) //We check to see if we have cached this value before
{
return cachedDesc[CatgeoryId];
}
else
{
var description = .... get value from DB
cachedDesc.add(CatgeoryId, description); //Store the value for later use
return description;
}
}
}
你可以使这更简单,更复杂,因为它在自己的功能中是孤立的,你将不得不做其他地方的改变。