我该怎么写这个更短?

时间:2010-05-02 14:52:13

标签: c#

public static string GetUa(HttpRequest hr)
{
    try
    {
        string visitorBrowser = hr.UserAgent.ToString();
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra

        if (!String.IsNullOrEmpty(originalBrowser))
        {
            return "OPERAMINI " + originalBrowser;
        }
        else
        {
            if (!String.IsNullOrEmpty(anotherOriginalBrowser))
            {
                return "NOVARRA " + anotherOriginalBrowser;
            }
            else
            {
                return visitorBrowser;
            }
        }
    }
    catch
    {
        return "No UA Found";
    }
}

10 个答案:

答案 0 :(得分:9)

我更关注可读性。这对我来说似乎更好:

var operaAgent = hr.ServerVariables["X-OperaMini-Phone-UA"];
var deviceAgent = hr.ServerVariables["X-Device-User-Agent"];

operaAgent = string.IsNullOrEmpty(operaAgent) ? null : "OPERAMINI" + operaAgent;
deviceAgent = string.IsNullOrEmpty(deviceAgent) ? null : "NOVARRA" + deviceAgent;

return operaAgent ?? deviceAgent ?? hr.UserAgent ?? "Not Found";

当然,如果您不需要将这些字符串作为UA的前缀,并且不需要关注空字符串用户代理,那么它只是:

return hr.ServerVariables["X-OperaMini-Phone-UA"] ??
       hr.ServerVariables["X-Device-User-Agent"] ??
       hr.UserAgent ??
       "Not Found";

答案 1 :(得分:1)

我认为没有办法大幅缩短这一点。

保存几行的一种方法是摆脱第一个围绕的大括号:

if (!String.IsNullOrEmpty(originalBrowser))
{
    return "OPERAMINI " + originalBrowser;
}
else if (!String.IsNullOrEmpty(anotherOriginalBrowser))
{
    return "NOVARRA " + anotherOriginalBrowser;
}
else if (!String.IsNullOrEmpty(visitorBrowser))
{
    return visitorBrowser;
}
else
{
    return "No User Agent Detected";
}

您也应该小心使用流控制的异常。 statenjason有正确的想法。

答案 2 :(得分:1)

现在,你所拥有的是清晰易读的。如果你想用更少的处理时间到达那里,我认为你不会去做。如果你想用更少的代码行来到那里,你可以,但它会变得很难看。

在屏幕上缩短它的一种简单方法(相同的LOC计数,-1)是删除一些花括号而不是存储visitorBrowser

public static string GetUa(HttpRequest hr)
{
    try
    {
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra

        if (!String.IsNullOrEmpty(originalBrowser))
            return "OPERAMINI " + originalBrowser;
        else
            if (!String.IsNullOrEmpty(anotherOriginalBrowser))
                return "NOVARRA " + anotherOriginalBrowser;
            else
                return hr.UserAgent.ToString();
    }
    catch
    {
        return "No UA Found";
    }
}

对我来说,这个可读性稍差,但可能仍然适合居住。

现在你可以通过使用条件运算符(?:)使其真正简短,但是为了便于阅读,它也会真的讨厌。如果我在代码审查中看到如下代码,我会让开发人员为了清楚起见重写它:

public static string GetUa(HttpRequest hr)
{
    try
    {
        string visitorBrowser = hr.UserAgent.ToString();
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra

        return !(string.IsNullOrEmpty(originalBrowser)) ? "OPERAMINI " + originalBrowser :
               !(string.IsNullOrEmpty(anotherOriginalBrowser)) ? "NOVARRA " + anotherOriginalBrowser : visitorBrowser);
    }
    catch 
    {
        return "No UA Found";
    }
}

说真的,不要做第二个例子。 (我不是百分百肯定会编译;我现在正在Mac上写下它。但我99.9%肯定它会,并且会工作,下一个开发人员会讨厌你为它。)

答案 3 :(得分:1)

像这样,例如:

public static string GetUa(HttpRequest hr) {
  try {
    string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
    string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"];
    return
      !String.IsNullOrEmpty(originalBrowser) ? "OPERAMINI " + originalBrowser :
      !String.IsNullOrEmpty(anotherOriginalBrowser) ? "NOVARRA " + anotherOriginalBrowser :
      hr.UserAgent;
  } catch {
    return "No UA Found";
  }
}

答案 4 :(得分:1)

像这样(其他一切只是额外的代码什么都不做):

public static string GetUa(HttpRequest hr) 
{ 
    if (!String.IsNullOrEmpty(hr.ServerVariables["X-OperaMini-Phone-UA"])) 
        return "OPERAMINI " + hr.ServerVariables["X-OperaMini-Phone-UA"])) ; 
    if (!String.IsNullOrEmpty(hr.ServerVariables["X-Device-User-Agent"])) 
        return "NOVARRA " +   hr.ServerVariables["X-Device-User-Agent"])) ; 
    return hr.UserAgent ?? "Not Found"; 
} 

您不应该在正常的应用程序流程中使用异常。

答案 5 :(得分:1)

这是一个精简版。因为您returnif个语句中,所以可以删除else public static string GetUa(HttpRequest hr) { string visitorBrowser = hr.UserAgent; string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"]; string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra if (string.IsNullOrEmpty(visitorBrowser)) return "No UA Found"; if (!String.IsNullOrEmpty(originalBrowser)) return "OPERAMINI " + originalBrowser; if (!String.IsNullOrEmpty(anotherOriginalBrowser)) return "NOVARRA " + anotherOriginalBrowser; return visitorBrowser; } 。此外,我省去了使用流程异常的需要。

{{1}}

答案 6 :(得分:0)

public static string GetUa(HttpRequest hr)
{
    try
    {
        string visitorBrowser = hr.UserAgent.ToString();
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        if (!String.IsNullOrEmpty(originalBrowser)) return "OPERAMINI"+originalBrowser;
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra
        if (!String.IsNullOrEmpty(anotherOriginalBrowser)) return "NOVARRA" + anotherOriginalBrowser;
        return visitorBrowser;
    }
    catch
    {
        return "No UA Found";
    }
}

答案 7 :(得分:0)

第二个if语句:

return (!String.IsNullOrEmpty(anotherOriginalBrowser) ? ("NOVARRA " + anotherOriginalBrowser) : visitorBrowser);

你也可以将它与第一个if语句结合使用

答案 8 :(得分:0)

我不喜欢什么时候做它不需要做的工作。所以我会写如下:

   public static string GetUa(HttpRequest hr)
    {
        string browser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        if (!String.IsNullOrEmpty(browser))
            return "OPERAMINI " + browser;

        browser = hr.ServerVariables["X-Device-User-Agent"]; //novarra 
        if (!String.IsNullOrEmpty(browser))
            return "NOVARRA " + browser;

        if (!String.IsNullOrEmpty(hr.UserAgent))
            return hr.UserAgent;

        return "No UA Found";
    } 

答案 9 :(得分:0)

一种稍微动态的.NET 4方法:

    private static readonly Tuple<string, string>[] SpecialUas =
        {
            Tuple.Create("X-OperaMini-Phone-UA", "NOVARRA"),
            Tuple.Create("X-Device-User-Agent", "OPERAMINI")
        };

    public static string GetUa(HttpRequest r)
    {
        return (
                   from specialUa in SpecialUas
                   let serverVariable = r.ServerVariables[specialUa.Item1]
                   where !string.IsNullOrEmpty(serverVariable)
                   select string.Concat(specialUa.Item2, " ", serverVariable)
               ).FirstOrDefault() ?? (
                   string.IsNullOrEmpty(r.UserAgent)
                   ? "No UA Found"
                   : r.UserAgent
               );
    }

通过添加更多元组,可以非常轻松地使用其他特殊UA进行自定义。

如果你没有在.NET 4上运行,用别的东西替换元组并不困难。