如何在C#中使用类的单个实例调用不同的构造函数?
关于单个实例调用两个构造函数的说明
嘿,我来给你理清楚这个问题哈!首先得明确一个核心点:一个对象实例在生命周期里只能被构造一次,构造函数的作用就是初始化刚创建的新对象。你代码里的C1其实是个变量,它先后指向了两个不同的Customer实例,并不是同一个实例调用了两次构造函数哦。
不过你的代码里已经用到了一个非常棒的技巧——构造函数链,让无参构造函数复用带参构造的逻辑,这可是C#里减少重复代码的最佳实践之一!
拆解你的代码逻辑
咱们一步步来分析:
1. Customer类的构造函数设计
public Customer() : this("No firstname","No lastname") { } public Customer(string FirstName, string LastName) { this._firstName = FirstName; this._lastName = LastName; }
这里的: this(...)语法,是让无参构造函数直接调用带参构造函数。这样不管你是调用无参还是带参构造,最终都会走到带参构造的初始化逻辑,避免了写两遍相同的赋值代码,非常聪明!
2. Main方法中的实例创建
Customer C1 = new Customer(); // 第一次创建新实例,调用无参构造(间接触发带参构造) C1.PrintFullName(); C1 = new Customer(); // 第二次创建全新的实例,再次调用无参构造(又一次触发带参构造) C1.PrintFullName();
这里的C1变量只是先后引用了两个完全不同的Customer对象。第一个对象在C1被重新赋值后,就会被.NET的垃圾回收器标记为可回收,并不是同一个实例跑了两次构造函数。
如果你想让同一个实例"重置"初始化状态?
要是你的需求是让已经创建好的实例重新执行类似构造函数的初始化逻辑,那不如把初始化逻辑抽成一个单独的方法,比如这样:
class Customer { string _firstName; string _lastName; public Customer() : this("No firstname","No lastname") { } public Customer(string FirstName, string LastName) { Initialize(FirstName, LastName); } // 把初始化逻辑抽出来成私有方法 private void Initialize(string firstName, string lastName) { this._firstName = firstName; this._lastName = lastName; } // 对外提供一个重置到默认值的方法 public void ResetToDefault() { Initialize("No firstname", "No lastname"); } // 也可以提供自定义重置的方法 public void Reset(string firstName, string lastName) { Initialize(firstName, lastName); } public void PrintFullName() { Console.WriteLine("Full Name is {0}", this._firstName+" "+this._lastName); } }
然后在Main方法里,就可以对同一个实例反复重置状态了:
public static void Main() { Customer C1 = new Customer("Alice", "Smith"); C1.PrintFullName(); // 输出:Full Name is Alice Smith C1.ResetToDefault(); C1.PrintFullName(); // 输出:Full Name is No firstname No lastname C1.Reset("Bob", "Jones"); C1.PrintFullName(); // 输出:Full Name is Bob Jones }
这样就实现了同一个实例重复执行初始化逻辑的效果,不用每次都创建新实例啦。
内容的提问来源于stack exchange,提问作者UV009
相关产品推荐
相关产品推荐

