gpt4 book ai didi

c# - 是否可以在 C# 中限制可选参数的值?

转载 作者:行者123 更新时间:2023-11-30 15:27:00 27 4
gpt4 key购买 nike

C# 允许使用 optional parameters : 可以指定值,以防在调用中省略参数,然后编译器自行指定值。

例子:

public interface IFoo {

void SomeMethod (int para = 0);

}

这个想法很有用,但问题是可以在类层次结构的不同级别上定义多个“默认值”。示例:

public class SubFoo : IFoo {

public void SomeMethod (int para = 1) {
//do something
}

}

如果稍后调用:

SubFoo sf = new SubFoo ();
sf.SomeMethod ();
Foo f = sf;
f.SomeMethod ();

结果是第一次调用是用para完成的等于 1第二个是para等于 0 (作为界面)。这是有道理的,因为编译器添加了默认值,在第一种情况下是 thisSubFoo因此默认值为 1 .

保持一致性当然要靠程序员,但是当程序员在过程中改变主意而忘记修改所有默认值时,这种精神 split 的情况很容易发生。

问题是编译器不会警告正在使用不同的默认值,而这可以通过向上移动类层次结构来检查。此外,有些人可能会模仿默认参数:

public class SubFoo2 {

public virtual void SomeMethod () {
SomeMethod(1);
}

public void SomeMethod (int para) {
//do something
}

}

它允许动态绑定(bind)并因此一致地覆盖。因此,需要非常小心默认值是如何“实现”的。

有没有办法强制(例如使用编译器标志)检查默认值是否一致?如果不是,那么至少有一个警告,说明某些事情并不真正一致。

最佳答案

好吧,这不是必需的编译时解决方案 - 但您可以为此进行单元测试(我怀疑您正在认真对待单元测试,如果您问这类问题,您会经常运行它们)。这个想法是创建断言方法,如 AssertThatDefaultParametersAreEqual(Type forType) - 找到所有不是abstract 的类(使用反射)并从 forType 继承然后迭代所有定义了默认参数的方法:

MethodInfo[] methodInfo = Type.GetType(classType).GetMethods(BindingFlags.OptionalParamBinding | BindingFlags.Invoke);

MethodInfo.Name 对它们进行分组,并检查组内所有具有默认值的相同参数(可以通过 MethodInfo.GetParameters().Where(x => x.IsOptional )) 具有与 ParameterInfo.DefaultValue 相同的属性。

编辑:顺便说一句。这在 Mono 中可能不起作用,因为编译器没有义务发出例如:Optional BindingFlag。

关于c# - 是否可以在 C# 中限制可选参数的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28158498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com