C# 子类成员初始化

C# 子类成员初始化,c#,initialization,subclass,member,C#,Initialization,Subclass,Member,我创建了两个类来替换点(两个变体)的函数,只是为了测试它们,我就是这样创建它们的: Entity.cs: namespace Xnagame { class Player { public class float2 { public float X { get; set; } public float Y { get; set; } } public class i

我创建了两个类来替换
(两个变体)的函数,只是为了测试它们,我就是这样创建它们的:

Entity.cs:

namespace Xnagame
{

    class Player
    {

        public class float2
        {
            public float X { get; set; }
            public float Y { get; set; }
        }
        public class int2
        {
            public int X { get; set; }
            public int Y { get; set; }
        }
        public int2 Position { get; set; }
        public int angle { get; set; }
        public float speed { get; set; }
        public float2 velocity { get; set; }

        public Player CreatePlayer()
        {

            Position = new Player.int2();
            Player player = new Player();
            return player;
        }
    }
}
如您所见,这两个点类都有一个
X
Y
变量(我不确定这是否是设置它们的方法,如果不是,请告诉我),并且这些类用于在
CreatePlayer()
方法中实例化的位置和速度实例中

游戏1.cs:

namespace Xnagame
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private Texture2D playerimage;
        private Texture2D background;
        Player player = Player.CreatePlayer();
现在的问题是,当
CreatePlayer()
方法尝试将其“player”返回给本地播放器时,它会给出:

非静态字段、方法或属性需要对象引用
Xnagame.Player.CreatePlayer()

错误

我还尝试了新的关键字,它给了我:

Xnagame.Player.CreatePlayer()
是一个方法,但使用起来就像类型一样


您的
CreatePlayer
方法是一个实例方法-换句话说,必须在现有实例上调用它。您可能希望将其设置为静态:

public static Player CreatePlayer()
然后应该删除
Position=new Player.int2()
行-创建一个播放器不应该更改现有播放器的位置


(我还强烈建议将嵌套类型提取为不可变的顶级结构,并将它们重命名为类似于
Int32Position
SinglePosition
——尽管您可能会发现框架已经有类似的功能。您还应使所有属性遵循.NET命名约定。)

您的
CreatePlayer
方法是一个实例方法-换句话说,必须在现有实例上调用它。您可能希望将其设置为静态:

public static Player CreatePlayer()
然后应该删除
Position=new Player.int2()
行-创建一个播放器不应该更改现有播放器的位置


(我还强烈建议将嵌套类型提取为不可变的顶级结构,并将它们重命名为类似于
Int32Position
SinglePosition
——尽管您可能会发现框架已经有类似的功能。您还应使所有属性遵循.NET命名约定。)

您的
CreatePlayer
方法是一个实例方法-换句话说,必须在现有实例上调用它。您可能希望将其设置为静态:

public static Player CreatePlayer()
然后应该删除
Position=new Player.int2()
行-创建一个播放器不应该更改现有播放器的位置


(我还强烈建议将嵌套类型提取为不可变的顶级结构,并将它们重命名为类似于
Int32Position
SinglePosition
——尽管您可能会发现框架已经有类似的功能。您还应使所有属性遵循.NET命名约定。)

您的
CreatePlayer
方法是一个实例方法-换句话说,必须在现有实例上调用它。您可能希望将其设置为静态:

public static Player CreatePlayer()
然后应该删除
Position=new Player.int2()
行-创建一个播放器不应该更改现有播放器的位置


(我还强烈建议将嵌套类型提取为不可变的顶级结构,并将它们重命名为类似于
Int32Position
SinglePosition
——尽管您可能会发现框架已经有类似的功能。您还应使所有属性遵循.NET命名约定。)

您需要使用静态函数直接从这样的类调用

public static Player CreatePlayer()
{
     //all the code
}

您需要使用静态函数直接从这样的类调用

public static Player CreatePlayer()
{
     //all the code
}

您需要使用静态函数直接从这样的类调用

public static Player CreatePlayer()
{
     //all the code
}

您需要使用静态函数直接从这样的类调用

public static Player CreatePlayer()
{
     //all the code
}

问题是您正在使用实例方法来创建实例

您有两个选择:

1) 使用默认构造函数

class Player
{
    // Other subclasses, and properties.

    public Player()
    {
        // Note: I added the other instance value just for fun.
        Position = new Player.int2();
        velocity = new Player.float2();
    }
}
2) 使用静态构造函数方法。(这些通常仅在特定的环境中使用。)


问题是您正在使用实例方法来创建实例

您有两个选择:

1) 使用默认构造函数

class Player
{
    // Other subclasses, and properties.

    public Player()
    {
        // Note: I added the other instance value just for fun.
        Position = new Player.int2();
        velocity = new Player.float2();
    }
}
2) 使用静态构造函数方法。(这些通常仅在特定的环境中使用。)


问题是您正在使用实例方法来创建实例

您有两个选择:

1) 使用默认构造函数

class Player
{
    // Other subclasses, and properties.

    public Player()
    {
        // Note: I added the other instance value just for fun.
        Position = new Player.int2();
        velocity = new Player.float2();
    }
}
2) 使用静态构造函数方法。(这些通常仅在特定的环境中使用。)


问题是您正在使用实例方法来创建实例

您有两个选择:

1) 使用默认构造函数

class Player
{
    // Other subclasses, and properties.

    public Player()
    {
        // Note: I added the other instance value just for fun.
        Position = new Player.int2();
        velocity = new Player.float2();
    }
}
2) 使用静态构造函数方法。(这些通常仅在特定的环境中使用。)


这给了我一个nullreferenceexception:Player=Player.CreatePlayer();这给了我一个nullreferenceexception:Player=Player.CreatePlayer();这给了我一个nullreferenceexception:Player=Player.CreatePlayer();这给了我一个nullreferenceexception:Player=Player.CreatePlayer();这在初始化子模块中给了我一个nullreferenceexception,在这里我试图设置player.position.X=100@克罗西:是的,如果你坚持当前的位置类型是一个类,你需要初始化新创建的玩家。然而,我建议将该位置改为结构,并使其不可变。我只试着解决你问题中的一个问题,还有一些一般性的建议。。。在你有一个可用的应用程序之前,我们不会带你浏览每一个问题。你应该试着自己解决下一个问题,如果有必要(在自己尝试之后)发布一个新问题。这在初始化子部分中给了我一个nullreferenceexception,我试图在其中设置player.position.X=100@克罗西: