对于想了解为什么不能在字符串上使用switch语句?的读者,本文将提供新的信息,我们将详细介绍switch方法不能用字符串,并且为您提供关于c–为什么switch语句不能应用于字符串?、c#–为什么我
对于想了解为什么不能在字符串上使用switch语句?的读者,本文将提供新的信息,我们将详细介绍switch方法不能用字符串,并且为您提供关于c – 为什么switch语句不能应用于字符串?、c# – 为什么我不能在范围内的switch语句中使用“常量”?、c# – 如何消除Switch语句?、c# – 过度使用switch语句开销的有价值信息。
本文目录一览:- 为什么不能在字符串上使用switch语句?(switch方法不能用字符串)
- c – 为什么switch语句不能应用于字符串?
- c# – 为什么我不能在范围内的switch语句中使用“常量”?
- c# – 如何消除Switch语句?
- c# – 过度使用switch语句开销
为什么不能在字符串上使用switch语句?(switch方法不能用字符串)
此功能是否将在以后的Java版本中使用?
有人可以解释为什么我不能这样做吗,就像Java switch
语句起作用的技术方式一样?
答案1
小编典典带有String
案例的switch语句已在Java SE 7中实现,至少在首次提出要求后的 16年。没有提供延迟的明确原因,但可能与性能有关。
在JDK 7中实现
现在,该功能已javac
通过“脱糖”过程实现。String
在case
声明时使用常量的干净,高级语法在编译时扩展为遵循模式的更复杂的代码。生成的代码使用始终存在的JVM指令。
switch
带有Stringcase
的A 在编译期间转换为两个开关。第一个将每个字符串映射到一个唯一的整数-它在原始开关中的位置。这是通过首先打开标签的哈希码来完成的。相应的情况是if测试字符串是否相等的语句;如果哈希上有冲突,则测试为级联if-else-if。第二个开关在原始源代码中进行镜像,但是用相应的位置替换了大小写标签。此两步过程使保留原始交换机的流量控制变得容易。
在JVM中切换
有关的更多技术深度switch
,请参考JVM规范,其中描述了switch语句的编译。简而言之,有两种不同的JVM指令可用于切换,具体取决于案例使用的常量的稀疏性。两者都依赖于每种情况下使用整数常量来有效执行。
如果常量密集,则将它们用作指令指针表(指令)的索引(减去最小值后)tableswitch
。
如果常量稀疏,则对lookupswitch
指令的正确大小写进行二进制搜索。
在switch
对String
物体进行脱糖时,可能会同时使用这两种指令。在lookupswitch
对散列码的第一开关以找到的情况下的原始位置是合适的。由此产生的序数是自然适合tableswitch
。
两条指令都要求在编译时对分配给每种情况的整数常量进行排序。在运行时,虽然O(1)性能tableswitch
一般显得比更好O(log(n))
的性能lookupswitch
,它需要一些分析,以确定该表是否是密集足以证明时空权衡。Bill Venners撰写了一篇很棒的文章,其中更详细地介绍了此内容,同时还深入介绍了其他Java流程控制指令。
在JDK 7之前
在JDK 7之前,enum
可以近似String
基于的开关。这将使用编译器针对每种类型生成的静态valueOf
方法enum
。例如:
Pill p = Pill.valueOf(str);switch(p) { case RED: pop(); break; case BLUE: push(); break;}
c – 为什么switch语句不能应用于字符串?
int main() { // Compilation error - switch expression of type illegal switch(std::string("raj")) { case"sda": } }
您不能在开关或大小写中使用字符串.为什么?是否有任何解决方案可以很好地支持类似于切换字符串的逻辑?
解决方法
为了生成switch语句的代码,编译器必须理解两个值相等的含义.对于像int和enums这样的项目,这是一个微不足道的比较.但是编译器应该如何比较2个字符串值呢?区分大小写,不敏感,文化意识等…如果没有完全意识到字符串,则无法准确回答.
另外,C/C++ switch语句通常生成为branch tables.为字符串样式开关生成分支表并不那么容易.
c# – 为什么我不能在范围内的switch语句中使用“常量”?
public partial class Form1 : Form { private static readonly int TABCONTROL_BASICINFO = 0; private static readonly int TABCONTROL_CONFIDENTIALINFO = 1; private static readonly int TABCONTROL_ROLESANDSecurity = 2; private static readonly int TABCONTROL_INACTIVEINFO = 3; . . . int ActiveTabPage = tabControlWorker.Selectedindex; switch (ActiveTabPage) { case TABCONTROL_BASICINFO: if (currentNode == "NodeBuckingham") { } else if (currentNode == "NodeNamath") { } else if (currentNode == "NodeParsons") { } else { } break;
…我必须用“0”替换“TABCONTROL_BASICINFO”,或者我得到,“一个常数值是
预期”
天堂到Murgatroyd!看不到TABCONTROL_BASICINFO是0吗?
解决方法
// Note that static readonly is implied here private const int TABCONTROL_BASICINFO = 0;
或遵循.NET命名规则…
private const int TabControlBasicInfo = 0;
或者使用枚举,因为您基本上有一组固定值:
private enum TabControlType { // Could ditch the explicit values here if you want BasicInfo = 0,ConfidentialInfo = 1,... }
顺便说一句,你也可以在C#中打开字符串,所以这样:
if (currentNode == "NodeBuckingham") { } else if (currentNode == "NodeNamath") { } else if (currentNode == "NodeParsons") { } else { }
可以变成:
switch (currentNode) { case "NodeBuckingham": ... break; case "NodeNamath": ... break; case "NodeParsons": ... break; default: ... break; }
c# – 如何消除Switch语句?
根据选项卡的Selectedindex,我需要更改3个以下图像的不透明度.
截至目前,我在Tab控件的SelectionChanged事件中有这样的事情:
switch (Tab.Selectedindex) { case 0: img1.Opacity= 1; img2.Opacity = 0.5; img3.Opacity = 0.5; break; case 1: img1.Opacity = 0.5; img2.Opacity = 1; img3.Opacity = 0.5; break; case 2: img1.Opacity = 0.5; img2.Opacity = 0.5; img3.Opacity = 1; break; }
如何删除此switch语句?我应该在这里使用哪种设计模式?
解决方法
此外,如果您希望此单元可测试,则应使用MVVM模式,您将在其中定义Selectedindex的属性,viewmodel中的不透明度并将它们绑定到xaml
c# – 过度使用switch语句开销
<Item control="Dropdown" action="Click" value=""/> <Item control="Button" action="GetText" value=""/> <Item control="Input" action="WriteText" value="Sample Text"/>
我将使用很多控件,每个控件都有几个方法,如Click,GetText,Exsists ..
目前我使用开关来处理它,但我听说这不是一个好习惯.我有一个开关来选择特定的控制,每个控件都切换到调用特定的方法.
switch (control) { case "button": return new Button; case "table": return new Table; (...) } (...) switch (action) { case "click": this.Click(); return true; case "gettext": this.GetText(); return true; default: return false; }
我没有太多的编码经验,所以我不确定这是否是处理这个问题的好方法.你能给我一些建议怎么做得更好吗?也许有一些编码模式在这里有用吗?
解决方法
namespace SomeNamespace { class Button { } public void Click(){ } }
然后当你阅读XML
//assemblyName is the full name of the assembly holding your control classes var type = System.GetType(assemblyName,"SomeNamespace." + control); var control = Activator.CreateInstance(type); //requires a default constructor type.getmethod(methodName).Invoke(control); //methodName Could be click
今天关于为什么不能在字符串上使用switch语句?和switch方法不能用字符串的讲解已经结束,谢谢您的阅读,如果想了解更多关于c – 为什么switch语句不能应用于字符串?、c# – 为什么我不能在范围内的switch语句中使用“常量”?、c# – 如何消除Switch语句?、c# – 过度使用switch语句开销的相关知识,请在本站搜索。
本文标签: