2009-12-04更新:有关在此处发布的一些建议的分析结果,请参阅下文!
考虑以下非常无害,非常简单的方法,它使用switch语句返回定义的枚举值:
public static MarketDataExchange GetMarketDataExchange(string ActivCode) {
if (ActivCode == null) return MarketDataExchange.NONE;
switch (ActivCode) {
case "": return MarketDataExchange.NBBO;
case "A": return MarketDataExchange.AMEX;
case "B": return MarketDataExchange.BSE;
case "BT": return MarketDataExchange.BATS;
case "C": return MarketDataExchange.NSE;
case "MW": return MarketDataExchange.CHX;
case "N": return MarketDataExchange.NYSE;
case "PA": return MarketDataExchange.ARCA;
case "Q": return MarketDataExchange.NASDAQ;
case "QD": return MarketDataExchange.NASDAQ_ADF;
case "W": return MarketDataExchange.CBOE;
case "X": return MarketDataExchange.PHLX;
case "Y": return MarketDataExchange.DIRECTEDGE;
}
return MarketDataExchange.NONE;
}
Run Code Online (Sandbox Code Playgroud)
我和我的同事今天就如何更快地实现这个方法的几个想法进行了斗争,并且我们想出了一些有趣的修改,实际上相当显着地提高了它的性能(当然,按比例说).我有兴趣知道那里的其他人可以想到哪种优化可能没有发生在我们身上.
接下来,让我简单地提供一个快速免责声明:这是为了好玩 …
切换枚举时,您的程序是什么?每个枚举都包含在案例中?理想情况下,您希望代码能够成为未来的证明,您是如何做到的?
另外,如果一些白痴向枚举类型转换了一个任意的int呢?是否应该考虑这种可能性?或者我们是否应该假设在代码审查中会发现这样一个令人震惊的错误?
enum Enum
{
Enum_One,
Enum_Two
};
Special make_special( Enum e )
{
switch( e )
{
case Enum_One:
return Special( /*stuff one*/ );
case Enum_Two:
return Special( /*stuff two*/ );
}
}
void do_enum( Enum e )
{
switch( e )
{
case Enum_One:
do_one();
break;
case Enum_Two:
do_two();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
assert(false);我特别感兴趣的是你为什么选择这样做.
我想知道是否有一种简单的方法可以在Windows批处理文件中执行分支,具体取决于单个表达式的值.类似于C,C++,C#,Java,JavaScript,PHP和其他真实编程语言中的switch/case块的东西.
我唯一的解决方法是一个简单的if/else块,其中重复检查相同的表达式是否与不同的值相等:
IF "%ID%"=="0" (
REM do something
) ELSE IF "%ID%"=="1" (
REM do something else
) ELSE IF "%ID%"=="2" (
REM do another thing
) ELSE (
REM default case...
)
Run Code Online (Sandbox Code Playgroud)
如此愚蠢.有更好的解决方案吗?
我是Python的新手.请解释为什么python没有switch-case?
我最近了解到开关语句在OOP中很糟糕,特别是罗伯特·马丁的"清洁代码"(第37-39页).
但请考虑这个场景:我正在编写一个游戏服务器,接收来自客户端的消息,其中包含一个表示玩家行为的整数,例如移动,攻击,挑选项目......等等,将有超过30种不同的动作.当我编写代码来处理这些消息时,没有想到我想到的解决方案,它将不得不在某处使用switch.如果不切换语句,我应该使用什么模式?
看来它可以用C#,但我需要用C++,最好是跨平台.
基本上,我有一个开关,可以根据单个条件对内容进行排序,并在其他所有内容上回退到默认处理.
说:
switch(color)
{
case GREEN:
case RED:
case BLUE:
Paint();
break;
case YELLOW:
if(AlsoHasCriteriaX)
Paint();
else
goto default;
break;
default:
Print("Ugly color, no paint.")
break;
}
Run Code Online (Sandbox Code Playgroud) 这是一个用C++编写的面试问题:
编写自动售货机的代码:从一个简单的代码开始,它只是出售一种类型的商品.所以两个状态变量:金钱和库存,都可以.
我的答案:
我会使用一个有3-4种状态的状态机.使用枚举变量来指示状态并使用switch case语句,其中每个case都有对应于每个状态的操作,并保持循环以从一个状态移动到另一个状态.
下一个问题:
但是,对于添加的更多状态和修改状态中的现有操作,使用switch case语句不能"很好地扩展".你打算如何处理这个问题?
我当时无法回答这个问题.但后来想到,我可能:
std::mapfrom(string,function),其中string表示调用相应状态函数的状态. 我的问题是:
面试问题是期待C++习语的答案和大型软件系统的设计模式.
Java 7支持切换,Strings如下面的代码
switch (month.toLowerCase()) {
case "january":
monthNumber = 1;
break;
case "february":
monthNumber = 2;
break;
default:
monthNumber = 0;
break;
}
Run Code Online (Sandbox Code Playgroud)
Java是否equals()在每种String情况下调用该方法?或者,它依赖于==或intern()?
这简单地等同于:
String month = month.toLowerCase();
if("january".equals(month)){
monthNumber = 1;
}else if("february".equals(month)){
monthNumber = 1;
}..
Run Code Online (Sandbox Code Playgroud)
更新:
将switch表达式中的String与每个case标签关联的表达式进行比较,就好像
String.equals正在使用该方法一样.
正如文档所指出的那样,行为就像equals()被调用一样.
我有一个名为Country的对象.在程序的某个时刻,我想设置每个对象的场强.
每个国家的权力是固定的,我在一张纸上有所有196个国家的数据.例如,我的代码应该检查国家/地区的名称是否为USA(如果是,则将其功率设置为100),依此类推.
我知道我可以用开关盒做到这一点,但是最好,最好,最有效的方法是什么?
我们正在接受GCC 7的警告,因为它在switch语句中是隐含的.以前,我们在Clang下清除它们(这是下面评论的原因):
g++ -DNDEBUG -g2 -O3 -std=c++17 -Wall -Wextra -fPIC -c authenc.cpp
asn.cpp: In member function ‘void EncodedObjectFilter::Put(const byte*, size_t)’:
asn.cpp:359:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
m_state = BODY; // fall through
^
asn.cpp:361:3: note: here
case BODY:
^~~~
Run Code Online (Sandbox Code Playgroud)
在GCC手册状态使用__attribute__ ((fallthrough)),但它不便于携带.该手册还指出"...也可以添加一个通过注释来消除警告",但它只提供FALLTHRU(这真的是唯一的选择吗?):
switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:
…
}
Run Code Online (Sandbox Code Playgroud)
对于Clang和GCC,是否有通过警告来清除坠落的便携方法?如果是的话那么它是什么?
switch-statement ×10
c++ ×4
c# ×2
batch-file ×1
case ×1
coding-style ×1
enums ×1
equals ×1
gcc ×1
goto ×1
idioms ×1
java ×1
oop ×1
optimization ×1
python ×1
string ×1
warnings ×1