可以公开所有变量吗?

Tae*_*lia 3 c# xna-4.0

我正在写一个简单的回合制RPG系统.我有一个BattleScreen类来处理绘图...屏幕.事情是,它必须知道关于我Player班级的几乎所有事情.它Name,HP值,MP值,JobName,Level,Experience,Moneyetc.etc.etc.为了把它写在屏幕上.我的Draw()方法最终会从中抽取几乎所有变量Player,并且它要求我在Player公共场合制作几乎所有的东西

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

两种方式都感觉很蠢.

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

Chr*_*Fin 6

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

所以代替:

public string PlayerName;
Run Code Online (Sandbox Code Playgroud)

你应该使用

private string playerName;
public string PlayerName
{ 
    get { return playerName; } 
    set { playerName = value; }
}
Run Code Online (Sandbox Code Playgroud)

或者甚至更短

public string PlayerName { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

public string PlayerName { get; private set; }
Run Code Online (Sandbox Code Playgroud)

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



注意:

注意:以下性能的考虑仅在有效的极少数情况下,你应该永远不要假设该属性有性能上的损失!如果你认为你可以有你应该使用不同的方法(甚至在释放模式与优化分析器可以给你这样的情况下,错误的结果)比较做性能测试这种情况.

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

  • 使用属性,您还可以执行`public string PlayerName {get; 私人集; },所以*reading*是公共的,但*writing*仍然是私有的. (4认同)