是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。
表示可变字符字符串。无法继承此类。
命名空间:System.Text
例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
通过用一个重载的构造函数方法初始化变量,可以创建 StringBuilder 类的新实例,正如以下示例中所阐释的那样。
设置容量和长度
虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder 类的容量。以下代码示例指定可以将 MyStringBuilder 对象扩充到最大 25 个空白。
MyStringBuilder.Capacity = 25;
EnsureCapacity 方法可用来检查当前 StringBuilder 的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。
也可以查看或设置 Length 属性。如果将 Length 属性设置为大于 Capacity 属性的值,则自动将 Capacity 属性更改为与 Length 属性相同的值。如果将 Length 属性设置为小于当前 StringBuilder 对象内的字符串长度的值,则会缩短该字符串。
修改 StringBuilder 字符串
以下列出了可以用来修改 StringBuilder 的内容的方法。
StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。
StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。
StringBuilder.Replace 替换指定索引处的指定字符。
Append
Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。以下示例将一个 StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。
述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder 的后面。以下示例使用 AppendFormat 方法将一个设置为货币值格式的整数值放置到 StringBuilder 的结尾。
int MyInt = 25;
StringBuilder MyStringBuilder =>
述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder 的后面。以下示例使用 AppendFormat 方法将一个设置为货币值格式的整数值放置到 StringBuilder 的结尾。
int MyInt = 25;
StringBuilder MyStringBuilder =>
Remove
可以使用 Remove 方法从当前 StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。以下示例使用 Remove 方法缩短 StringBuilder。与Insert是对应的
以下是师傅编写的一个实例,源码如
///
/// 设置查询条件
///
///
///
///
private StringBuilder SetParams(NameValueCollection collection, StringBuilder conditions)
{
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|
//规定参数类型
//bt_ss_xxx,bt_es_xxx 表示s:string,i:int,between and的开始参数和结束参数
//ob_a_xxx,ob_d_xxx 表示order by asc升序和order by desc降序
//lkd_a_xxx,lkd_l_xxx,lkd_r_xxx ,lkd_ao_xxx,lkd_lo_xxx,lkd_ro_xxx 表示like %keyword%,like %keyword,like keyword%
//lt_s_xxx,gt_s_xxx,eq_s_xxx,lt_i_xxx,gt_i_xxx,eq_i_xxx, 表示s:string,i:int ;lt:less than,gt:greater than,eq:equals
//_o_ 表示条件不能使用and来连接,改用or关键字
//
//
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|
string key="", value="";
for (int i = 0; i < collection.Count; i++)
{
//获取列名和值
key = collection.Keys[i]; //或者用collection.GetKey(i);
value = collection.Get(i);
//如果是这4个参数,则在分页中处理,这里不做处理
if ("rows page sort order".IndexOf(key) >= 0) continue;
//如果值为空,跳过该参数
if (value == "") continue;
//如果使用_o_则改and为or
if (key.IndexOf("_o_") >= 0)
{
//替换and关键字成or
int startindex = conditions.ToString().LastIndexOf("and");//获取最后一个and的位置
if (startindex >= 0)
{
conditions.Replace("and", "or", startindex, 3);//and关键字替换成or
key = key.Replace("o_", "");
}
}
//如果是 between and,直接读取2个值
if (key.IndexOf("bt_si_") >= 0)
{
if (i+1< collection.Count && collection.Keys[i + 1].IndexOf("bt_ei_") >= 0)
{
conditions.AppendFormat("{0} between {1} and {2} and ", key.Replace("bt_si_", ""), value, collection.Get(i + 1));
i++;
continue;
}
}
else if (key.IndexOf("bt_ss_") >= 0)
{
if (i + 1 < collection.Count && collection.Keys[i + 1].IndexOf("bt_es_") >= 0)
{
conditions.AppendFormat("{0} between '{1}' and '{2}' and ", key.Replace("bt_ss_", ""), value, collection.Get(i + 1));
i++;
continue;
}
}
//暂时只支持一个order by的判断
if (key.IndexOf("ob_a_") >= 0)
{
if (conditions.ToString().IndexOf("order by") == -1)
{
conditions.Append(" order by ");
}
conditions.AppendFormat(" {0} asc ", key.Replace("ob_a_", ""), value);
}
else if (key.IndexOf("ob_d_") >= 0)
{
if (conditions.ToString().IndexOf("order by") == -1)
{
conditions.Append(" order by ");
}
conditions.AppendFormat(" {0} desc ", key.Replace("ob_d_", ""), value);
}
//like 或者是比较 >,<,=
if (key.IndexOf("lkd_a_") >= 0)
{
conditions.AppendFormat(" {0} like '%{1}%' and ", key.Replace("lkd_a_", ""), value);
}
else if (key.IndexOf("lkd_l_") >= 0)
{
conditions.AppendFormat(" {0} like '%{1}' and ", key.Replace("lkd_a_", ""), value);
}
else if (key.IndexOf("lkd_r_") >= 0)
{
conditions.AppendFormat(" {0} like '{1}%' and ", key.Replace("lkd_r_", ""), value);
}
else if (key.IndexOf("lt_s_") >= 0)
{
conditions.AppendFormat(" {0} < '{1}' and ", key.Replace("lt_s_", ""), value);
}
else if (key.IndexOf("gt_s_") >= 0)
{
conditions.AppendFormat(" {0} > '{1}' and ", key.Replace("gt_s_", ""), value);
}
else if (key.IndexOf("eq_s_") >= 0)
{
conditions.AppendFormat(" {0} = '{1}' and ", key.Replace("eq_s_", ""), value);
}
else if (key.IndexOf("lt_i_") >= 0)
{
conditions.AppendFormat(" {0} < {1} and ", key.Replace("lt_i_", ""), value);
}
else if (key.IndexOf("gt_i_") >= 0)
{
conditions.AppendFormat(" {0} > {1} and ", key.Replace("gt_i_", ""), value);
}
else if (key.IndexOf("eq_i_") >= 0)
{
conditions.AppendFormat(" {0} = {1} and ", key.Replace("eq_i_", ""), value);
}else{
conditions.AppendFormat(" {0} = '{1}' and ", key, value);
}
}
//如果有条件,则删除最后一个and
if (collection.Count > 0)
{
//删除多余的and
int startindex = conditions.ToString().LastIndexOf("and");//获取最后一个and的位置
if (startindex >= 0)
{
conditions.Remove(startindex, 3);//删除多余的and关键字
}
}
return conditions;
}
综合以上代码发现,一个新的类stringBulider与先前学习的string类或是vb中的一些函数式有很多相识之处的。就想formate函数或是vb中的截取字符串中的函数。所以学习中总结先前的学习有很多的作用。
现在来说先StringBulider函数在我们这次的系统中的作用。因为stringBulider可以替换和追加的方法。所以可以运行它的这个方法类处理掉不符合标准和替换成标准的类型。