1

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

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

1 回答 1

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 跳闸。在下面的代码中,我们只在第一次调用时调用 DB,结果被缓存。这称为“记忆”。

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;
        }
    }
}

您可以使这变得更简单甚至更复杂,并且由于它在其自身的功能中是孤立的,因此您在其他地方几乎不需要做任何更改。

于 2013-09-24T23:13:00.000 回答