初学C#编程的注意事项
下面是8个C#编程时的注意事项是给初学者的,可能你知道,也可能你不知道,不过这些都是一些可能会让人疏忽的地方,还是要注意一下。
1.使用String变量:
考虑有下面的一个程序想判断一下字符串是否有内容。
if (someString.Length > 0) { // … }
但是,这个字符串对象很可能是个空对象,所以,最好先判断一下null
if (!String.IsNullOrEmpty(someString)) { // 是不是更好一些? }
2.字符器连接
string s = “dev”; s += “-”; s += “the”; s += “-”; s += “web”; s += “.”; s += “com”;
这样做没什么问题,只不过性能不高,因为+=操作符其实调用的是String类的Append访问,所以,+=会有两次函数调用,下面的则会好一些。
StringBuilder s = new StringBuilder(); s.Append(”dev”); s.Append(”-”); s.Append(”the”); s.Append(”-”); s.Append(”web”); s.Append(”.”); s.Append(”com”);
3.使用Console
Console.WriteLine("A= " + 1 + " B=" + 2 + " C= " + someValue);
和第二点说的一样,这并没有效率,使用下面的语句,会更有效率。
Console.WriteLine(”A: {0}\nB: {1}\nC: {2}”, 1, 2, someValue);
4.字符串转整型
int i = int.Parse(Request.QueryString["id"]);
这样做的问题是,如果有人这样请求你的页面:yourpage.aspx?id=A6,那么A6将会导致你的程序抛出一个异常。因为A6不是一个整数字符串。使用TryParse会好一点。
int i; if (!int.TryParse(Request.QueryString["id"] , out i)) { //… }
5. 调用IDbConnection 的 Close 方法
IDbConnection dbConn = null; try { dbConn = new SqlConnection(”some Connection String”); dbConn.Open(); } finally { dbConn.Close(); }
调用SqlConnection的构造函数可能会出现一个异常,如果是这样的话,我们还需要调用Close方法吗?
IDbConnection dbConn = null; try { dbConn = new SqlConnection(”Some Connection String”); dbConn.Open(); } finally { if (dbConn != null) { dbConn.Close(); } }
6.使用List类
public void SomeMethod(List<SomeItem> items) { foreach(var item in items) { // do something with the item… } }
如果我们只是遍历List容器中的所有内容的话,那么,使用IEnumerable接口会更好一些。因为函数参数传递一个List对象要比一个IEnumerable接口要花费更多的开销。
public void SomeMethod(IEnumerable<SomeItem> items) { foreach(var item in items) { // do something with the item… } }
7.直接使用数字
if(mode == 1) { … } else if(mode == 2) { … } else if(mode == 3) { … }
为什么不给你的这些数字取个名字呢?比如使用Enumerations。
public enum SomeEnumerator { DefaultMode = 1, SafeMode = 2, NormalMode = 3 } if(mode == SomeEnumerator.DefaultMode) { … } else if(mode == SomeEnumerator.SafeMode) { … } else if(mode == SomeEnumerator.NormalMode) { … }
8.字符串替换
string s = "www.coolshell.cn is a amazing site"; s.Replace("amazing", "awful");
字符串s的内容什么也不会改变,因为string返回的是替换过的字串。这点很多初学者经常忘了。下面就没有问题了。
s = s.Replace("amazing", "awful");
文章:来源
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《初学C#编程的注意事项》的相关评论
if (!String.IsNullOrEmpty(someString) && someString.Length > 0)
{
// 是不是更好一些?
}
这段真是够BT的,能提供一个方法isEmpty()会不会更好些?
@zdhsoft
对不起,写错了,其实只需要!String.IsNullOrEmpty(someString)就可以了。
5. 不能用 using(var dbConn = new SqlConnection(”Some Connection String”))吗?
6. “如果我们只是遍历List容器中的所有内容的话,那么,使用IEnumerable接口会更好一些。因为函数参数传递一个List对象要比一个IEnumerable接口要花费更多的开销。”
这是错误的,都是传引用,没什么不同的开销。
如果是List,用For 比For each 要快很多
受教
对“2.字符器连接”有些补充。
这里的性能要差很多,不光是2次函数调用的问题。
比如,
string s = “dev”;
这里c#要先在内存中创建一个“dev” string object。
s += “-”;
这里c#又要在内存中创建另一个“-” string object,然后进行+=运算,结果“dev-”放入一个新创建的string object中,尽管看起来还是string s。
这还不算完,之后c#还要destroy两个不用的objects:“dev”和“-”。
如果用StringBuilder就省很多。
关于字符串连接, 你确定直接相加比StringBuilder 慢?请仔细阅读MSDN文档关于StringBuilder的解释(the String class is preferable for a concatenation operation if a fixed number of String objects are concatenated.)并自己写代码测试。 固定个数的string连接直接相加比用StringBuilder要快, 比如”a”+”b”+”c”+”d” 比 StringBuilder a=new StringBuilder(“a”); a.Append(“b”); a.Append(“c”); a.Append(“d”); 要快,要连接的字符串越多越明显。 只有在循环等不能事先确定由多少子串要拼接的时候才应该用StringBuilder。 例如:StringBuilder a=new StringBuilder(); for(int i=0;li<100;i++){a.Append(i.ToString();}
都是以前常遇到的问题,总结的真全面
这个正解,new StringBuilder()时会分配一个足够大的连续内存空间,如果连接的串很少就是一种浪费
3.使用Console
1 Console.WriteLine(“A= ” + 1 + ” B=” + 2 + ” C= ” + someValue);
和第二点说的一样,这并没有效率,使用下面的语句,会更有效率。
1 Console.WriteLine(”A: {0}\nB: {1}\nC: {2}”, 1, 2, someValue);
这2种写法,没有太大区别,有效率的写法是值类型要加上ToString,如:
Console.WriteLine(“A= ” + 1.ToString() + ” B=” + 2.ToString() + ” C= ” + someValue);
Console.WriteLine(”A: {0}\nB: {1}\nC: {2}”, 1.ToString(), 2.ToString(), someValue);
因为这2种调用,都是把值类型当成Object传递,造成拼接的时候,值类型要先装箱,而.net里装箱和拆箱的效率是非常低的,而调用ToString方法,是调用外部的
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern string FormatInt32(int value, string format, NumberFormatInfo info);
效率会高的多
那个DBConnection的例子用using语句更好一些
6.使用List类
理由写的不正确,传List与传IEnumerable都是引用传递,没有效率上的差异。
为何使用 IEnumerable 是从接口的角度来考量的,如果你的接口仅仅是做遍历,那使用IEnumerable 则可以支持所有实现该接中的类型去调用该方法。
http://www.coolshell.cn is an amazing site
如果能再加入一些性能数据就更好了
来源链接有问题,麻烦查看下,链接到了一个导航页面,且带颜色