前言
在我们的程序中,经常使用到字符串,字符串的写法非常多,但是有一个问题就是我们写的字符串是否合适呢?
正文
内插符
介绍一个东西叫做内插字符,如下:
static void Main(string[] args)
{
string w = "Word";
string s = $"Hello {w}";
}
也就是说在字符串前面加上$,然后我们就可以在字符串中加入{}来实现表达式插入其他字符。
这让我们想起了string.format。
string ss = string.Format("Hello {0}",w);
只不过我们写在后面。
内插字符是我们方便了很多,我们可以在我们想加入的位置直接插入字符。
有一个问题,请看:
string pi1= $"pi is {Math.PI}";
string pi2 = $"pi is {Math.PI.ToString()}";
这上下两条语句是否相同?
第一条一句通过装箱拆箱操作。
而第二条,请看:
public override string ToString() =>
Number.FormatDouble(this, null, NumberFormatInfo.CurrentInfo);
而是通过优化来实现。
所以呢,下面那条性能更好。
前面提及内插符可以简化我们的操作,那么是否能接受一些复杂的操作,如内插符语句内内插内插符。
同样是可以的:string s =$"{$""}",只要符合表达式要求即可。
nameof
private string name;
private Dictionary data;
public string StudentName
{
get { return data.GetValueOrDefault(nameof(name)); }
set { SetData(nameof(name),value); }
}
private void SetData(string key,string value) {
data[key] = value;
}
如下面需要卸载Dictionary,如果直接写入name字符串的话,那么会出现一个问题,就是万一哪天我们属性名改了之后呢,可能我们会忘记去改。
这样子是否我们的nameof会影响我们的性能呢?答案是否定的,因为其运作在编译期。
public string StudentName
{
get =>
CollectionExtensions.GetValueOrDefault((IReadOnlyDictionary) this.data, "name");
set
{
this.SetData("name", value);
}
}
nameof 在try catch 中使用的比较多。
public int calc(int x,int y)
{
try
{
return x / y;
} catch(Exception e)
{
throw new Exception($"{nameof(y)+":"+y.ToString()}");
}
}
总结一个nameof:
nameof的好处是,如果符号名字改了之后,使用nameof来获取符号名称的地方或获得修改后的名字,使我们的静态检查功能得到了充分的发挥。
注意:
public class A1
{
public static string getname() {
return nameof(A1);
}
}
这里getname返回的是A1,而不会动态打印泛型是啥,因为其在编译期。
总之nameof这种既不影响性能同时还能给我们提供静态检查的,我个人认为是值得使用的。