我对编程和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
变量相比,您不会观察到任何内存节省。