实例化集合

时间:2013-12-30 17:09:10

标签: c# object instantiation

我正在尝试理解这条线:

private Queue<IProductable> inventory { get; set; }

它用于下面的整个代码中。我只习惯看到使用简单类型定义的属性;所以,这真让我困惑。另外,我很好奇为什么类Factory(下面)的构造函数使用:

inventory = new Queue<IProductable>();

而不是:

Queue<IProductable> inventory = new Queue<IProductable>();

我的理解是当你实例化一个新对象时,你应该这样做:CLASS/TYPE newObjectName = new CLASS/TYPE。构造函数是否甚至实例化了一个新的“库存”对象?如果是这样,为什么我不必指定对象“inventory”的类型(为了使用它来调用通用Collections类Queue中的方法)。

无论如何,下面是代码。我希望有人可以用最简单的方式解释这一点,让我在将来需要做类似的事情时理解/记住。

namespace codeExample
{
    class Factory
    {
        private Queue<IProductable> inventory { get; set; }

        public Factory()
        {
            inventory = new Queue<IProductable>();
        }

        public IProductable GetOldestItem()
        {
            IProductable oldestItem = inventory.First();
            return oldestItem;
        }

        public IProductable GetNewestItem()
        {
            IProductable newestItem = inventory.Last();
            return newestItem;
        }

        public void Add(IProductable productToAdd)
        {
            inventory.Enqueue(productToAdd);
        }
    }
}

5 个答案:

答案 0 :(得分:2)

  

我的理解是当你实例化一个新对象时,你应该这样做:CLASS / TYPE newObjectName = new CLASS / TYPE。构造函数是否甚至实例化了一个新的“库存”对象?

如果包含类型,那么它将创建一个新的局部变量。目前代码没有创建新变量,而是使用属性,这是该类的实例数据的一部分(至少在这种情况下)。该属性(在此特定上下文中)的行为几乎与私有字​​段完全相同。它创建的变量存在于整个对象的生命周期中,而不仅仅是一个方法。

  

构造函数是否甚至实例化了一个新的“库存”对象?

它正在创建一个新的队列对象,是的。属性定义定义可以存储队列的位置,但不会创建实际队列。构造函数实际上创建了一个队列(它是空的)并将其分配给变量。

答案 1 :(得分:0)

 private Queue<IProductable> inventory { get; set; }

auto property

它相当于

 private Queue<IProductable> _inventory;
 public Queue<IProductable> Inventory 
 {
     get { return _inventory; }
     set { _inventory = value; }
 }

因此,您刚刚声明了一个成员库存,稍后您实例化Queue<IProductable>并将其引用存储到自动属性inventory

inventory = new Queue<IProductable>();

答案 2 :(得分:0)

  

我只习惯看到用简单类型定义的属性;所以这   真的很困惑我

为什么呢?您可以定义任何类型的属性。

  

另外,我很好奇为什么类Factory的构造函数(下面)   用途:

您无法再次定义属性的类型,它已在当前范围内可用,因为它是一个类属性。其类型在行private Queue<IProductable> inventory { get; set; }

中定义
  

我的理解是当你实例化一个新对象时,你应该这样做:   CLASS / TYPE newObjectName = new CLASS / TYPE

不,这是一个简单的反例,有两行:

MyType myVariable;
...
myVariable = new MyType();

答案 3 :(得分:0)

private Queue<IProductable> inventory { get; set; }声明auto-implemented property,但它也可能是field

private Queue<IProductable> inventory;

这声明了一个private instance variable,你可以从这个类中的任何方法访问它,但不能从派生类或类外部访问。

您的代码在构造函数中指定一个值,该值始终在类中的其他代码之前运行:

inventory = new Queue<IProductable>();

现在,在本课程的任何地方,您都可以访问inventory

答案 4 :(得分:0)

private Queue<IProductable> inventory { get; set; }是一个自动属性。 get / set的实现由编译器提供。

VS

Queue<IProductable> inventory = new Queue<IProductable>();

现在,inventory是一个字段。属性具有后备存储,并且比字段更智能。它们允许程序员在get / set操作期间完成工作。

  

构造函数是否甚至实例化了一个新的“库存”对象?

是的,在示例中,构造函数正在设置隐藏变量(后备存储)。

  

如果是这样,为什么我不必指定对象“库存”的类型   (为了使用它来调用通用集合中的方法   class,Queue)。

因为您没有在构造函数中声明新变量。我们设置属性。

在这里,您可以使用字段而不是属性。但是,我希望“高级类”/工厂使用依赖注入,因此在这种情况下公共属性是有意义的。 (也许你简化了原始代码?)