在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错误,注重编程之美,代码的优雅,总结几个平常经常犯的错误。
1、在C#编程中,字符型类型是最容易处理出错的地方,代价是非常昂贵,在.Net Framwork中,字符串是一个相当特别的引用类型,string本省就是一个不可继承的密封类,但是它具有了值类型所应用的特点,但是它在CLR中内存还是保存于托管堆之上,也就是说,当我们每次定义一个字符串类型的时候,就在堆内存中开辟一端内存,而当我们字符串被修改之后,它会创建一个新的内存,注意这里的内存是不连续的,而是通过修改栈内地址引用而拼凑字符串,不会改变源字符串在内存中的地址,所以有些程序员总是喜欢使用这样的方法格式化字符串:
string SelectText="select * from "+TableName+" where UserName='"+Name+"'";
上述代码,使用了字符串拼凑的方法,因为使用了多重串联,因此会在内存中创建两个不必要的字符串垃圾副本。
string SelectText=string.Format("select * from {0} where UserName={1}",TableName,Name);
2、大多数开发人员都不知道内置的验证数据类型的方法,如System.Int32,因此很多人都是自己实现的,其实这是不妥的,因为这些基本类型中都存在自己固有的类型验证方法,下面这个就是自己实现验证的一个字符串是否是数值的代码:
public bool CheckIfNumeric(string value)
{
bool IsNumeric=true;
try
{
int i=Convert.ToInt32(value);
}
catch(FormatException excepiton)
{
IsNumeric=false;
}
return IsNumeric;
}
虽然使用了try catch语句,这不是最佳的做法,更好的方法是下面使用Int.TryParse;
int output=0;
bool IsNumeric=int.TryParse(value,out output);
int.TryParse是更快、更简洁的方法。
3、学会合理的管理公共变量,我们在系统中经常会滥用公共变量,没有做到合适的封装好。
1 static void Main(string[] args)
2 {
3 MyAccount account=new MyAccount();
4 //这地方不能随便的调用account里面的字段进行更改,但是缺改了
5 account.AccountNumber="ddddddddd";
6 Console.ReadKey();
7 }
8 public class MyAccount
9 {
10 public string AccountNumber;
11 public MyAcctount()
12 {
13 AccountNumber="ssssssssssssss";
14 }
15 }
在上面的MyAccount类中生命了一个AccountNumber公共变量,理想情况下,AccountNumber应该是只读的,不能让外界修改,但是这里MyAccount类却没有对它做任何控制。
声明公共做法应该是使用属性,如:
1 public class MyAccount
2 {
3 private stirng _accountNumber;
4 public string AccountNumber
5 {
6 get { return _accountNumber; }
7 }
8 public MyAccount()
9 {
10 _accountNumber="dddddddd";
11 }
12 }
这里我们封装了AccountNumber公共变量,它变成了只读,不能由调用者类进行修改。