在我的Item类中,我有这两个变量。
public string ItemDescription
{
get { return itemDescription; }
set { value = itemDescription; }
}
public string itemDescription;
我知道有两个相同的变量是多余的,但是我现在将它们用于调试目的。继承的每个Item都具有这样的构造函数。
public Log()
{
//other stuff
itemDescription = "A log.";
ItemDescription = itemDescription;
}
我像这样显示ItemDescription。
if (item.ItemSlotRectangle.Contains(MousePosition) && item.ItemName != "empty")
{
spriteBatch.DrawString(font, item.ItemDescription, new Vector2(item.ItemSlotPosition.X, item.ItemSlotPosition.Y - 20), Color.Black);
}
在某些时候这是可行的。创建项目并将其放在地面上时,我可以查看说明。但是,当我创建一个新项目并尝试查看描述时,在draw方法中的item.ItemDescription变量处出现了空错误。
我创建一个像这样的新商品。
if (item.ItemSlotRectangle.Contains(mp) && item.ItemName != "empty")
{
Item newItem = new Item();
newItem.ItemName = item.ItemName;
newItem.Texture = item.Texture;
newItem.ItemDescription = item.ItemDescription;
return newItem;
}
我的问题是,为什么纹理和名称有效,但为什么ItemDescription返回null?我想我不完全了解如何创建类的新实例。
编辑:我将尝试添加更多代码以使内容更加清晰,并描述我要执行的操作。每次创建一个新Item时,我都会遍历并列出并调用一个方法,该方法将在列表中返回该项目的输出。
if (recipe.CheckForItemsNeeded(player) != null)
{
Output = recipe.Output;
SetItemPositionInTable(Output);
}
输出的类型为Item。应该使用SetItemPositionInTable方法绘制项目,以便我可以单击它并制作它。方法如下。
for (int i = 0; i < CraftingTableItems.Count(); i++)
{
if (CraftingTableItems[i].ItemName == "empty")
{
CraftingTableItems[i].ItemName = output.ItemName;
CraftingTableItems[i].Texture = output.Texture;
break;
}
else if (CraftingTableItems[i].ItemName == output.ItemName)
{
break;
}
//fix this
else if (CraftingTableItems[i].ItemName != "empty" && output.ItemName == "empty")
{
CraftingTableItems[i].ItemName = output.ItemName;
break;
}
}
这种方法现在是一团糟,但这是另一个问题。在输入时,我意识到我忘记了if循环中的一行来设置描述...解决了问题:P
set { value = itemDescription; } // should be itemDescription = value
这是向后的(在设置方法中赋值),应该是另一种方式。value是参数,而不是后备字段。因此,您的设置什么都不做,并且获得ItemDescription属性值的唯一方法是设置(小写)的构造函数itemDescription = "A log.";
public string ItemDescription
{
get { return itemDescription; }
set { itemDescription = value; } // correct
}
在幕后,set {...}
编译器将其重写为如下方法:
void set_ItemDescription(string value) { ... }
因此您的原始代码是分配给参数,而不是后备字段。
另外,由于itemDescription是属性的后备字段,因此构造函数具有多余的分配(ItemDescription = itemDescription)
public Log()
{
//other stuff
itemDescription = "A log.";
ItemDescription = itemDescription; // <--- redundant
}
另一个建议;除非显示的代码是工厂方法,否则应编写“复制”构造函数,或实现Clone()或Copy()方法,而不是从外部代码中显式复制对象属性。您的班级应该知道如何复制或实例化完全初始化的实例,并且只应在班级内或工厂中编写该代码。除非进行反序列化,否则即使复制另一个对象,构造函数或工厂也应产生一个完全初始化的对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句