C# 我怎么能写得更短?

C# 我怎么能写得更短?,c#,C#,我看不出有什么办法能显著缩短这个时间 节省几行的一种方法是去掉第一行周围的大括号: public static string GetUa(HttpRequest hr) { try { string visitorBrowser = hr.UserAgent.ToString(); string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"]; string

我看不出有什么办法能显著缩短这个时间

节省几行的一种方法是去掉第一行周围的大括号:

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";
    }
}

在使用异常进行流控制时也应该小心。statenjason的想法是正确的。

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

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";
}
当然,如果您不需要在UAs上添加这些字符串的前缀,也不需要关心空字符串用户代理,那么它将只是:

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";

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

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

return hr.ServerVariables["X-OperaMini-Phone-UA"] ??
       hr.ServerVariables["X-Device-User-Agent"] ??
       hr.UserAgent ??
       "Not Found";
对我来说,这本书可读性稍差,但可能仍然适合居住

现在,您可以使用条件运算符(
?:
)将其缩短为真正的,但对于可读性来说,它也将是真正的。如果我在代码评审中看到如下代码,我会让开发人员为清晰起见重写它:

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";
    }
}

说真的,请不要做第二个例子。(我不是100%确定它会被编译;我现在正在我的Mac电脑上写下它。但是我99.9%确定它会,并且会工作,下一个开发者会因此讨厌你。)

像这样,例如:

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";
    }
}
像这样(其他的都是不做任何事情的额外代码):


并且在正常的应用程序流路径中不应使用异常。

这里是一个精简版本。因为您在每个
if
语句中
return
ing,所以可以删除
else
s。此外,我还消除了对流使用异常的需要

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"; 
} 
第二,如果陈述:

    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;
    }

你可能也可以把这个和第一个if语句结合起来使用,因为我不喜欢它做不需要做的工作。所以我会写如下:

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

更具动态性的.NET 4方法:

   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";
    } 
private静态只读元组[]特殊LUAS=
{
Tuple.Create(“X-OperaMini-Phone-UA”、“NOVARRA”),
Tuple.Create(“X-Device-User-Agent”、“OPERAMINI”)
};
公共静态字符串GetUa(HttpRequest r)
{
返回(
从specialUa到SpecialUas
让serverVariable=r.ServerVariables[specialUa.Item1]
其中!string.IsNullOrEmpty(serverVariable)
选择string.Concat(specialUa.Item2,“,服务器变量)
).FirstOrDefault()(
string.IsNullOrEmpty(r.UserAgent)
?“未找到UA”
:r.UserAgent
);
}
这可以通过添加更多的元组,使用额外的特殊UAs进行定制


如果您没有在.NET 4上运行,用其他内容替换元组并不困难。

hr.UserAgent
上调用
ToString()
是不必要的,因为它已经是一个字符串,将消除使用异常作为方法流的一部分。我完全忘记了coalesce操作符。好电话。除了一个细节:您没有处理
IsNullOrEmpty
Empty
部分。不可否认,这是一个小细节,你可以通过快速编辑来纠正。(我仍然告诉你;正确的想法。)+1的可读性和简洁性;虽然我会将第二个
if
语句转换为
else if
(如果第一次检查成功,则更短更快)。但是代码是错误的。!=null与原始代码中的不同。哇,挑剔:)我没有足够的上下文来知道是否需要空字符串。只有当有人用空字符串填充该值时,才会发生这种情况,为了简化代码,我假设不会发生这种情况。OP有上下文知道这是否正常。有许多机器人,半成品的移动浏览器,发送空的或没有UAN,但你是从
原始浏览器和
其他原始浏览器中获得的吗?忽略了这一点,出于好奇修复了它,哪一个更快?多次分配给字符串或请求同一个servervariable?这并不重要。它不是从服务器g“请求”它。它只是从索引中检索,其复杂性仍然是O(1),这与简单的字符串赋值相同。那么,我是唯一一个认为第二部分非常可读的人吗?:)我喜欢条件运算符,但我讨厌将它们链接在一起。有两个条件,还不算太糟,但有3个或更多,我发现可读性严重不足。这很公平。对我来说,如果我能像你在这里一样排列它们,它仍然是可读的,不管有多少。我能看到每行上都有一个“?”,所以我知道你在做什么。我可能会临时把“visitorBrowser”放到它自己的台词上,说“这是全部,在这里的结尾”。我最讨厌被链子拴在一起的地方是链子并不总是在最后。“A=1?”?B:C=1?D:E=1?F:G‘对我来说是可读的’A=1?B=1?C:D:E=1?F:G’不是,即使你用括号括起来。
return (!String.IsNullOrEmpty(anotherOriginalBrowser) ? ("NOVARRA " + anotherOriginalBrowser) : visitorBrowser);
   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";
    } 
    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
               );
    }