无需传递参数即可创建新对象

时间:2016-09-08 06:52:35

标签: c# arrays class object constructor

我正在阅读使用C#的数据结构和算法(Michael McMillan)。

第3章第43页中,我找到了在构造函数中接受参数但在不传递任何内容的情况下创建对象的代码段。

enter image description here

这可能吗?

5 个答案:

答案 0 :(得分:3)

可能有几种可能性:

  • 错字
  • 还有另一个重载

    public CArray(int size)
    {
        // Implementation.
    }
    public CArray()
    {
        // Other implementation.
    }
    
  • 可能有默认值

    public CArray(int size = 8)
    {
        // Implementation.
    }
    

即使问题中提供的代码不会“按原样”编译(没有3个解释中的一个 - 有一种方法可以创建 未初始化的实例 使用System.Runtime.Serialization.FormatterServices完全没有构造函数调用:

class SomeType
{
    int mVariable;

    public SomeType(int size)
    {
        mVariable = size;
    }
}

static void Main(string[] args)
{
    Type someType = typeof(SomeType);
    SomeType instance = (SomeType)FormatterServices.GetUninitializedObject(someType);
    // instance.mVariable = 0;
}

请记住,此方法速度慢且不安全,因为您可能以其开发人员不想要的方式使用class并手动覆盖构造函数,因此 应该是仅用于序列化目的 ,而不是用于一般初始化。

答案 1 :(得分:2)

首先是的,这是可能的,但在这种情况下,我不这么认为。 您可以创建多个构造函数,以允许这种情况,如:

public CArray() {
   this(5); 
}
public CArray(int size){
   arr = new int[size]; 
   //other logic's must be here
}

要描述:第一个构造函数或多或少是“默认构造函数”,它将使用参数大小进入另一个构造函数。您还可以添加一些构造函数。

答案 2 :(得分:2)

要编译的代码CArray必须有无参数构造函数; 最可能的语法是

   public CArray()
     : this(0) {
   }  

即。如果未指定size,则将其等于0

答案 3 :(得分:1)

默认的无参数构造函数不可用如果在类中定义带参数的自定义构造函数。

在这种情况下,如果你想保留无参数构造函数,你必须在你的类中明确定义它。

因此,在您的示例中,根据您提供的类定义,无法创建如下的新实例:new CArray()

答案 4 :(得分:1)

你必须有一个没有参数的构造函数,并且有一些方法:

  • 1:可选参数
  • 2:多重覆盖

1:可选参数:

public class CArray {
     private int[] arr;
     private int upper;
     private int numElements;

     //Constructor with default value parameter
     public CArray(int size = 0)
     {
         //Your logic must be here
     }
}

2:多次覆盖

public class CArray {
     private int[] arr;
     private int upper;
     private int numElements;

     //Constructor with zero parameter
     public CArray()
     {
         this = new CArray(0);
     }
     public CArray(int size)
     {
         //Your logic must be here
     }
}

所以在结束时和定义你的类之后,你可以使用两种类型:

var MyArray1 = new CArray();
var MyArray2 = new CArray(10);