简体   繁体   English

C#类的数组

[英]C# Array of Classes

I am trying to make a console game where you enter as many names as you like up to 24. To do this I have created an array of a class called PlayerData named PlayerDataAr[] which has 24 elements. 我试图做一个控制台游戏,你只要你喜欢高达24要做到这一点我创建了一个类调用数组进入尽可能多的名字PlayerData命名PlayerDataAr[]其中有24个元素。 It prompts the user to enter some names and those names are assigned to each element in the array which a value of string Name and bool isAlive but for some reason I can't seem to be able to access these values while I am assigning them to the player. 它提示用户输入一些名称,并将这些名称分配给数组中的每个元素,其中string Namebool isAlive的值为bool isAlive但由于某种原因,我在分配它们时似乎无法访问这些值玩家。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace hG
{
    public class PlayerData
    {
        private static bool _isAlive;
        public static bool isAlive
        {
            get { return _isAlive;}
            set { _isAlive = value;}
        }

        private static string _Name;
        public static string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        public PlayerData()
        {
            _isAlive = false;
            _Name = "";
        }

        public static void SetisAlive(bool a)
        {
            _isAlive = a;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string EnterName = "";

            //Array of Player Data
            PlayerData[] PlayerDataAr = new PlayerData[24];
            for (int x = 0; x < 24; x++ )
            {
                PlayerDataAr[x] = new PlayerData();
            }

            //Set up the Console
            Console.Title = "Hunger Games";
            Console.SetBufferSize(100, 42);
            Console.SetWindowSize(100, 42);

            Console.BackgroundColor = ConsoleColor.Yellow;
            Console.Clear();

            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.BackgroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("Welcome");
            Console.BackgroundColor = ConsoleColor.Yellow;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Enter the names for tributes and press enter when done:");

            //Loop through collecting names
            for(int x = 0; x < 25; x++)
            {
                Console.Write("--> ");
                EnterName = Console.ReadLine();
                if (EnterName == "")
                {
                    break;
                }
                else
                {
                    //Assign Player Data
                    PlayerDataAr[x].Name = EnterName;        //Error appears here
                    PlayerDataAr[x].isAlive = true;          
                }                
            }
            Console.Clear();

            for (int x = 0; x < 24; x++)
            {

            }

            //Start Game
            while(true)
            {
                Console.ReadLine();
            }    
        }
    }

}

It returns: 它返回:

Member 'hG.PlayerData.isAlive.get' cannot be accessed with an instance reference; 无法使用实例引用访问成员'hG.PlayerData.isAlive.get'; qualify it with a type name instead. 用类型名称来限定它。

I don't know what it is talking about it appears for both Name and isAlive . 我不知道它在谈论它的NameisAlive Any help would be greatly appreciated. 任何帮助将不胜感激。

Remove static from PlayerData : PlayerData删除静态

public class PlayerData
{
    private bool _isAlive;
    public bool isAlive
    {
        get { return _isAlive;}
        set { _isAlive = value;}
    }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    public PlayerData()
    {
        _isAlive = false;
        _Name = "";
    }

    public void SetisAlive(bool a)
    {
        _isAlive = a;
    }
}

A even better design is to use auto implemented properties : 更好的设计是使用自动实现的属性

public class PlayerData 
{
    public bool isAlive
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    public PlayerData()
    {
        isAlive = false; // redundant isAlive == false by default
        Name = "";
    }

    // redundant: you can easily put isAlive = value;
    public void SetisAlive(bool value)
    {
        isAlive = value;
    }
}

static means class-based : PlayerData as a whole has a singular isAlive property value. static表示基于类PlayerData作为一个整体具有单一的 isAlive属性值。 You want different behaviour: each PlayerData instance has its own property value, that's why isAlive should be just a instance property (no static ). 您需要不同的行为: 每个 PlayerData实例都有自己的属性值,这就是为什么isAlive应该只是一个实例属性 (没有static )。

You get error, because isAlive is static , which means it's not part of any instance. 你得到错误,因为isAlivestatic ,这意味着它不是任何实例的一部分。 If you'd want to assign a value to your isAlive property you need to do this by type name: 如果您想为isAlive属性赋值,则需要按类型名称执行此操作:

PlayerData.isAlive = true;

But looking at your code, what you really want to do is remove static and access it through the instance reference: 但是看看你的代码,你真正想要做的是删除static并通过实例引用访问它:

private bool _isAlive;
public bool isAlive
{
    get { return _isAlive;}
    set { _isAlive = value;}
}

Then PlayerDataAr[x].isAlive = true; 然后PlayerDataAr[x].isAlive = true; will work fine. 会很好的。

There is nice and simple explanation of static keyword here . 还有就是很好的和简单的解释static的关键字在这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM