0

因此,假设我有一个具有这些属性的 Clone 对象。克隆可能具有不同的质量或名称,具体取决于加载它的文件,但这些值在运行时永远不会改变。但是,克隆实例具有一些自主权和属性,每个实例都会发生变化,因此它们不能都是同一个实例。

public class Clone
{
    public float Mass { get; protected set; }
    public string Name { get; protected set; }
    public Clone(string filePath)
    {
        Name = //read name from file
        Mass = //read mass from file
    }
}

现在,我想知道的是,这样做的好处和缺点(如果有的话)是什么:

public class CloneInfo
{
    public float Mass;
}
public static class Database
{
    public static Dictionary<string, CloneInfo> Lookup;
    [...load whole dictionary from files...]
}
public class Clone
{
    public string Name { get; protected set; }
    public float Mass { get { return Database.Lookup[Name].Mass; } }
    public Clone(string name)
    {
        Name = name;
    }
}

使用这种“重定向”方法,我保留了 Clone.Mass 的简单语法,但不必为每个实例存储一个 Mass 值。既然我有成千上万的克隆人四处游荡,这是一件好事。由于语法,我主要对“重定向”感兴趣。我意识到每次我想要一个特定克隆的质量时,我都可以简单地手动进行数据库查找,但我宁愿保持类的使用简单明了。这有什么缺点吗?该属性会比在静态数据库中直接查找要慢吗?该属性是否占用克隆实例中的任何空间?

或者,也许,这是一个用例 C# 已经有一个我不知道的答案?似乎在许多实例中常见的一次性写入属性可能在这种美丽的语言中的某个地方。

4

2 回答 2

1

如果某种类型的所有克隆都具有相同的质量,这听起来像是子类化的工作:

class Clone
{
    public abstract float Mass { get; }
}
class HeavyClone : Clone
{
    public override float Mass { get { return 12345.6; } }
}
class LightClone : Clone
{
    public override float Mass { get { return 1.23456; } }
}

更重要的是您的问题:如果您受内存的限制多于处理时间,那么您的方法可能会带来一些好处。如果内存充足,并且缓存性能不是问题,那么您建议的方法可能没有什么价值。当然,这似乎使代码变得相当复杂。

通常的建议是:编写简单的代码,测量性能,如果性能不足,解决性能瓶颈。这样一来,您只有在真正有助于提高应用程序性能的地方拥有复杂的代码。

另一个想法:与其将克隆索引与Name字符串一起放入字典中,不如只使用一个 CloneInfo 字段:

public class CloneInfo  
{  
    public float Mass;  
}  
public class Clone  
{  
    private CloneInfo _info;  
    public float Mass { get { return _info.Mass; } }  
    public Clone(CloneInfo info)  
    {  
        _info = info;
    }  
}  
于 2012-06-10T03:17:10.837 回答
0

假设我们有很多对 Mass 属性的访问。如果在每次访问中您都尝试从数据库中加载 Mass 值,那么这对您的应用程序来说可能是一项非常繁重的任务,这将是一个瓶颈。如果质量值可以缓存在对象中,您可以轻松加载它一次并保留它以供进一步使用。

于 2012-06-10T03:02:47.017 回答