将 null 作为默认参数传递以避免使用参数
Passing null as default parameter to avoid using parameter
我创建了一个函数来一次设置一个对象的多个属性。如果某个参数没有传递给函数,那么我想避免 setting/changing 它。我能想到的最干净的解决方案的一个简化示例是:
private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null)
{
myObject.param1 = param1;
myObject.param2 = param2 != null ? (bool)param2 : myObject.param2;
}
正如您从这个方法中看到的,如果在没有传递 param2
的情况下调用函数,那么它只会将 myObject.param2
设置为自身。 (这意味着如果没有任何内容传递给 param2
,那么 myObject.param2
属性 将保持不变)
我觉得我的东西有点乱。我不确定这是否是 'correct' 要做的事情。我考虑过方法重载,但我认为这会更加混乱;在现实世界的情况下,我传递了两个以上的要设置的参数,所以我最终可能会遇到很多重载。
我是否缺少 C# 中允许我说 "Don't set this parameter if nothing is passed to it's corresponding argument" 的一些明显功能?
这样做:
private void setObjectProperties(float? param1 = null, bool? param2 = null)
{
if (param1.HasValue) {
this.param1 = param1.Value;
}
if (param2.HasValue) {
this.param2 = param2.Value;
}
}
然后:
MyObject myObject = new MyObject();
myObject.setObjectProperties(param1: 1.2f);
myObject.setObjectProperties(param2: true);
myObject.setObjectProperties(param1: 1.2f, param2: true);
Am I missing some obvious functionality in C# that allows me to say "Don't set this parameter if nothing is passed to it's corresponding argument"?
不是一个圆滑的操作员,但显然你可以做到
if(param2.HasValue) myObject.param2 = (bool)param2;
唯一真正的区别是,如果您的 setter 中有任何逻辑,则在这种情况下如果参数为 null,则不会调用它。
尝试空合并运算符 ??
:
private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null, bool? param3 = null)
{
myObject.param1 = param1;
myObject.param2 = param2 ?? myObject.param2;
myObject.param3 = param3 ?? myObject.param3;
}
你可以这样调用
foo.setObjectProperties(myobj, param1,
param2: p2,
param3: p3);
我创建了一个函数来一次设置一个对象的多个属性。如果某个参数没有传递给函数,那么我想避免 setting/changing 它。我能想到的最干净的解决方案的一个简化示例是:
private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null)
{
myObject.param1 = param1;
myObject.param2 = param2 != null ? (bool)param2 : myObject.param2;
}
正如您从这个方法中看到的,如果在没有传递 param2
的情况下调用函数,那么它只会将 myObject.param2
设置为自身。 (这意味着如果没有任何内容传递给 param2
,那么 myObject.param2
属性 将保持不变)
我觉得我的东西有点乱。我不确定这是否是 'correct' 要做的事情。我考虑过方法重载,但我认为这会更加混乱;在现实世界的情况下,我传递了两个以上的要设置的参数,所以我最终可能会遇到很多重载。
我是否缺少 C# 中允许我说 "Don't set this parameter if nothing is passed to it's corresponding argument" 的一些明显功能?
这样做:
private void setObjectProperties(float? param1 = null, bool? param2 = null)
{
if (param1.HasValue) {
this.param1 = param1.Value;
}
if (param2.HasValue) {
this.param2 = param2.Value;
}
}
然后:
MyObject myObject = new MyObject();
myObject.setObjectProperties(param1: 1.2f);
myObject.setObjectProperties(param2: true);
myObject.setObjectProperties(param1: 1.2f, param2: true);
Am I missing some obvious functionality in C# that allows me to say "Don't set this parameter if nothing is passed to it's corresponding argument"?
不是一个圆滑的操作员,但显然你可以做到
if(param2.HasValue) myObject.param2 = (bool)param2;
唯一真正的区别是,如果您的 setter 中有任何逻辑,则在这种情况下如果参数为 null,则不会调用它。
尝试空合并运算符 ??
:
private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null, bool? param3 = null)
{
myObject.param1 = param1;
myObject.param2 = param2 ?? myObject.param2;
myObject.param3 = param3 ?? myObject.param3;
}
你可以这样调用
foo.setObjectProperties(myobj, param1,
param2: p2,
param3: p3);