C# 在不传递参数的情况下创建新对象

C# 在不传递参数的情况下创建新对象,c#,arrays,class,object,constructor,C#,Arrays,Class,Object,Constructor,我正在阅读使用C#的数据结构和算法(Michael McMillan) 在第3章第43页中,我发现了一个代码段,它在构造函数中接受参数,但创建对象时没有传递任何内容 这可能吗?首先,是的,这是可能的,但在这种情况下,我不这么认为。 您可以创建多个构造函数,以允许这种情况,如: public CArray() { this(5); } public CArray(int size){ arr = new int[size]; //other logic's must be

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

第3章第43页中,我发现了一个代码段,它在构造函数中接受参数,但创建对象时没有传递任何内容


这可能吗?

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

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

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

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

在这种情况下,如果要保留无参数构造函数,必须在类中显式定义它


因此,在您的示例中,根据您提供的类定义,不可能创建这样的新实例:
new CArray()

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

   public CArray()
     : this(0) {
   }  

i、 e.如果未指定
size
,则将其设为
0

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

  • 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);

可能有以下几种可能性:

  • 打字错误
  • 还有另一个过载

  • 可能存在默认值

    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
         }
    }
    

即使问题中提供的代码不会按“原样”编译(如果没有三种解释中的一种,也可以使用
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;
}

请记住,此方法速度慢且不安全,因为您可能会以其开发人员不希望您手动重写构造函数的方式使用
,因此它应仅用于序列化目的,而不用于一般初始化。

通常,最好将源代码作为文本发布,而不是作为文本发布图。回答您的问题:可能有几个构造函数重载。例如,一个没有参数,如
public CArray()
,另一个带有
public CArray(int size)
也可能是其他的。你是否尝试使用默认值的可选参数?@UweKeim知道了,我是第一次发布的。这可能是一个输入错误。我知道有很多构造函数的可能性,作者也应该提到其他构造函数。我希望你现在知道。请标出最佳答案(在你看来)这不是的语法。
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;
}