[英]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 Name
和bool 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
. 我不知道它在谈论它的
Name
和isAlive
。 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. 你得到错误,因为
isAlive
是static
,这意味着它不是任何实例的一部分。 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.