通过属性重定向到其他类是否会导致 C# 速度变慢和/或节省空间

本文关键字:速度 空间 节省 重定向 属性 其他 是否 | 更新日期: 2023-09-27 18:36:45

假设我有一个具有这些属性的克隆对象。根据加载克隆的文件,克隆可能具有不同的质量或名称,但这些值在运行时永远不会更改。但是,克隆实例具有一些自治和属性,这些自治和属性确实会因实例而异,因此它们不能都是同一个实例。

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# 已经有一个我不知道的答案?似乎在许多实例中常见的一次性写入属性可能位于这种美丽语言的某个地方。

通过属性重定向到其他类是否会导致 C# 速度变慢和/或节省空间

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

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

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