Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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#_Oop - Fatal编程技术网

C# 如何从C中的另一个类调用变量#

C# 如何从C中的另一个类调用变量#,c#,oop,C#,Oop,我来自Java,我正在学习C#scripting,我有这个问题已经有大约两天了,现在正在寻找解决方案,我尝试将类设置为一个实例和所有东西。这是一个微型游戏项目,我正在与一些朋友合作 不管怎样,我有StatHandler.cs处理我们所有的statpoints。。。然后我有HealthManager.cs,它应该处理所有与健康相关的事情 问题是,我一辈子都不知道如何调用变量,比如 public int stamina, strength, agility, dexterity, wisdom;

我来自Java,我正在学习C#scripting,我有这个问题已经有大约两天了,现在正在寻找解决方案,我尝试将类设置为一个实例和所有东西。这是一个微型游戏项目,我正在与一些朋友合作

不管怎样,我有StatHandler.cs处理我们所有的statpoints。。。然后我有HealthManager.cs,它应该处理所有与健康相关的事情

问题是,我一辈子都不知道如何调用变量,比如

public int stamina, strength, agility, dexterity, wisdom;
来自StatHandler.cs

我知道,在Java中,它将像

maxHealth = StatHandler.stamina * 10;
尽管不能用C#实现这一点,但在创建实例时,代码如下所示

maxHealth = StatHandler.instance.stamina * 10;
这给了我一个错误

NullReferenceException: Object reference not set to an instance of an object
我也试着通过这样做来继承

public class HealthHandler : StatHandler {
但是它将HealthHandler类中的所有值都设置为0,它不读取任何内容。



我真的需要弄清楚如何从其他C#文件中提取变量,因为这会让我的速度慢下来。

这实际上与Java中的情况相同。对于非静态变量,您需要一个类实例:

StatHandler sh = new StatHandler();
maxHealth = sh.stamina * 10;
或者可以在类中将变量声明为静态变量,如

public static string stamina = 10;
然后访问它

maxHealth = StatHandler.stamina * 10;
在C#中,如果不初始化值类型变量,就不能使用它

看起来像是
StatHandler.instance
static
方法。没有任何赋值,您不能使用
int
变量。给它们分配一些值

比如说

public int stamina = 1, strength = 2, agility = 3, dexterity = 4, wisdom = 5;
NullReferenceException:对象引用未设置为对象的实例

您需要正确初始化。似乎是
StatHandler.instance
是静态的,未初始化

您可以在
static
构造函数中初始化它

class StatHandler
{

  static StatHandler()
  {
      instance = new Instance(); // Replace Instance with type of instance
  }
}

你有两条路要走

全静态类

public static class StatHandler
{
    public static Int32 Stamina = 10;
    public static Int32 Strength = 5;
}
然后:

maxHealth = StatHandler.Stamina * 10; // get the value and use it
StatHandler.Stamina = 19; // change the value
maxHealth = StatHandler.Instance.Stamina * 10; // get the value and use it
StatHandler.Instance.Stamina = 19; // change the value

// replace the current instance:
StatHandler.Instance = new StatHandler();
StatHandler.Instance.Stamina = 19; // change the value
单例实例

public class StatHandler
{
    public static StatHandler Instance;

    public Int32 Stamina = 10;
    public Int32 Strength = 5;

    // this is called only the first time you invoke the class
    static StatHandler()
    {
        m_Instance = new Instance(); // Replace Instance with type of instance
    }
}
然后:

maxHealth = StatHandler.Stamina * 10; // get the value and use it
StatHandler.Stamina = 19; // change the value
maxHealth = StatHandler.Instance.Stamina * 10; // get the value and use it
StatHandler.Instance.Stamina = 19; // change the value

// replace the current instance:
StatHandler.Instance = new StatHandler();
StatHandler.Instance.Stamina = 19; // change the value

我认为第一个总是最好的选择,同样的结果,更少的复杂性。

下面是您的想法;)似乎你试图获得耐力,就好像它是一个静态场。。要么在StatHandler中使其保持静态,要么创建一个新的StatHandler实例并从中获得耐力……“使用C#脚本”…“调用变量”…“从C#文件中提取变量”。。。这个术语很有异国情调。除此之外,它与Java中的相同:您需要一个对象实例来访问类的非静态字段。StatHandler.instance没有创建实例。你确定你是爪哇人吗?可能来自JavaScript?它们稍后在我的代码中分配,使用库我在scripts Start()函数上启动所有变量,我将10的值应用于所有变量。但是,考虑到我们完成后将是多人游戏,在附加到播放器的脚本上使用静态变量不会适得其反,使每个玩家都有相同的属性?它应该是实例成员。但这就是设计问题,你们会遇到很多这样的问题。您可以写下所有的需求,创建对象模型,然后如果您有进一步的问题,您应该询问programmers.stackexchange.com