Csharp/C#教程:在发送到Base构造函数之前修改参数值分享


在发送到Base构造函数之前修改参数值

标题可能有点含糊不清,但我想不出更好的方法来说明这一点。

我意识到在调用基础构造函数之前我不能调用派生构造函数,但是我可以在将它们传递给基础之前以某种方式修改/创建参数值吗?

例如,

public enum InputType { Number = 1, String = 2, Date = 3 } public class BaseClass { public BaseClass(InputType t) { // Logic } } public class DerivedClass : BaseClass { public DerivedClass(int i) : base(value) // Can I do something to infer what value should be here? { // Logic } } 

如果我有一个派生类,可以推断出基础构造函数所需的值(在这个例子中, InputType.Numberint有效),有没有办法修改和/或创建传递给基础构造函数的值在派生构造函数执行之前?

我希望你可以在基类构造函数的参数列表中调用静态方法。

 public class DerivedClass : BaseClass { public DerivedClass(int i) : base(ChooseInputType(i)) { } private static InputType ChooseInputType(int i) { // Logic return InputType.Number; } } 

您可以使用静态方法计算要传递给基础构造函数的值。

 public class DerivedClass : BaseClass { public DerivedClass(int i) : base(ComputedValue(i)) { } public static InputType ComputedValue(int i) { return InputType.Number; // or any other computation you want here } } 

您可以在派生类上创建静态方法并将逻辑放在那里:

 public enum InputType { Number = 1, String = 2, Date = 3 } public class BaseClass { public BaseClass(InputType t) { // Logic } } public class DerivedClass : BaseClass { public DerivedClass(int i) : base(GetInputType(i)) { // Is it possible to set "value" here? // Logic } private static InputType GetInputType(Int32 parameter) { // Do something with parameter // and return an InputType return (InputType)Enum.Parse(typeof(InputType), parameter); } } 

是。 可以使用不访问实例的普通表达式来操作该值。 例如

 public DerivedClass(int i) : base((InputType)i) { } 

在不引入单独的静态方法的情况下将任意逻辑放在base()子句中的一种方法是使用lambda或匿名委托。 base()的表达式在所有构造函数参数的范围内,因此您可以在lambda中自由使用它们。 例如(假设这是C#2.0,所以没有LINQ为同一件事写一个单行程):

 class Base { public Base(int[] xs) {} } class Derived : Base { public Derived(int first, int last) : base( ((Func)delegate { List xs = new List(); for (int x = first; x < last; ++x) { xs.Add(x); } return xs.ToArray(); })()) { } } 

但是,我强烈建议不要在实践中使用它,因为从可读性的角度来看,这真的太可怕了。 使用静态方法,您需要显式地将构造函数参数传递给它,但它通常不会超过3-4个。

没有。

基础构造函数在DerivedClass构造函数中的任何逻辑之前运行,因此无法注入逻辑。

但是,您可以运行基类构造函数,然后在dervied类的构造函数中设置基类中的属性,以便更改值。

你说

我意识到在调用基础构造函数之前我无法调用派生构造函数

但是你会显示这段代码

 public DerivedClass(int i) : base(value) { // Is it possible to set "value" here? // Logic } 

输入该代码块后,您的基类构造函数已经运行。 但是,您可以在将表达式传递给基础构造函数之前修改表达式中的值(具有一些明显的约束)。 但是,除非是构造函数的输入,否则您将无法访问“value”。

上述就是C#学习教程:在发送到Base构造函数之前修改参数值分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/954254.html

(0)
上一篇 2021年11月20日
下一篇 2021年11月20日

精彩推荐