通过属性重定向到其他类是否会导致速度变慢和/或节省 C# 中的空间?
c#c#-4.0
通过属性重定向到其他类是否会导致速度变慢和/或节省 C# 中的空间?, c#, c#-4.0, C#, C# 4.0,假设我有一个具有这些属性的克隆对象。根据从中加载克隆的文件,克隆可能具有不同的质量或名称,但这些值在运行时不会改变。但是,克隆出来的实例必须有一定的自主性,每个实例的属性都会发生变化,所以不可能都是同一个实例 public class Clone{public float Mass { get; 保护集;}公共字符串名称{得到; 保护集;}公共克隆(字符串文件Pa
假设我有一个具有这些属性的克隆对象。根据从中加载克隆的文件,克隆可能具有不同的质量或名称,但这些值在运行时不会改变。但是,克隆出来的实例必须有一定的自主性扣扣空间克隆器,每个实例的属性都会发生变化,所以不可能都是同一个实例
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 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;
}
}
公共类克隆信息
{
公众集会;
}
公共静态类数据库
{
公共静态字典查找;
[…从文件加载整个词典…]
}
公共类克隆
{
公共字符串名称{get;protected set;}
公共浮点质量{get{return Database.Lookup[Name].Mass;}
公共克隆(字符串名称)
{
名称=名称;
}
}
使用这种“重定向”方法,我保留了 Clone.Mass 的简单语法,但不必为每个实例存储 Mass 值。因为我周围有成千上万的克隆人漫游,这是一件好事。出于语法原因扣扣空间克隆器,我主要对“重定向”感兴趣。我意识到只要我想要特定克隆的质量,我就可以简单地手动执行数据库查找,但我宁愿让类保持良好且易于使用。这有什么缺点吗?这个属性会比在静态数据库中直接查找慢吗?该属性是否占用克隆实例中的任何空间
或者,这是用例 C 吗?已经有了我不知道的答案?在许多情况下很常见的一次性写入属性似乎就存在于这种美丽的语言中。
假设我们有很多方法来访问 Mass 属性。如果您试图在每次访问时从数据库加载大量值,这对应用程序来说可能是一项非常繁重的任务,并且会成为瓶颈。如果质量值可以缓存在对象中,您可以轻松地加载一次并保留以供进一步使用。
如果某种类型的所有克隆都具有相同的质量,这听起来像是一个子类化的工作:
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; } }
}
更有针对性:如果您受内存限制多于处理时间限制,则您的方法可能会带来一些好处。如果内存充足,并且缓存性能不是问题,那么您建议的方法可能没有多大价值。这显然使代码复杂化了很多
通常的建议是:编写简单的代码,衡量性能,如果性能不足,就修复性能瓶颈。这样,您只需在真正有助于提高应用程序性能的地方编写复杂的代码
另一个想法:而不是克隆索引
名称
串成字典,最好只使用克隆信息字段:
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;
}
}
内存目前对我来说是一个非常大的问题,我正在尝试重组代码,以便克隆占用更少的空间。但是,我认为子类化会导致代码更混乱。我们谈论的是这款游戏未来可能有数百种不同类型的克隆,每种克隆都有可能有数千个实例。@A-Type 好吧,我有另一个想法,可以节省内存使用和处理器时间。有关详细信息,请参阅编辑后的答案。哦,我喜欢它!因此,特定克隆的所有实例都引用相同的 cloneinfo 对象作为它们的常量属性。太完美了,尤其是今天我决定使用游泳池。有些克隆实际上比其他克隆有更多的属性,我打算将它们子类化,但由于对所有克隆实例的克隆信息的引用大小相同,但包含不同数量的属性,它' 非常适合泳池物品!感谢您的想法,我将接受您的想法和帮助。数据库本质上是一个缓存。它不会在每次查找属性时都从文件中加载,只是第一次。所以 I/O 瓶颈应该不是问题,如果这就是您所说的。我缓存在静态类而不是实例中。