何时/何时填充查找值?

时间:2013-09-24 22:53:18

标签: c# oop

我已经尝试了两天谷歌搜索,但似乎无法找到答案。

我希望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;
    }
}

1 个答案:

答案 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);
    }       
}

现在,由于我们将GetCategoryDe​​sc放在一个单独的类中,我们现在可以优化它以提高性能。例如,如果您非常确定查找的值在运行期间不会更改,则可以将描述缓存在内存中以避免数据库跳闸。在下面的代码中,我们只在第一次调用时调用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;
        }
    }
}

你可以使这更简单,更复杂,因为它在自己的功能中是孤立的,你将不得不做其他地方的改变。