Есть тулбар. Самописный. У него есть несколько режимов отображения (Надписи слева, надписи снизу, без надписей, без картинок). Причем стрелочки для DropDown кнопок — картинки, т.е. в режиме "без картинок" они не отображаются. Чтобы преодолеть это пришлось воспользоваться goto:
switch(labels)
{
case NavigationButtonLabels.Bottom:
//...break;
case NavigationButtonLabels.Edge:
//...break;
case NavigationButtonLabels.NoImages:
if(button.StrongImage) //Если картинка должна всегда отображатьсяgoto case NavigationButtonLabels.Edge; //пускай отображается
//...
break;
case NavigationButtonLabels.NoLabels:
//...break;
}
Это, естественно, заработало. Но какое-то чувство осталось. Скажите, пожалуйста, красиво ли это?
Hello, I'm your mind [[EVANESCENCE — MY IMMORTAL]]
B> switch(labels)
B> {
B> case NavigationButtonLabels.Bottom:
B> //...
B> break;
B> case NavigationButtonLabels.Edge:
B> //...
B> break;
B> case NavigationButtonLabels.NoImages:
B> if(button.StrongImage) //Если картинка должна всегда отображаться
B> goto case NavigationButtonLabels.Edge; //пускай отображается
B> //...
B> break;
B> case NavigationButtonLabels.NoLabels:
B> //...
B> break;
B> }
B>
switch(labels)
{
case NavigationButtonLabels.Bottom:
//...break;
case NavigationButtonLabels.NoImages:
if(!button.StrongImage) //Если картинка не должна всегда отображаться[/b]
{
//....break;
}
//пускай отображается[/b]case NavigationButtonLabels.Edge:
//...break;
case NavigationButtonLabels.NoLabels:
//...break;
}
Badenweiler wrote:
> Это, естественно, заработало. Но какое-то чувство осталось. Скажите, > пожалуйста, красиво ли это?
Нет Если хочется еще что-то более запутанного, то можно сделать так:
switch(labels)
{
case NavigationButtonLabels.NoImages:
*if(!button.StrongImage) //Если картинка НЕ должна всегда
отображаться
{
* break;
}
//А вот тут мы "провалимся" на следущую меткуcase NavigationButtonLabels.Edge:
//...break;
}
А вообще, тут имеет смысл заменить содержимое case'ов на функции и
просто вызвать функцию "Edge".
По-моему, нет.
Я бы поставил NoImages перед Edge и "забыл бы" убрать break или же обернул бы все в функции и их вызывал из кейсов (заодно, если кода много, будет читабельнее)
C>switch(labels)
C>{
C> case NavigationButtonLabels.NoImages:
C> *if(!button.StrongImage) //Если картинка НЕ должна всегда
C>отображаться
C> {
C> * break;
C> }
C> //А вот тут мы "провалимся" на следущую метку
C> case NavigationButtonLabels.Edge:
C> //...
C> break;
C>}
C>
Судя по конструкции goto case в исходном сообщении, это C#. А там проваливаться нельзя, каждый case обязан заканчиваться break’ом, return’ом, throw’ом или goto [case].
Здравствуйте, Centaur, Вы писали:
C>Судя по конструкции goto case в исходном сообщении, это C#. А там проваливаться нельзя, каждый case обязан заканчиваться break’ом, return’ом, throw’ом или goto [case].
В таком случае goto case является более общим аналогом fall-through. Что вполне "красиво" (вспоминая вопрос).
B>а почему бы не воспользоваться полиморфизмом и убрать case вообще?
Видимо, имелась в виду перегрузка?
Честно говоря, по-моему, это не очень хорошая идея — это логически единая вещь, судя по сообщению и "размазывать" реализацю по разным местам таким неявным образом может обеспечить потом много головной боли.
Если все не задокументировать подробнейшим образом, в будущем это породит кучу таинственных багов и проблем с пониманием того как это работает.
Явная диспетчеризация иногда лучше.