Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中存储和索引常量#_C#_Arrays_Constants - Fatal编程技术网

C# 在C语言中存储和索引常量#

C# 在C语言中存储和索引常量#,c#,arrays,constants,C#,Arrays,Constants,我想这是一个哲学问题 我们正在启动一个视频游戏项目,并在进行中发现C#。我们首先需要的是一种将常量存储在一组数组中的方法,这样任何人都可以轻松访问这些值,这样我们就可以在定义新角色或武器类型时快速添加或修改值 现在在C++中,我是这样学习的: 在一些constants.h文件中声明一个枚举,其最后一个元素是“which_TYPE_END” 声明常数数组“NeYFEY Type Type”,因为枚举和数组索引在C++中工作良好;李> 用constants.cpp中不同类型的各种值填充这些数组

我想这是一个哲学问题

我们正在启动一个视频游戏项目,并在进行中发现C#。我们首先需要的是一种将常量存储在一组数组中的方法,这样任何人都可以轻松访问这些值,这样我们就可以在定义新角色或武器类型时快速添加或修改值

现在在C++中,我是这样学习的:

  • 在一些constants.h文件中声明一个枚举,其最后一个元素是“which_TYPE_END”
  • 声明常数数组“NeYFEY Type Type”,因为枚举和数组索引在C++中工作良好;李>
  • 用constants.cpp中不同类型的各种值填充这些数组
例如:

enum FoulType{
犯规类型无,
犯规类型比赛外,
犯规类型越位,
肮脏的暴力,
污浊型粘滞,
犯规类型
};
外部常量字符*FoulTypeNames[FOUL_TYPE_END];
外部常量浮动犯规机会[犯规类型结束];
外部构造ushort FOULSANCTION秒[犯规类型结束];
外部施工犯规[犯规类型结束];
它很简洁,因为它可以让程序员毫不费力地检索修改器。如果我想计算我的角色会造成多大的伤害,我会这样做

CharacterType ChartType=myCharacter.getType();
WeaponType weapType=myCharacter.getwiller().getType();
伤害=角色伤害[ChartType]*武器修改器[weapType];
现在在C#,我一直在想如何达到类似的效果。经过三个小时的游历,我终于有了一些功能性的东西,但它看起来有些粗糙

我拥有的是一个静态类(命名常量),其中声明了公共枚举,并定义了大小为(int)SomeEnum.END的公共静态只读数组。声明如下所示:

public enum WeaponType
{
枪=0,
猎枪,
攻击
终点
};
public static readonly int[]WeapDamage=new int[(int)WeaponType.End]
{
10,
50,
10
};
数组是只读的,而不是常量,因为。枚举必须显式转换为int,否则它可以正常工作。现在,我知道那些“常量”不是真正的常量,这些数组的值可能会改变;我找到了两种可能的解决方案:

  • 保护数组,并使用getter,如果有人真的需要整个数组而不仅仅是一个值,则返回数组的副本
  • 使用ReadOnlyCollection

因为我偏向于我的旧C++方式(它们本身可能不像我想象的那么干净),这些解决方案中没有一个对我有吸引力(尤其是不可读取的集合),因为我(大多是迷信地,我想……)害怕时间和内存开销(我们正在处理一个实时多人游戏)。 大多数情况下,我想,我担心我为实现一些几乎与我在另一种语言中所知道的相似但不完全相同的东西而付出的努力只是一个信号,表明我做的事情不正确。


因此,对于任何比我更有C#和/或视频游戏制作经验的人来说,在这里存储大量常量的正确方法是什么?

我建议使用某种类型的“数据存储”:DB、文本文件、电子表格,无论你喜欢什么,都可以在启动时加载。这使得测试各种参数组合像在DB或文本文件中编辑一行一样简单,无需任何重新编译。一旦游戏变得稳定,然后将它们作为资源存储在EXE中。

我建议使用某种类型的“数据存储”:DB、文本文件、电子表格,无论您喜欢什么,都可以在启动时加载。这使得测试各种参数组合像在DB或文本文件中编辑一行一样简单,无需任何重新编译。一旦游戏变得稳定,然后将其作为资源存储在EXE中。

它真的必须是常量吗?我的意思是你可以把它放在课堂上。我不太喜欢使用很多依赖于其他常数的常数。您的代码不是很面向对象,也不可读。当然也有例外,如果内存使用等是一个问题

但像这样做的C#方式是面向对象

public class Weapon {
  public string Name { get; private set; }
  public WeaponType Type { get; private set; }
}

public class WeaponType {
  public string Name { get; private set; }
  public int Damage { get; private set; }
}
等等


然后在游戏开始时使用工厂方法初始化你的武器/角色等。实际数据可以像文件一样存储在任何地方。

它真的必须是常量吗?我的意思是你可以把它放在课堂上。我不太喜欢使用很多依赖于其他常数的常数。您的代码不是很面向对象,也不可读。当然也有例外,如果内存使用等是一个问题

但像这样做的C#方式是面向对象

public class Weapon {
  public string Name { get; private set; }
  public WeaponType Type { get; private set; }
}

public class WeaponType {
  public string Name { get; private set; }
  public int Damage { get; private set; }
}
等等


然后在游戏开始时使用工厂方法初始化你的武器/角色等。实际数据可以像文件一样存储在任何地方。

为什么武器类型的所有属性都分布在未连接的阵列上?为什么不使用WeaponType结构或类来聚合每种武器类型的属性?+2用于在同一句话中使用“Peregriations”和“Functional”[sic]。@Eric这实际上是OP在他的C#示例代码中使用的。另一个代码是C++示例。为什么你有武器类型的所有属性在没有连接的数组中传播?为什么不使用WeaponType结构或类来聚合每种武器类型的属性?+2用于在同一句话中使用“Peregriations”和“Functional”[sic]。@Eric这实际上是OP在他的C#示例代码中使用的。另一个代码是C++示例。