读改善c#代码157个建议:建议1~3

时间:2021-05-19 12:38:08

目录:

  • 建议一:正确操作字符串
  • 建议二:使用默认转型方法
  • 建议三:区别对待强制转型和as

建议一、正确操作字符串

1、确保尽量少的装箱

static void Main(string[] args)
{
int indexNo = ;
int dbNo = ; string text = "I-" + indexNo + "D" + dbNo; Console.WriteLine("IndexNo:{0},DBNo:{1}", indexNo, dbNo); Console.ReadKey();
}

我们知道值类型转引用类型会产生装箱操作,装箱操作—为值类型在托管堆中分配内存以及类型对象指针和同步块索引的内存,将值类型拷贝到新分配的堆内存中,最后返回这个对象的地址。

反面:

 string text = "I-" + indexNo + "D" + dbNo;

 Console.WriteLine("IndexNo:{0},DBNo:{1}", indexNo, dbNo);

正面:

 string text = "I-" + indexNo.ToString() + "D" + dbNo.ToString();

  Console.WriteLine("IndexNo:{0},DBNo:{1}", indexNo.ToString(), dbNo.ToString());

2、避免分配额外的内存空间

String类型是特殊的引用类型,它一旦赋值就不可改变。我们所调用的"="或者"+"进行拼接都会创建一个新字符串。

反面:我们实际创建了4个string对象

string text = "I-" + indexNo.ToString() + "D" + dbNo.ToString();

正面:

使用:StringBuilder对象

StringBuilder strder = new StringBuilder();
strder.Append("I-");
strder.Append(indexNo.ToString());
strder.Append("D-");
strder.Append(dbNo.ToString()); string text = strder.ToString();

根据 asdshit 的建议补充,这一点确实不知道,被忽略了:

StringBuilder()对象默认分配的空间是16字符。当空间满了之后,会再分配16个字符空间。

所以说如果我们可以正确估计我们的数据的字符总长度。正确的设定初始空间,这样,使得StringBuilder不必频繁地开辟分配空间。也避免大量的空间被浪费

使用:String.Format()方法

String.Format("I-{0}D-{1}", indexNo.ToString(), dbNo.ToString());

建议二、使用默认转型方法

1、类型转换运算符:强制转换

 int indexNo = ;

 float f = (float)indexNo;

2、使用类型内置转换方法

Parse、TryParse 或者 ToString(),TodateTime

3、使用帮助类System.Convert提供的方法

建议三、区别对待强制转型与as和is

基类转型为子类本身使用as.

子类和子类之间的转型应该是提供转换操作符。

1、强制转型:

  • 两个类型之间通过支持强制转型操作符来完成两个类型之间的转型。
  • 两个类属于从属继承关系。

第一种情况:类型实现强制转换

class FirstType
{
public string Name { get; set; }
} class SecondType
{
public string Name { get; set; }
public explicit operator SecondType(FirstType firstType)
{
SecondType st = new SecondType() { Name = "转型自:" + firstType.Name };
return st;
}
 FirstType ft = new FirstType();
ft.Name = "First"; SecondType st = (SecondType)ft; Console.WriteLine(st.Name);

第二种情况:继承关系:强制转换或者as 都行。