当前位置:编程学习 > C#/ASP.NET >>

C#用什么方法可以减少或不使用switch

如:

public string Exec(string mothedName)
        {
            string ret = "";
            switch (mothedName)
            {
                case "get":
                    ret = get();
                    break;
                case"get1":
                    ret = gettest();
                    break;
                    //.....
                case "testget":
                    ret = getrset();
                    break;
            }
            return ret;
        }

        public string get()
        {
            return "get";
        }

        public string gettest()
        {
            return "gettest";
        }

        public string getrset()
        {
            return "getset";
        }

上面的代码我用什么更好的实现方式可以解决不使用Swicth呢?
请高手们帮我指点一下. --------------------编程问答-------------------- 使用委托呗

public string Exec(Func<string> method)
        {

            return method();
        }

调用
Exec(get);
Exec(gettest);
... --------------------编程问答-------------------- 用个Dictionary来代替switch的分支选项。mothedName作为Key --------------------编程问答-------------------- 可以使用反射。
Switch执行效率高,自己斟酌使用场合。 --------------------编程问答-------------------- 为什么不用Switch 
应该是能用Switch的地方都用Switch... --------------------编程问答-------------------- 首先你这个地方根本就不应该用switch,你看你的代码,每添加一个新的方法,都要去修改一次Exec,让这个方法被“识别”,毫无扩展性可言。对比我给你的委托版本,我可以任意定义方法,只要返回string,没有参数,都可以用。事实上,这样的问题如果你能好好把C#语法学全了,自己就能解决。 --------------------编程问答-------------------- 谢谢版主,我理解了. --------------------编程问答-------------------- 题外话。。mothed貌似楼主想说method --------------------编程问答-------------------- 你可以使用委托咯,不过使用Switch看起来代码清晰明了。 --------------------编程问答--------------------
引用 4 楼 zanfeng 的回复:
为什么不用Switch 
应该是能用Switch的地方都用Switch...

真不明白你这两个星星怎么得的? --------------------编程问答-------------------- 常规手法采用Dictionary处理,好比
var handlers = new Dictionary<string, Action>();
handlers['get'] = onGet;
handlers['post'] = onPost;
----
handlers[arg]();

更好的处理方式采用strategy pattern,这个你参考GOF --------------------编程问答-------------------- 反射效率低
switch分支多了,看起来也挺蛋疼的
最好的办法就是委托了,楼上的都讲到了 --------------------编程问答-------------------- switch都可以用if else替代,lz这个最好用发射 --------------------编程问答--------------------
       static string Exec(Func<string> method)
        {
            return method();
        }
        static string funtest1()
        {
            return "";
        }

        static void Main(string[] args)
        {
            Dictionary<string,Func<string>> sc1 = new Dictionary<string, Func<string>>();
            sc1.Add("fun1", funtest1);


            //调用
            Exec(sc1["fun1"]);
}
--------------------编程问答-------------------- Dictionary<string, delegate>或者反射都差不多 --------------------编程问答-------------------- 这样做是可以的,但C#搞个委托是干什么? --------------------编程问答-------------------- 委托相当于函数指针,只不过是安全类型的
好在语法灵活上而且简明
代码里出现太多if else或者switch的话会让代码臃肿难维护 --------------------编程问答-------------------- MARK一下,感觉很有用 --------------------编程问答-------------------- 用反射 长度不够 --------------------编程问答-------------------- 使用工厂设计模式,可参解决方案:
http://www.cnblogs.com/insus/archive/2013/03/04/2942653.html

最终你的程序将为这样子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public string Exec(string mothedName)
    {
        string ret = "";       
        
        //switch (mothedName)
        //{
        //    case "get":
        //        ret = get();
        //        break;
        //    case "get1":
        //        ret = gettest();
        //        break;
        //    //.....
        //    case "testget":
        //        ret = getrset();
        //        break;
        //}

        IGetFactory get = new GetTestFactory();  //这里是实现工厂类
        ret = get.GetResult();
        return ret;
    }

    //public string get()
    //{
    //    return "get";
    //}

    //public string gettest()
    //{
    //    return "gettest";
    //}

    //public string getrset()
    //{
    //    return "getset";
    //}
}


也或参考:
http://www.cnblogs.com/insus/archive/2013/03/03/2941880.html
http://www.cnblogs.com/insus/archive/2013/02/28/2937873.html --------------------编程问答-------------------- switch 很简洁明了为什么不用呢?
除非你要elseif --------------------编程问答-------------------- 通过字符串调用方法是很正常的啊,可以通过反射来实现。
但是反射会造成一定的性能损耗,为提高性能可以对反射得到的method进行缓存。
如果嫌弃缓存占用内存,可以把缓存做成弱引用,比较适中。 --------------------编程问答-------------------- 1,设计模式中的责任链模式就是专门解决此类问题的
2,建立一个字典,存储name和调用方法的委托,上面已有人给出 --------------------编程问答-------------------- 首先一点是要考虑到,能不搞这类所谓的解析(反射)就一定不要这样设计程序。如果这样考虑,那么就不会写很多诡异的switch了。

只有特定的时候才需要。而一个大项目往往只有一两个地方这样写。而绝对不是到处滥用这种代码。 --------------------编程问答-------------------- 没必要刻意减少switch,如果switch更自然,为何不用? --------------------编程问答-------------------- switch可以用吧,简单明了,是嫌代码长了不好看?ls说搞反射或委托,不是反而降低的代码的易读性么 --------------------编程问答-------------------- --------------------编程问答-------------------- 定义一个接口,继承,利用多态 --------------------编程问答--------------------
编程这种事,有时候1,你很难就这样拿出一个代码片断来,然后一堆人就开始评头论足。

不知道楼主是不是要做那种可装配/可配置/插件式的程序。
也不知道switch里面的条件是会经常扩展,还是根本就不变,或者就算扩展也是几年才遇到一次的事情...

这些事情都不清楚,你们就争论开了,我真不明白,你们争个JB呀,这么多事情都还不清楚...

同时也提醒楼主,这些前提条件你是不是也该补充说明一下?

--------------------编程问答-------------------- 委托和反射。
从上面知道还可以用设计模式。 --------------------编程问答--------------------
引用 20 楼 souleyes 的回复:
switch 很简洁明了为什么不用呢?
除非你要elseif

这就像有些人喜欢将代码拷贝复制,把参数改改,连个方法都不写。
--------------------编程问答-------------------- 实际情况而定吧! --------------------编程问答-------------------- 贴的别人的

static void Main(string[] args)
       {
          Console.WriteLine(Exec(GetSet));
          Console.ReadKey();
       }
       //定义委托,用于将方法做为参数传给Exec.
       public delegate string GetResultDelegate();
       public static string Get()
       {
           return "get";
       }
 
       public static string GetTest()
       {
           return "gettest";
       }
 
       public static string GetSet()
       {
           return "getSet";
       }
 
 
       public static string Exec(GetResultDelegate getResult)
       {
           return getResult();
       }
--------------------编程问答-------------------- 好东西啊 为什么不用呢? --------------------编程问答-------------------- 切开一个西瓜,你可以用水果刀,菜刀,电锯,油锯或者手劈。
但还是西瓜刀比较顺手。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,