我创建了一个函数来一次设置对象的多个属性。如果某个参数没有传递给函数,那么我想避免设置/更改它。我能提出的最简洁解决方案的简化示例是:
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
属性不受影响)
对我来说,我看起来有点乱。我不确定这是不是'正确'的事情。我考虑过方法重载,但我认为这会更加混乱;在现实世界的情况下,我传递了两个以上的参数,因此我可能会遇到很多重载。
我是否在C#中遗漏了一些明显的功能,它允许我说“如果没有任何内容传递给它的相应参数,请不要设置此参数”?
答案 0 :(得分:4)
我是否在C#中遗漏了一些明显的功能,这些功能允许我说"如果没有任何内容传递给它,请不要设置此参数"?
不是一个光滑的操作员,但显然你可以做
if(param2.HasValue) myObject.param2 = (bool)param2;
唯一真正的区别是如果你的setter中有任何逻辑,如果参数为null,则不会在这种情况下调用它。
答案 1 :(得分:2)
尝试null-coalescing运算符??
:
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);
答案 2 :(得分:0)
这样做:
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);