我可以在这里使用c#开关吗?

时间:2011-11-10 05:27:36

标签: c# asp.net

我想重构这段代码。也许如果可能的话,使用开关?或者在性能方面是否相同?

string rawUrl = context.Request.RawUrl ?? string.Empty;

if (rawUrl.Contains("mypage.aspx"))
{
}

if (rawUrl.Contains("mypage2.aspx"))
{
}

etc..

4 个答案:

答案 0 :(得分:4)

不直接,因为你想要一个“包含”关系,而不是完全相等。

但是,如果您愿意,可以通过尝试从我认为的URL中解析页面名称,将其存储在单独的String变量中,然后启用String来实现间接。 1}}。

例如:

// Get the URL from some external source (wherever you're already getting it from)
String rawUrl = "http://www.example.com/foo/bar.aspx";

// Means of parsing will be dependent on the format in which you expect the URL.
String page = rawUrl.Substring(rawUrl.LastIndexOf("/") + 1);

switch (page) {
    case "bar.aspx":
        // Do stuff
        break;
    case "foo.aspx":
        // Do stuff
        break;
}

当然,请将这种解析方法与一粒盐一起使用;这个例子是为了告诉你这是可能的,但请注意,这种解析方法可能会在很多情况下引发异常,但为了简洁起见,我省略了这些检查。

答案 1 :(得分:3)

Switch Cases必须是一个常量值。你最好选择使用if / else之类的:

string rawUrl = context.Request.RawUrl ?? string.Empty;

if (rawUrl.Contains("mypage.aspx"))
{
    //code
}
else if (rawUrl.Contains("mypage2.aspx"))
{
    //more code
}

如果你担心表现(这很好!)那么其他方法就是你要走的路。虽然不使用else将具有相同的功能,但通过添加else,您告诉代码不处理任何其他条件。因此10 if语句将导致10如果处理条件无关紧要,而10 if / else语句可能导致10,或者它可能只导致1。

编辑:

考虑到这一点,我注意到你正在使用上下文对象。如果您真的想要一个switch语句,可以执行以下操作:

string page = context.Request.Url.Segments.Last();

switch(page)
{
    case "mypage.aspx":
        //code
        break;
    case "mypage2.aspx":
        //more code
        break;
}

答案 2 :(得分:1)

不适用于包含。

尝试单独隔离页面名称,您可以这样做。

switch(pageName)
{
    case "mypage.aspx";
        break;

    case "mypage2.aspx";
        break;
}

答案 3 :(得分:0)

我认为最好使用Dictionary

首先,从原始网址中提取文件名。

然后,使用Dictionary<string,TValue>

如果对页面的操作几乎相同,请将TValue设置为与页面关联的数据类型。

如果操作非常不同,请将TValue设置为委托类型,例如Action