我可以从 C# 中同一类的另一个构造函数调用重载构造函数吗?

Posted

技术标签:

【中文标题】我可以从 C# 中同一类的另一个构造函数调用重载构造函数吗?【英文标题】:Can I call an overloaded constructor from another constructor of the same class in C#? 【发布时间】:2010-11-02 09:15:36 【问题描述】:

我可以从 C# 中同一类的另一个构造函数调用重载的构造函数吗?

【问题讨论】:

@Malay:你说的是什么语言?如果您在谈论 java/c#,为什么这是一个问题?在您发布问题之前,该文档应该对您有所帮助。抱歉,如果我的理解有误。 C# .. 我可以像这样调用第二个构造函数 foo(args) base() 但是有可能像这样 foo() //do something foo(args) //do something @shahkalpesh,正如这个论坛的创始人经常说的那样,我们不会阻止用户提出基本问题。所以请不要像 cmets 那样使用 RTFM。 @Malay,正如@shahkalpesh 所说,在Java/C# 中肯定是可能的。请更具体地了解语言。 欺骗 - ***.com/questions/829870/… 什么语言?马来人显然... ;-) 【参考方案1】:

不,你不能那样做,你可以在 C# 中从另一个构造函数调用构造函数的唯一位置是紧跟在构造函数后面的“:”之后。 例如

class foo

    public foo()
    public foo(string s )  
    public foo (string s1, string s2) : this(s1) ....


【讨论】:

【参考方案2】:

如果您的意思是如果您可以在 C# 中进行 ctor 链接,那么答案是肯定的。 The question 已被询问。

但是从 cmets 看来,您真正打算问的是 '我可以从 within 另一个具有前/后处理的构造函数调用重载构造函数吗?' 尽管 C# 没有执行此操作的语法,但您可以使用通用初始化函数来执行此操作(就像您在不支持 ctor 链接的 C++ 中所做的那样)

class A

  //ctor chaining
  public A() : this(0)
    
      Console.WriteLine("default ctor"); 
  

  public A(int i)
    
      Init(i); 
  

  // what you want
  public A(string s)
    
      Console.WriteLine("string ctor overload" );
      Console.WriteLine("pre-processing" );
      Init(Int32.Parse(s));
      Console.WriteLine("post-processing" );
  

   private void Init(int i)
   
      Console.WriteLine("int ctor 0", i);
   

【讨论】:

【参考方案3】:

编辑:根据原始帖子上的 cmets,这是一个 C# 问题。

简短回答:是的,使用 this 关键字。

长答案:是的,使用 this 关键字,这是一个示例。

class MyClass

   private object someData;

   public MyClass(object data)
   
      this.someData = data;
   

   public MyClass() : this(new object())
   
      // Calls the previous constructor with a new object, 
      // setting someData to that object
   

【讨论】:

问题不是这个,问题是问你是否可以这样做 public MyClass() // 做一些事情 // 然后让我们调用另一个构造函数 this(new object() ); /// 你不能这样做! 是否可以对 foo 进行分类 : fooBase public foo(string a) : this foo(a,null) : base(a) foo(string a, string b) ? 这个问题完全是关于这个的 - OP 的术语可能已经关闭,但这是人们来到这里时想知道的。 +1【参考方案4】:

在 C# 中,不能从方法体内调用另一个构造函数。 您可以通过这种方式调用基本构造函数: foo(args):base() 正如您自己指出的那样。 你也可以在同一个类中调用另一个构造函数:foo(args):this()。

当你想在调用基构造函数之前做某事时,基类的构造似乎依赖于一些外部事物。如果是这样,您应该通过基构造函数的参数,而不是通过设置基类的属性或类似的东西

【讨论】:

以上是关于我可以从 C# 中同一类的另一个构造函数调用重载构造函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

在C++中,啥是运算符重载?啥是虚函数?

C语言里面构造函数和析构函数的运用办法

php构造函数的PHP 5 构造函数和析构函数

构造函数 析构函数

c++中的虚函数有啥作用?

TypeScript 类方法具有与构造函数相同的重载签名