我根据平时的使用经验,总结了字符串的使用经验,记录如下。
字符串是不可变的
修改字符串时,修改的不是字符串本身,.net会在内存创建新的字符串,所以频繁的操作字符串时要使用StringBuilder类,避免程序报AccessViolationException这种很难定位的异常。
//这种操作会在内存中生成大量的字符串,最好不要这样操作
string sentence = "this ";
sentence += "is ";
sentence += "a ";
sentence += "bad ";
sentence += "using ";
sentence += "case";
//使用StringBuilder类操作字符串
var strBuilder = new StringBuilder();
strBuilder.Append("this")
.Append("is")
.Append("a")
.Append("better")
.Append("way");
string sentence = builder.ToString();
格式化
C#6.0开始支持字符串插入的语法,可以代替String.Format方法。使用String.Format方法容易出错,要么是写错参数,要么是序号写错。字符串插入使用$符号,在字符串中可以直接插入变量,由Visual studio最终帮我们转换成String.Format代码。
string appleStr = "apple";
//编写代码时容易出错——写错参数序号,漏写参数
string out1 = string.Format("this is an {0}", appleStr);
//参数直接写入到字符串中,更不容易出错
string out2 = $"this is an {appleStr}";
nameof 表达式
C#6.0开始支持nameof表达式,使用这个表达式,方便我们将代码中的类名、属性名、方法名等等用户标识符转换成字符串。nameof表达式类似于typeof,Visual studio会在编译前将表达式转换成字符串。
//before
if(x == null) throw new ArgumentNullException("x");
//now,我们可以很方便的查找引用和重命名
if(x == null) throw new ArgumentNullException(nameof(x));
//before
if(PropertyChanged != null){
PropertyChanged?.Invoke(this, "Count");
}
//now
if(PropertyChanged != null){
PropertyChanged?.Invoke(this, nameof(Count));
}
网友评论