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