C#注意事项
1、运算溢出处理
C#默认忽略溢出异常,如果需要强制进行局部异常检查则需要是使用checked关键字。如果需要进行全局性的异常检查则需用启用/checked属性。
1 /*****************************************/ 2 short numb1 = 30000, numb2 = 30000; 3 // 显式的将int转换为short(允许数据丢失). 4 short answer = (short)Add(numb1, numb2); 5 /****************************************/ 6 7 //捕获溢出异常 8 try 9 { 10 byte sum = checked((byte)Add(b1, b2)); 11 Console.WriteLine("sum = {0}", sum); 12 } 13 catch (OverflowException ex) 14 { 15 Console.WriteLine(ex.Message); 16 }
2、隐式变量(var),只能用于方法或属性范围内的本地变量。var变量必须在声明时为其赋初始值。
隐式变量类型也是强类型变量,在编译时确定了其类型,之后该数据被认为是其声明时的数据类型。不同于JavaScript和PHP等语言中的变量类型(通常叫做动态类型)。C#中的动态类型需要使用dynamic来声明。
static void DeclareImplicitVars() { // Implicitly typed local variables. var myInt = 0; var myBool = true; var myString = "Time, marches on..."; // Print out the underlying type. Console.WriteLine("myInt is a: {0}", myInt.GetType().Name); Console.WriteLine("myBool is a: {0}", myBool.GetType().Name); Console.WriteLine("myString is a: {0}", myString.GetType().Name); }
注意:使用隐式的本地变量并不能带来任何好处,反而让阅读者不能一目了然。所以,如果需要int就声明为int而非var。那么要var干什么?
隐式变量的作用:隐式变量在LINQ技术中不可或缺。应该只有在定义LINQ返回值类型时才使用var.
1 #region LINQ example 2 static void QueryOverInts() 3 { 4 int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 }; 5 var subset = from i in numbers where i < 10 select i; 6 7 Console.Write("Values in subset: "); 8 foreach (var i in subset) 9 { 10 Console.Write("{0} ", i); 11 } 12 Console.WriteLine(); 13 14 // Hmm...what type is subset? 15 Console.WriteLine("subset is a: {0}", subset.GetType().Name); 16 Console.WriteLine("subset is defined in: {0}", subset.GetType().Namespace); 17 } 18 #endregion
3、字符串赋值
C#中使用string声明的字符串类型在赋值时,字符串内容的直接修改并非对原有字符串进行修改,而是开辟另外一个存储区域存储最新的赋值。若字符串多次变更则不应过多的直接使用字符串赋值。应替换使用System.Text.StringBuilder
1 #region StringBuilder 2 static void FunWithStringBuilder() 3 { 4 Console.WriteLine("=> Using the StringBuilder:"); 5 6 // Make a StringBuilder with an initial size of 256. 7 StringBuilder sb = new StringBuilder("**** Fantastic Games ****", 256); 8 9 sb.Append("\n"); 10 sb.AppendLine("Half Life"); 11 sb.AppendLine("Beyond Good and Evil"); 12 sb.AppendLine("Deus Ex 2"); 13 sb.AppendLine("System Shock"); 14 Console.WriteLine(sb.ToString()); 15 16 sb.Replace("2", "Invisible War"); 17 Console.WriteLine(sb.ToString()); 18 Console.WriteLine("sb has {0} chars.", sb.Length); 19 Console.WriteLine(); 20 } 21 #endregion
4、C#的函数参数传递
参数修饰符:无,out,ref,params。
无修饰符则为按值传递
out修饰符定义一个引用参数,函数的结果必须通过这个参数输出。可以使用多个out参数,让函数有多个返回。
注意:方法中只能包含一个params参数,且必须位于函数的最后一个参数。
可选参数:必须放在所有非可选参数之后。
5、null可用于创建一个空的对象引用。在数据库操作中会经常遇到null的情况。可空类型可以通过?来定义。??操作用于进行是否为null及若为null的赋值。