wordpress建站的案例,付网站建设费用会计分录,网站的布局设计,wordpress首页调用指定分类今天#xff0c;我在写C#代码时#xff0c;突然发现一个最熟悉的陌生人 —— string.Format。在写C#代码的日子里#xff0c;与它朝夕相伴#xff0c;却没有真正去了解它。只知道在字符串比较多时#xff0c;用它比用加号进行字符串连接效率更高#xff08;当然也更方便我在写C#代码时突然发现一个最熟悉的陌生人 —— string.Format。在写C#代码的日子里与它朝夕相伴却没有真正去了解它。只知道在字符串比较多时用它比用加号进行字符串连接效率更高当然也更方便。可是却从来没有问过为什么 在生活中也有类似的现象与你朝夕相处、你最熟悉的人你往往不会进一步去了解她他你已经习惯了她他你认为你已经太了解她他了。。。真的是这样吗这值得去思考。。。 博问中的一个问题 —— StringBuilderString.concat()StringString 哪一个效率高 激发了我的好奇心想一探string.Format的究竟而且在开发中也正好遇到一个字符串连接的问题。 了解.NET世界中的东西其实很简单只要通过工具反编译出相应的.NET类库代码我们来看看string.Fomat的代码 public static string Format(string format, object arg0, object arg1, object arg2){if (format null)throw new ArgumentNullException(format);return string.Format((IFormatProvider) null, format, arg0, arg1, arg2);} 实际调用的是另外一个签名的string.Format public static string Format(IFormatProvider provider, string format, params object[] args){if (format null || args null)throw new ArgumentNullException(format null ? format : args);StringBuilder stringBuilder new StringBuilder(format.Length args.Length * 8);stringBuilder.AppendFormat(provider, format, args);return ((object) stringBuilder).ToString();} 哦原来用的就是StringBuilder也许你早就知道了string.Format只是StringBuilder的改装精简版。 既然是StringBuilder它必然无法避免一个影响StringBuilder性能的问题 —— 初始化容量capacity的问题string.Format是如何解决的呢从上面的代码一眼就可以看出初始化容量是这么计算出来的 format.Length args.Length * 8 从这个计算公式可以看出假设需要format的字符串是10个如果这10字符串累加起来的字符数不超过80就能发挥StringBuilder的最佳性能否则StringBuider需要扩容从而带来性能损失。 所以对于大字符串string.Format不是最佳选择。 那最佳选择是什么还是StringBuilder只不过要自己写代码计算初始化容量。分享一下今天我们在实际开发中使用的代码 var bodyFormat span id\comment_body_{0}\{1}/spanbr/;
var diggFormat a href\javascript:void(0);\ οnclick\voteComment({0},Digg)\支持({2})/a;
var buryFormat a href\javascript:void(0);\ οnclick\voteComment({0},Bury)\反对({3})/a;
var args new string[]{ comment.ID.ToString(), comment.Body, comment.DiggCount.ToString(), comment.BuryCount.ToString() };
//计算初始化容量
int capacity bodyFormat.Length diggFormat.Length buryFormat.Length;
for (int i 0; i args.Length; i)
{capacity args[i].Length;
}
var sb new StringBuilder(capacity);
sb.AppendFormat(bodyFormat,args);
sb.AppendFormat(diggFormat,args);
sb.AppendFormat(buryFormat,args);
Post.Text sb.ToString(); 这里没有使用string.Format一是因为comment.Body的字符数会很多string.Format分配的初始化容量不够。二是因为string.Format不能分批Fomat格式字符串只能写在一起造成格式字符串很长也就是bodyFormat, diggFormat, buryFormat要拼成一个字符串。 麻烦主要在参数字符串(args)的长度计算要将每个字符串的字符数进行累加。我们采用的方法是将所有参数放在string[]类型的变量中通过遍历数组进行计算然后将这个string[]类型的变量直接传给StringBuilder.AppendFormat它支持的参数类型是object[]。 小结 写这篇博文不是为让你弃用string.Format而是让你了解它所存在的限制在某些性能要求极高的场景下可以考虑到这个影响因素。 更新 针对这个问题实现了两个扩展方法。 1. 针对单个格式字符串 namespace System
{public static class StringExtension{public static string FormatWith(this string format, params object[] args){if (format null || args null){throw new ArgumentNullException((format null) ? format : args);}else{var capacity format.Length args.Where(a a ! null).Select(p p.ToString()).Sum(p p.Length);Console.WriteLine(capacity);var stringBuilder new StringBuilder(capacity);stringBuilder.AppendFormat(format, args);return stringBuilder.ToString();}} }
} 调用示例 welcome to {0}! welcome to {1}!.FormatWith(www.cnblogs.com, q.cnblogs.com); 2. 针对多个格式字符串 namespace System
{public static class StringExtension{public static string FormatWith(this IEnumerablestring formats, params object[] args){if (formats null || args null){throw new ArgumentNullException((formats null) ? formats : args);}else{var capacity formats.Where(f !string.IsNullOrEmpty(f)).Sum(f f.Length) args.Where(a a ! null).Select(p p.ToString()).Sum(p p.Length);var stringBuilder new StringBuilder(capacity);foreach (var f in formats){if (!string.IsNullOrEmpty(f)){stringBuilder.AppendFormat(f, args);}}return stringBuilder.ToString();}}}
} 调用示例 new string[] { welcome to {0}!, welcome to {1}! }.FormatWith(www.cnblogs.com, q.cnblogs.com); 前面使用StringBuilder的代码改为调用扩展方法 Post.Text new string[]{
span id\comment_body_{0}\ class\blog_comment_body\{1}/spanbr/,a href\javascript:void(0);\ class\comment_vote\ οnclick\voteComment({0},Digg)\支持({2})/a,a href\javascript:void(0);\ class\comment_vote\ οnclick\voteComment({0},Bury)\反对({3})/a
}.FormatWith(comment.ID, comment.Body, comment.DiggCount, comment.BuryCount);