评估从静态方法创建的对象

问题描述 投票:2回答:2

目前我正在尝试使用从静态方法创建的对象,但它不会发生。我相信我做错了什么,但我不知道是什么。这是我用来创建对象的代码,这段代码在单独的类中,让我们说它的名字是CrusadersFactory.cs:

//Method for creating crusader Nate
public static void CreateNate(string name, int level, int health, int damage)
{
    Nate NateDragon = new Nate(name, level, health, damage);
    //Print the info for the new object NateDragon
    Console.WriteLine(NateDragon.name + " " + NateDragon.level + " "  + NateDragon.health + " " + NateDragon.damage);
}

以下是我试图使用该对象的方法,这段代码在Program.cs中:

CrusadersFactory.CreateNate("Nate", 100, 200, 300); //This works in order to create Nate, but It gives error if i try Console.WriteLin(CrusadersFactory.NateDragon.name)
Console.WriteLine("Nate's health is {0}", CrusadersFactory.NateDragon.health);

提前感谢您的回答!

c# oop static-methods
2个回答
2
投票

由于您可以在没有编译器错误的情况下调用它:

CrusadersFactory.NateDragon.health

这意味着你确实在你的NateDragon中创建了一个静态的CrusadersFactory属性。但是,您从未向此属性分配任何内容。

public static void CreateNate(string name, int level, int health, int damage)
{
    Nate NateDragon = new Nate(name, level, health, damage);
}

您在此处所做的是声明并分配了一个局部变量。这个变量只存在于CreateNate方法的范围内,它不存在于它之外。

你应该做的是将你创建的对象分配给你想要存储它的静态属性:

public static void CreateNate(string name, int level, int health, int damage)
{
    CrusadersFactory.NateDragon = new Nate(name, level, health, damage);
}

由于CreateNate方法也是CrusadersFactory的一部分,你可以缩短为:

public static void CreateNate(string name, int level, int health, int damage)
{
    NateDragon = new Nate(name, level, health, damage);
}

非常简单地说,当你使用Nate NateDragon = ...时,你声明了一个新变量,而不是访问你已经在NateDragon类中声明的静态类属性CrusadersFactory


2
投票

您的方法具有void返回类型(不返回任何值)。你应该改变它以返回类型Nate

public static Nate CreateNate(string name, int level, int health, int damage)
{
    var nate = new Nate(name, level, health, damage);
    //Print the info for the new object NateDragon
    Console.WriteLine(nate.name + " " + nate.level + " "  +  nate.health + " " + nate.damage);
    return nate;
}

您的用法示例可以变为:

var nate = CrusadersFactory.CreateNate("Nate", 100, 200, 300);
Console.WriteLine("Nate's health is {0}", nate.health);
© www.soinside.com 2019 - 2024. All rights reserved.