GVKun编程网logo

为什么不能在字符串上使用switch语句?(switch方法不能用字符串)

11

对于想了解为什么不能在字符串上使用switch语句?的读者,本文将提供新的信息,我们将详细介绍switch方法不能用字符串,并且为您提供关于c–为什么switch语句不能应用于字符串?、c#–为什么我

对于想了解为什么不能在字符串上使用switch语句?的读者,本文将提供新的信息,我们将详细介绍switch方法不能用字符串,并且为您提供关于c – 为什么switch语句不能应用于字符串?、c# – 为什么我不能在范围内的switch语句中使用“常量”?、c# – 如何消除Switch语句?、c# – 过度使用switch语句开销的有价值信息。

本文目录一览:

为什么不能在字符串上使用switch语句?(switch方法不能用字符串)

为什么不能在字符串上使用switch语句?(switch方法不能用字符串)

此功能是否将在以后的Java版本中使用?

有人可以解释为什么我不能这样做吗,就像Java switch语句起作用的技术方式一样?

答案1

小编典典

带有String案例的switch语句已在Java SE 7中实现,至少在首次提出要求后的 16年。没有提供延迟的明确原因,但可能与性能有关。

在JDK 7中实现

现在,该功能已javac 通过“脱糖”过程实现。Stringcase声明时使用常量的干净,高级语法在编译时扩展为遵循模式的更复杂的代码。生成的代码使用始终存在的JVM指令。

switch带有Stringcase的A 在编译期间转换为两个开关。第一个将每个字符串映射到一个唯一的整数-它在原始开关中的位置。这是通过首先打开标签的哈希码来完成的。相应的情况是if测试字符串是否相等的语句;如果哈希上有冲突,则测试为级联if-else-if。第二个开关在原始源代码中进行镜像,但是用相应的位置替换了大小写标签。此两步过程使保留原始交换机的流量控制变得容易。

在JVM中切换

有关的更多技术深度switch,请参考JVM规范,其中描述了switch语句的编译。简而言之,有两种不同的JVM指令可用于切换,具体取决于案例使用的常量的稀疏性。两者都依赖于每种情况下使用整数常量来有效执行。

如果常量密集,则将它们用作指令指针表(指令)的索引(减去最小值后)tableswitch

如果常量稀疏,则对lookupswitch指令的正确大小写进行二进制搜索。

switchString物体进行脱糖时,可能会同时使用这两种指令。在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语句不能应用于字符串?

c – 为什么switch语句不能应用于字符串?

编译以下代码并得到类型非法的错误.
int main()
{
    // Compilation error - switch expression of type illegal
    switch(std::string("raj"))
    {
    case"sda":
    }
}

您不能在开关或大小写中使用字符串.为什么?是否有任何解决方案可以很好地支持类似于切换字符串的逻辑?

解决方法

之所以与类型系统有关. C/C++并不真正支持字符串作为一种类型.它确实支持常量char数组的想法,但它并不完全理解字符串的概念.

为了生成switch语句的代码,编译器必须理解两个值相等的含义.对于像int和enums这样的项目,这是一个微不足道的比较.但是编译器应该如何比较2个字符串值呢?区分大小写,不敏感,文化意识等…如果没有完全意识到字符串,则无法准确回答.

另外,C/C++ switch语句通常生成为branch tables.为字符串样式开关生成分支表并不那么容易.

c# – 为什么我不能在范围内的switch语句中使用“常量”?

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吗?

解决方法

如果要使编译器成为常量表达式,请将其声明为const:
// 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语句?

c# – 如何消除Switch语句?

我有一个标签控件,有3个标签页.在同一表格/视图下的此选项卡控件下方,我有3个图像控件.

根据选项卡的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语句?我应该在这里使用哪种设计模式?

解决方法

我认为你可以通过使用触发器在你的xaml中处理这个问题.

此外,如果您希望此单元可测试,则应使用MVVM模式,您将在其中定义Selectedindex的属性,viewmodel中的不透明度并将它们绑定到xaml

c# – 过度使用switch语句开销

c# – 过度使用switch语句开销

我有xml文件,其中包含必须在html控件上执行的特定步骤和操作:

<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语句开销的相关知识,请在本站搜索。

本文标签: