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

C# 从静态方法创建的对象

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

目前我正在尝试使用一个从静态方法创建的对象,但它没有发生。我相信我做错了什么,但我不知道是什么。这是我用来创建对象的代码,这段代码在单独的类中,比如说它的名称是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);

提前感谢您的回答

由于您可以调用此函数而不会出现编译器错误:

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);