C# 类的参数在创建新实例时返回null

C# 类的参数在创建新实例时返回null,c#,C#,在我的Item类中,我有这两个变量 public string ItemDescription { get { return itemDescription; } set { value = itemDescription; } } public string itemDescription; 我知道有两个相同的变量是多余的,但我现在正在使用它们进行调试。继承的每个项都有这样的构造函数 public Log() {

在我的Item类中,我有这两个变量

    public string ItemDescription
    {
        get { return itemDescription; }
        set { value = itemDescription; }
    }
    public string itemDescription;
我知道有两个相同的变量是多余的,但我现在正在使用它们进行调试。继承的每个项都有这样的构造函数

    public Log()
    {
        //other stuff
        itemDescription = "A log.";
        ItemDescription = 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

 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.itemsdescription变量处会出现一个null错误

我创建了一个像这样的新项目

    public Log()
    {
        //other stuff
        itemDescription = "A log.";
        ItemDescription = 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?我想我并不完全理解创建类的新实例是如何工作的

编辑:为了清晰起见,我会尝试添加更多代码,并描述我正在尝试做的事情。每次我创建一个新项时,我都在和list之间循环,并调用一个方法,该方法返回列表中该项的输出

            if (recipe.CheckForItemsNeeded(player) != null)
            {
                Output = recipe.Output;
                SetItemPositionInTable(Output);
            }
输出类型为Item。SetItemPositionTable方法应该绘制项目,以便我可以单击它并制作它。方法如下

             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;
            }
        }
for(int i=0;i
这种方法现在很混乱,但这是另一个问题。当我把它打出来的时候,我意识到我忘记了在if循环中设置描述的一行。。。问题解决:P

    set { value = itemDescription; }  // should be  itemDescription = value
这是向后的(分配给setter中的值),应该是另一种方式。值是参数,而不是支持字段。因此,您的设置不起任何作用,而在ItemDescription属性中获取值的唯一方法是由设置(小写)
ItemDescription=“a log.”的构造函数

在幕后,
set{…}
被编译器重写为如下方法:

void set_ItemDescription(string value) { ... }
因此,您的原始代码是分配给参数的,而不是支持字段

此外,由于itemDescription是属性的支持字段,因此构造函数具有冗余赋值(itemDescription=itemDescription)

公共日志()
{
//其他东西
itemDescription=“日志。”;

ItemDescription=ItemDescription;//值类型的类的成员将永远不会为null。另一方面,可为null的值和类成员在显式初始化之前将为null。String可为null,因此ItemDescription在未初始化时为null。您可以比较null字符串,例如名称,但在尝试如果为空字符串,则会出现异常

以下是有关值类型与引用类型的链接:


希望对您有所帮助。

`publicstringitemsdescription{

    get { return itemDescription; }

    set { value = itemDescription; }

} `

您在set部分中的代码错误,应该将值分配给itemDescription。

您确定
item.itemDescription
包含值吗?不,我不认为它包含值。我只是认为,在创建类的每个新实例时,只有当您有一个设置值的构造函数时,itemDescription才会被设置。我假设tructor设置了我猜的值。我看了下面的答案,切换了值和itemDescription,但仍然不起作用。太晚了,我应该睡着了!:)我切换了变量,但仍然得到null。我建议用一行读取
公共字符串itemDescription来替换整个属性和支持变量{get;set;}
@DavidG-好的,恕我直言。:)然后我们需要查看更多上下文代码,以便更好地了解您的情况