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";
}
}
答案 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)
这是一个精简版。因为您return
在if
个语句中,所以可以删除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上运行,用别的东西替换元组并不困难。