与构造函数相关的公共字段与属性

emb*_*ure -1 c# unity-game-engine

我很擅长C#和Unity中的脚本.到目前为止,在制作C#(非MB)类时,我会使用以下模式.

public class Item
{
    public string itemName;

    public Item(string newItemName)
    {
        itemName = newItemName;
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他一些脚本中我可以使用Item rock = new Item("Rock");或其他什么.

现在,我正在使用以下属性.

public class Item
{
    string itemName;

    public string ItemName
    {
        get { return itemName; }
        set { itemName = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我使用的其他一些脚本中 Item rock = new Item(); rock.ItemName = "Rock";

实际上,我经常使用自动实现的属性,并且除了项目的名称之外还有更多的字段.当我使用公共字段时,很容易在构造函数中设置所有这些字段.现在,我不确定如何,或者是否可能(如果我想让它们保密).因此,我发现自己必须使用默认构造函数,然后使用诸如rock.ItemWeight = "1 lb" rock.ItemColor = "gray" rock.ItemType = "blunt instrument"...etc. for every item and field each time a new item is created.更好的方法之类的属性设置所有字段?

Swe*_*per 6

切勿使用公共领域!

设置你的大脑默认使用这样的自动属性:

public string ItemName { get; } // without even the setter!
Run Code Online (Sandbox Code Playgroud)

只有在类必须可变时才添加setter.

谁说你不能在构造函数中设置它?看:

public class Item
{
    public string ItemName { get; }

    public Item(string newItemName)
    {
        ItemName = newItemName;
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以在最后使用对象初始化块:

public class Item
{
    // setter is needed for this to work.
    public string ItemName { get; set; }
}

var item = new Item() { ItemName = "" };
Run Code Online (Sandbox Code Playgroud)

我只是想知道当这些成员是私有的时,如何在构造函数中设置成员.

构造函数是类的一部分,因此如果它们有一个setter,它们可以设置私有属性.这只是在课外,属性是看不见的.