【问题标题】:Creating new object without passing parameter在不传递参数的情况下创建新对象
【发布时间】:2023-03-10 18:45:02
【问题描述】:

我正在阅读 Data Structures and Algorithms Using C# (Michael McMillan)。

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

这可能吗?

【问题讨论】:

  • 通常情况下,最好将源代码发布为文本而不是图像。
  • 回答你的问题:构造函数可能有几个重载。例如。一种不带public CArray() 等参数,一种带public CArray(int size),也许还有其他参数。
  • 您是否尝试使用默认值的可选参数?
  • @UweKeim 知道了,我是第一次发帖。
  • 可能是错字

标签: c# arrays class object constructor


【解决方案1】:

可能有几种可能性:

  • 一个错字
  • 还有一个重载

    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,因此它应该用于仅用于序列化目的,不用于一般初始化。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我知道有很多构造函数的可能性,作者也应该提到其他构造函数..
      • 我希望你现在知道了。请将最佳答案(您认为)标记为正确并接受。
      • 这不是calling a constructor from another 的语法。
      【解决方案4】:

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

         public CArray()
           : this(0) {
         }  
      

      即如果没有指定size,则让它等于0

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          • 2014-06-09
          相关资源
          最近更新 更多