principlecsharpModerate
Assembling a user agent descriptor, implemented using StringBuilder vs String
Viewed 0 times
descriptoruserimplementedagentassemblingusingstringbuilderstring
Problem
I think performance won't be a big issue here as the concatenation only happens once (2-3 at worse because of multiple threads). Out of the two methods, which one would you prefer, in terms of readability and performance? Is there any better way to accomplish the task of calculating desired string:uaInfo?
public static string GetUserAgentInfo()
{
if (_uaInfo == null)
{
string carrier = DeviceNetworkInformation.CellularMobileOperator ?? "(No Network)";
var sb = new StringBuilder();
sb.Append("device-type=mobile");
sb.Append(";os=Windows Phone");
sb.Append(";os-version=" + Environment.OSVersion.Version);
sb.Append(";app-name:" + GetAppName());
sb.Append(";app-version=" + GetVersion());
sb.Append(";carrier=" + HttpUtility.UrlEncode(carrier));
sb.Append(";locale=" + Locale);
_uaInfo = sb.ToString();
}
return _uaInfo;
}
public static String GetUserAgentInfoOld()
{
if (_uaInfo == null)
{
string carrier = DeviceNetworkInformation.CellularMobileOperator ?? "(No Network)";
string temp = "";
temp += String.Format("{0}={1};", "device-type", "mobile");
temp += String.Format("{0}={1};", "os", "Windows Phone");
temp += String.Format("{0}={1};", "os-version", Environment.OSVersion.Version);
temp += String.Format("{0}={1};", "app-name", GetAppName());
temp += String.Format("{0}={1};", "app-version", GetVersion());
temp += String.Format("{0}={1};", "carrier", HttpUtility.UrlEncode(carrier));
temp += String.Format("{0}={1}", "locale", Locale);
_uaInfo = temp;
}
return _uaInfo;
}Solution
For a method like this, don't worry about performance until you have evidence that performance is a problem. Either way will almost certainly be fast enough.
I would suggest instead for readability that you separate the data (key-value pairs) from the construction of the string.
If the order of the pairs is not important, you can write
If order is important, use the slightly more verbose
I would suggest instead for readability that you separate the data (key-value pairs) from the construction of the string.
If the order of the pairs is not important, you can write
var data = new Dictionary
{
{ "device-type", "mobile" },
{ "os", "Windows Phone" },
...
};
return string.Join(";", data.Select(kvp => kvp.Key + "=" + kvp.Value));If order is important, use the slightly more verbose
var data = new[]
{
new KeyValuePair("device-type", "mobile"),
new KeyValuePair("os", "Windows Phone"),
...
};
return string.Join(";", data.Select(kvp => kvp.Key + "=" + kvp.Value));Code Snippets
var data = new Dictionary<string, string>
{
{ "device-type", "mobile" },
{ "os", "Windows Phone" },
...
};
return string.Join(";", data.Select(kvp => kvp.Key + "=" + kvp.Value));var data = new[]
{
new KeyValuePair<string, string>("device-type", "mobile"),
new KeyValuePair<string, string>("os", "Windows Phone"),
...
};
return string.Join(";", data.Select(kvp => kvp.Key + "=" + kvp.Value));Context
StackExchange Code Review Q#77867, answer score: 14
Revisions (0)
No revisions yet.