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

时间:2018-02-15 10:40:27

标签: c# unity3d

我对C#和Unity中的脚本非常陌生。 到目前为止,在制作C#(非MB)课程时,我使用以下模式。

public class Item
{
    public string itemName;

    public Item(string newItemName)
    {
        itemName = newItemName;
    }
}

在其他一些脚本中,我可以使用Item rock = new Item("Rock");或其他任何内容。

现在,我使用以下属性。

public class Item
{
    string itemName;

    public string ItemName
    {
        get { return itemName; }
        set { itemName = value; }
    }
}

在其他一些脚本中我使用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.等属性设置所有字段是否有更好的方法?

3 个答案:

答案 0 :(得分:6)

绝不使用公共字段!

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

public string ItemName { get; } // without even the setter!

只有在类绝对必要时才添加setter。

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

public class Item
{
    public string ItemName { get; }

    public Item(string newItemName)
    {
        ItemName = newItemName;
    }
}

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

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

var item = new Item() { ItemName = "" };
  

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

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

答案 1 :(得分:3)

你可以像这样使用autoproperties和构造函数:

public class Item
{
    public string ItemName {get;set;}

    public Item()
    {
    }

    public Item(string itemName)
    {
        this.ItemName = itemName;
    }
}

然后您可以执行以下操作

Item item1 = new Item(value);

或者

Item item1 = new Item(){ItemName=value};

答案 2 :(得分:1)

您的问题实际上归结为在构造函数内或从外部设置成员。正如您在评论中所写的那样,在没有设置成员的情况下,您不需要Item存在。因此,您的决定取决于一个要点:您是否希望能够修改最初设定的值?

如果你想要这个,最简单的方法是让这些成员公开访问并给他们一个初始值:

class Item
{
    public string ItemName { get; set;} = "InitialValue";
}

或在C#6之前:

class Item
{
    public string ItemName { get; set;}
    public Item()
    {
        ItemName = "InitialValue";
    }
}

如果您想要修改成员,则可以改为使用private readonly补贴字段:

class Item
{
    private readonly string _itemName = "InitialValue";
    public string ItemName { get { return _itemName; } }
}

另外,你也可以创建一个默认构造函数并在那里设置ietmName的初始值:

class Item
{
    private readonly string _itemName;
    public string ItemName { get { return _itemName; } }
    public Item()
    {
        _itemName = "InitialValue";
    }
}

您还可以使用可从类外部读取的属性,但只能通过使用私有setter在类中进行更改。然而,这与使用私有只读后备字段略有不同,因为在后一种情况下,只有构造函数能够设置值,而在前一种情况下,evry代码Item -class可以更改属性的值。