Call one constructor from another
我有两个构造函数,它们向只读字段提供值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Sample { public Sample(string theIntAsString) { int i = int.Parse(theIntAsString); _intField = i; } public Sample(int theInt) { _intField = theInt; } public int IntProperty { get { return _intField; } } private readonly int _intField; } |
一个构造函数直接接收值,另一个进行计算并获取值,然后设置字段。
下面是要点:
有什么想法吗?
这样地:
1 2 | public Sample(string str) : this(int.Parse(str)) { } |
如果没有在自己的方法中进行初始化(例如,因为在初始化代码之前要做的太多,或者用try finally或其他任何方法包装它),则可以让任何或所有构造函数通过引用初始化例程来传递只读变量,这样就可以随意操纵它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Sample { private readonly int _intField; public int IntProperty { get { return _intField; } } void setupStuff(ref int intField, int newValue) { intField = newValue; } public Sample(string theIntAsString) { int i = int.Parse(theIntAsString); setupStuff(ref _intField,i); } public Sample(int theInt) { setupStuff(ref _intField, theInt); } } |
在构造函数主体之前,请使用以下任一项:
1 2 3 | : base (parameters) : this (parameters) |
例子:
1 2 3 4 5 6 7 | public class People: User { public People (int EmpID) : base (EmpID) { // Add more statements here. } } |
我正在改进Supercat的答案。我想也可以做到以下几点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class Sample { private readonly int _intField; public int IntProperty { get { return _intField; } } void setupStuff(ref int intField, int newValue) { //Do some stuff here based upon the necessary initialized variables. intField = newValue; } public Sample(string theIntAsString, bool? doStuff = true) { //Initialization of some necessary variables. //========================================== int i = int.Parse(theIntAsString); // ................ // ....................... //========================================== if (!doStuff.HasValue || doStuff.Value == true) setupStuff(ref _intField,i); } public Sample(int theInt): this(theInt, false) //"false" param to avoid setupStuff() being called two times { setupStuff(ref _intField, theInt); } } |
下面是一个调用另一个构造函数的示例,然后检查它所设置的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public SomeClass(int i) { I = i; } public SomeClass(SomeOtherClass soc) : this(soc.J) { if (I==0) { I = DoSomethingHere(); } } |
是的,你可以在调用库或这个之前调用其他方法!
1 2 3 4 5 6 7 8 9 10 11 12 | public class MyException : Exception { public MyException(int number) : base(ConvertToString(number)) { } private static string ConvertToString(int number) { return number.toString() } } |
当从基类继承类时,可以通过实例化派生类来调用基类构造函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class sample { public int x; public sample(int value) { x = value; } } class der : sample { public int a; public int b; public der(int value1,int value2) : base(50) { a = value1; b = value2; } } class run { public static void Main(string[] args) { der obj = new der(10,20); System.Console.WriteLine(obj.x); System.Console.WriteLine(obj.a); System.Console.WriteLine(obj.b); } } |
样本程序的输出是
50 10 20
也可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
这个示例程序的输出是
20
构造函数链接,也就是说,当您希望在单个调用中调用多个构造函数时,可以将"base"用于关系,将"this"用于同一类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class BaseClass { public BaseClass():this(10) { } public BaseClass(int val) { } } class Program { static void Main(string[] args) { new BaseClass(); ReadLine(); } } |