2013-07-30 2 views
1

Я иногда вижу это:Когда целесообразно использовать несколько пунктов назначения в одном задании?

int a = 1; 
int b = 2; 

a = b = 3; //assign 3 to a and b. 

Я думаю, что это не очень хорошая идея, но я вижу это сделать. Похоже, что лучше заявить

a = 3; 
b = 3; 

Таким образом, ясно позже читателей, что это то, что происходит.

Следует ли избегать таких присвоений или есть ситуации, когда такие назначения предпочтительнее?

Редактировать После рассмотрения замечаний и ответ, я думаю, что более точный вопрос: ли = Int А INTB = 3 так же, как расщепление на несколько строк?

Ответ, для примитивных типов, да, это то же самое. Поэтому использовать или не использовать - это предпочтение.

Для ссылочных типов ответ отрицательный, это не то же самое.

ref = ref = new Ref() приводит к двум ссылкам на один и тот же объект.

ref = new Ref(); 
ref = new Ref(); 

результаты в двух новых объектах. Таким образом, законно использовать, если две ссылки на объекты - это то, что вы действительно намеревались. Помимо этого, это предпочтение.

Я не вижу других различий между ними.

+7

Вопрос мнения, не относящийся к SO. – EkoostikMartin

+0

Я не согласен, лучшие практики важны для кодирования, и это то, о чем я прошу. –

+1

Это скорее стандарт кодирования ... Обычно я избегаю нескольких назначений. Их трудно отлаживать и подвергать ошибкам. –

ответ

0

Бывают ситуации, когда несколько назначений определенно неуместны. Например, следующее никогда не должно быть сделано:

decimal speed; 
decimal distance; 
speed = distance = 0M; // <<== This compiles, but it is very, very wrong. 

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

// You can do this 
MyClass smallest; 
MyClass largest; 
smallest = new MyClass(); 
largest = smallest; 
// However, this conveys the idea slightly better: 
MyClass smallest; 
MyClass largest; 
smallest = largest = new MyClass(); 

Хотя технически это не то же самое, родственная ситуация, когда несколько присваивания обеспечивает лучшую читаемость, когда вы кэшировать результат:

MyClass res = cached ?? (cached = Compute()); 

В этом случае назначение Compute() на res также изменяется cached, если только cached не имеет значения null.

+0

Приятная работа, получившая ваш ответ там перед тем, как дверь снова была закрыта. лол. Кроме того, как я уже говорил в комментариях, я считаю, что примитивные типы - это единственные типы переменных, которые я бы назначил в одной строке. Угадайте, что эта тема во многом основана на мнениях. – seekerOfKnowledge

+0

Ваш ответ показывает, почему вопрос должен быть закрыт, _ «Это компилируется, но это очень и очень неправильно». Я думаю, что все в порядке. только мнение! – gdoron

+0

@ gdoron Ты шутишь! Вы действительно думаете, что присвоение 'distance'' speed' в порядке, просто потому, что они представлены одним и тем же числом? – dasblinkenlight

Смежные вопросы