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看起来代码清晰明了。 --------------------编程问答--------------------
真不明白你这两个星星怎么得的? --------------------编程问答-------------------- 常规手法采用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)--------------------编程问答-------------------- Dictionary<string, delegate>或者反射都差不多 --------------------编程问答-------------------- 这样做是可以的,但C#搞个委托是干什么? --------------------编程问答-------------------- 委托相当于函数指针,只不过是安全类型的
{
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"]);
}
好在语法灵活上而且简明
代码里出现太多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呀,这么多事情都还不清楚...
同时也提醒楼主,这些前提条件你是不是也该补充说明一下?
--------------------编程问答-------------------- 委托和反射。
从上面知道还可以用设计模式。 --------------------编程问答--------------------
这就像有些人喜欢将代码拷贝复制,把参数改改,连个方法都不写。
--------------------编程问答-------------------- 实际情况而定吧! --------------------编程问答-------------------- 贴的别人的
--------------------编程问答-------------------- 好东西啊 为什么不用呢? --------------------编程问答-------------------- 切开一个西瓜,你可以用水果刀,菜刀,电锯,油锯或者手劈。
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#