可以公开所有变量吗?

时间:2014-06-18 06:21:41

标签: c# xna-4.0

我正在编写一个简单的回合制RPG系统。我有一个BattleScreen类来处理井的绘制..屏幕。事实是,它必须知道我的Player课程的所有内容。其NameHP值,MP值,JobNameLevelExperienceMoney等等。为了把它写在屏幕上。我的Draw()方法最终会从Player中抽取几乎所有变量,并且它要求我在Player public

中制作几乎所有内容

这让我相信让Player类自我绘制是一个更好的主意,但最后我得到了Draw()需要调用的多个BattleScreen方法。如果Player是主要播放器(具有所有数据和名称)的情况下的绘制方法,以及它在场边(只有精灵和HP / MP可见)的一个绘制方法,以及其他屏幕的其他方法

两种方式都感觉很蠢。

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

1 个答案:

答案 0 :(得分:6)

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

所以而不是:

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,而不会破坏任何其他代码。



注意:

注意:以下性能注意事项仅在非常罕见的情况中有效,并且您应该绝不应该该属性会降低性能!如果您认为自己可能遇到这种情况,则应该使用不同的方法进行性能测试(即使在发布模式下,并通过优化,分析器可能会给出错误的结果),以进行比较。

正如克里斯正确提到的, 属性非常轻微比成员慢,如果他们没有内联被JIT(由于"方法调用"因此几乎所有时间都应该使用自动属性)。对于getter / setter。这在大多数情况下不相关,但在 MANY 每秒几千次调用 MAY 相关。在这种情况下,您应该进行性能测试以查看是否是这种情况(您需要在启用了优化的发布模式下运行此类测试而不仅仅使用分析器!)并且仅在这样的情况下可以使用公众成员 我在我的一个程序中有一个罕见的情况,它在每秒10k到100k的调用之间有相关性,但我们仍然只讨论几百毫秒的100k调用。即使在这种情况下,如果您不需要绝对可以获得的所有性能(如我的情况那样),我建议使用属性,因为在我的情况下,可维护性更重要意见。