我正在尝试创建一个控制台游戏,您可以在其中输入多达24个名称。为此,我创建了一个名为PlayerData
的名为PlayerDataAr[]
的类的数组,其中包含24个元素。它会提示用户输入一些名称,并将这些名称分配给数组中的每个元素,其值为string Name
和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();
}
}
}
}
它返回:
使用实例引用无法访问成员'hG.PlayerData.isAlive.get';用类型名称来限定它。
对于Name
和isAlive
,我不知道它的内容是什么。
任何帮助将不胜感激。
答案 0 :(得分:8)
从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;
}
}
更好的设计是使用自动实现的属性:
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
表示基于类:PlayerData
,因为整个具有单数 isAlive
适当的价值。您需要不同的行为:每个 PlayerData
实例都有自己的属性值,这就是为什么isAlive
应该只是一个实例属性(无static
)。
答案 1 :(得分:4)
您收到错误,因为isAlive
是static
,这意味着它不属于任何实例。如果您想为isAlive
属性分配值,则需要按类型名称执行此操作:
PlayerData.isAlive = true;
但是查看您的代码,真正想要做的是删除static
并通过实例引用访问它:
private bool _isAlive;
public bool isAlive
{
get { return _isAlive;}
set { _isAlive = value;}
}
然后PlayerDataAr[x].isAlive = true;
会正常工作。
对static
关键字here进行了简单明了的解释。