C# 从静态方法创建的对象
目前我正在尝试使用一个从静态方法创建的对象,但它没有发生。我相信我做错了什么,但我不知道是什么。这是我用来创建对象的代码,这段代码在单独的类中,比如说它的名称是CrusadersFactory.cs:C# 从静态方法创建的对象,c#,oop,static-methods,C#,Oop,Static Methods,目前我正在尝试使用一个从静态方法创建的对象,但它没有发生。我相信我做错了什么,但我不知道是什么。这是我用来创建对象的代码,这段代码在单独的类中,比如说它的名称是CrusadersFactory.cs: //Method for creating crusader Nate public static void CreateNate(string name, int level, int health, int damage) { Nate NateDragon = new Nate(na
//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);
提前感谢您的回答 由于您可以调用此函数而不会出现编译器错误:
CrusadersFactory.NateDragon.health
这意味着您确实在CrusadersFactory中创建了一个静态NateDragon属性。但是,您从未为此属性分配任何内容
您在这里所做的是声明并分配一个局部变量。此变量仅存在于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=…,您声明了一个新变量,而不是访问CrusadersFactory类中已经声明的静态类属性NateDragon。您的方法具有void返回类型,并且不返回任何值。您应该将其更改为返回Nate类型 然后,您的使用示例可以变成:
var nate = CrusadersFactory.CreateNate("Nate", 100, 200, 300);
Console.WriteLine("Nate's health is {0}", nate.health);
您的方法不会返回任何内容,NateDragon也不会存储在任何位置-它无法在CreateNatebut之外访问,但不会发生。这不是一个问题的技术描述看看OP的预期用法示例,他并没有试图返回一个对象,而是将一个对象分配给一个静态属性。@当然,但我同意Owen的说法,他应该返回它。有一个工厂不返回一个新的实例与我对工厂的理解相矛盾。与其回答张贴的问题,不如回答实际问题。@HimBromBeere:我同意返回值是通常的工厂方法,但我不认为选择将其存储在工厂中会特别消除类的工厂用途。谢谢大家,你们都帮助我学习了新东西,欧文和弗拉特,你们是顶尖!
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);