如何使用具有整体溢出(字节)的属性?



我对编程和C#相当陌生,我正在使用C# 9.0创建一个游戏,其中Entity的所有实例都有一定的统计数据。我希望能够使用属性更改其私有数据字段,尽管我不完全确定属性的工作原理。我知道它们在封装中作为吸气剂和二传手很有用。

背景

  • 我正在尝试优化代码并在可能的情况下减少内存使用
  • 字节字段str应该是可变的(通过事件、训练等),但具有"天花板"和"地板"
    • 如果dog.str= 253,则dog.Str += 5;应导致dog.str为 255
    • 如果dog.str= 2,则dog.Str -= 5;应导致dog.str为 0
private byte str;
public short Str
{
get => str;
set
{
if (value > byte.MaxValue) str = byte.MaxValue;       //Pos Overflow
else if (value < byte.MinValue) str = byte.MinValue;  //Neg Overflow
else str = (byte)value;
}
}

问题

  • 由于该属性的数据类型为 Short,它是否会创建一个消耗内存的新私有支持字段?还是value/Str{set;}只是一个后来消失的局部变量?

    • 属性public float StrMod {get => (float)(str*Effects.Power);}创建支持字段吗?只创建像public float getStrMod()这样的方法会更好吗?
  • 此代码是否最适合我想要实现的目标?考虑到以下几点,有没有更好的方法来做到这一点?

    • 如果由于某种原因空头溢出(在这种情况下不太可能,但可能存在类似的情况),那么我最终会遇到同样的问题。但是,如果额外的内存分配不是问题,那么我可以使用 int。
    • {get;}将返回一个 Short,这可能是也可能不是问题。

问题 1:

不,它没有,它的支持领域是str.

问题2:

首先分析您的代码,而不是进行随机更改以减少内存使用。

"过早优化是万恶之源">,你真的有这样的问题吗?

就个人而言,为了简单起见,我会使用int并使用相同的类型用于属性和支持字段。

这将避免包装,例如分配32768,这将导致short-32768

旁注,不要认为使用byte必然会导致 1 个字节,如果您有严格的包装要求,那么您需要查看StructLayoutAttribute.Pack

除此之外,我认为您的代码没有任何问题,只需让它工作然后优化它!


这是我编写代码的方式,也许你会从中得到一些想法:

class Testing
{
private int _value;
public int Value
{
get => _value;
set => _value = Clamp(value, byte.MinValue, byte.MaxValue);
}
private static int Clamp(int value, int min, int max)
{
return Math.Max(min, Math.Min(max, value));
}
}
<小时 />

编辑:

不同的场景:

class Testing
{
private int _value1;
public int Value1 // backing field is _value1
{
get => _value1;
set => _value1 = value;
}
public int Value2 { get; set; } // adds a backing field
public int Value3 { get; } // adds a backing field
public int Value4 => 42; // no backing field
}

正如您可能已经猜到的那样,属性是方法的语法糖,与只能为其赋值的字段相比,它们可以在后台执行"任何操作"。

此外,方法的一个区别是您可以在调试器中浏览其值,这很方便。

推荐阅读:

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties

最后,属性应该快速返回,否则编写一个方法,如果需要一段时间,可能会async(在这种情况下,方法的优势,因为属性无法async)。

@aybe答案涵盖了有关您的问题的主要内容。我想为您的第二个问题添加更多信息。您应该考虑在哪个平台上编写应用程序。有一个术语:

在计算中,单词是特定数据的自然单位 处理器设计。单词是作为 单元由处理器的指令集或硬件组成。这 单词中的位数(字大小、字宽或字长) 是任何特定处理器设计的重要特征,或 计算机体系结构。

如果处理器有 64 位字,则每个类型小于 64 位的变量仍将占用内存中的 64 位。请记住,给定类型的变量将作为给定类型处理,内存中的大小不会影响范围、溢出或下溢 - 将为给定类型处理算术。

简而言之 - 如果您有 64 位桌面处理器并且仅使用short个变量,那么与声明int变量相比,您不会观察到任何内存节省。

相关内容

  • 没有找到相关文章

最新更新