2016-05-02 4 views
1

Я создал функцию для одновременного задания нескольких свойств объекта. Если какой-либо аргумент не передается функции, я хочу избежать его установки/изменения. Упрощенный пример чистейшей решение, которое я мог придумать это:Передача null в качестве параметра по умолчанию во избежание использования параметра

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

Почему метод перегрузки существует тогда? Я бы сохранил стандарт, поэтому любой, кто смотрит на код, знает, что происходит. –

+1

@FirstStep. Если было 5 свойств, вам понадобится 32 перегрузки для всех случаев. – Rob

+0

это не 1 или 2 или 3 или 4 или 5? @rob –

ответ

4

я упускаю некоторые очевидные функции в C#, что позволяет мне сказать: «Не устанавливайте этот параметр, если нет ничего перешел к соответствующему аргументу "?

Не в пятно оператора, но очевидно, что вы можете сделать

if(param2.HasValue) myObject.param2 = (bool)param2; 

Единственная разница, если у вас есть какой-либо логики в вашем инкубаторе она не будет называться в этом случае, если параметр является нулевым ,

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); 
2

Попробуйте оператор нуль-коалесцирующий ??:

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); 
+0

AGB имеет право - именованные параметры являются гладкими! – Michael

0

почему две идеи пришли в голову, когда я прочитал ваш пост.

Первая идея какая-то беглый метод строитель а-ля это сообщение: https://stackoverflow.com/a/10046750/2835914

var result = NinjaBuilder.Build().WithSuperCoolProperties(param1).SoOn().SoForth(); 

В качестве альтернативы вы можете пропускать

dictionary<string,object>()

, что затем будет условно применяться основанные на их имени для вашего объекта.

private void setObjectProperties(MyObject myObject, dictionary<string,object> properties) 
{ 
    if(properties.ContainsKey("param2")) 
    { 
     myObject.param2 = properties["param2"]; 
    } 
    //So on down the line 
}