gpt4 book ai didi

c# - 可以公开所有变量吗?

转载 作者:行者123 更新时间:2023-11-30 14:30:08 32 4
gpt4 key购买 nike

我正在编写一个简单的回合制 RPG 系统。我有一个 BattleScreen 类来处理屏幕的绘制。问题是,它必须知道关于我的 Player 类的几乎所有内容。它的名称, HP 值, MP 值, JobName, Level, 经验金钱等等。为了把它写在屏幕上。我的 Draw() 方法最终会从 Player 中绘制几乎所有变量,它要求我将 Player 中的几乎所有内容都设为 public

这让我相信让 Player 类自己绘制会是一个更好的主意,但后来我得到了多个 Draw() 方法 BattleScreen 需要调用。如果 Player 是主要播放器(具有所有数据和名称),以及在旁观者(只有 Sprite 和 HP/MP 可见)和其他方法对于其他屏幕。

这两种方式都让人恶心。

这两种方式中的任何一种都被认为是“正常”的吗?有没有更好的设计方法?

最佳答案

你不应该公开任何成员变量,因为这被认为是不好的做法。
您应该使用属性。

所以代替:

public string PlayerName;

你应该使用

private string playerName;
public string PlayerName
{
get { return playerName; }
set { playerName = value; }
}

或者更短

public string PlayerName { get; set; }

然后您还可以从外部将属性设置为“只读”,就像 Corak 已经提到的那样:

public string PlayerName { get; private set; }

然后从您的 Player 内部您可以获取和设置 PlayerName 的值,但是从外部,就像在您的 Draw 方法中,您只能得到它。您也可以稍后使用附加逻辑(例如验证)扩展 getter/setter,而不会破坏任何其他代码。



注意:

注意:以下性能注意事项仅在非常罕见的情况中有效,您应该永远不要假设属性会降低性能!如果您认为您可能会遇到这种情况,您应该使用不同的方法进行性能测试(即使在 Release模式下和优化分析器可能会为这种情况给出错误的结果)进行比较。

正如 Chris 正确提到的那样,属性可以比成员稍微慢,如果它们没有被 JIT 内联(由于 getter/setter 的“方法调用”,这应该几乎一直发生在自动属性中)。这在大多数情况下不相关,但在每秒 许多 千次调用时,它可能变得相关。在这种情况下,您应该进行性能测试以查看是否是这种情况(您需要在启用优化的 Release模式下运行此类测试,而不仅仅是使用分析器!)并且仅当是这样时才可以使用公共(public)成员。
在我的一个程序中,我遇到了这样一个罕见的案例,它在每秒 10k-100k 次调用之间产生了相关性,但我们仍然只谈论 100k 次调用的几毫秒。即使在这种情况下,我建议使用这些属性,如果您不需要绝对的每一点性能(就像我的情况一样),因为在我的情况下,可维护性更为重要意见。

关于c# - 可以公开所有变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278346/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com