本文所述为C#新手常犯的错误,但是实际上很多有经验的措施员也经常犯这些错误,对此出格整理了一下,供大家参考。具体如下:
1、遍历List的错误
,好比如下代码:
List<String> strList =newList<String> for(int i =0; i<strList.Count; i++) { strList.RemoveAt(i); }
这段代码看上去是删除了所有元素,实际上每次挪用RemoveAt要领会导致List元素索引重排,最后导致元素没有完全删除。
可以改成:
List<String> strList =newList<String> for(int i =0; i<strList.Count; i++) { strList.RemoveAt(i); i-=1; }
这样就可以完全删除List中的元素。
2、关于C#常量的错误
好比你写了一个类库,在里面界说了如下常量:
public const String str="First Version";
并且在另一个措施里引用了这个类库,如果你改削了这个类库中的常量,颁布了一个新的版本,那么再运行之前的措施,你会发明常量还是本来的常量,并没有转变。这是因为C#在编译的时候,常量直接作为元数据嵌入,解决要领是从头编译整个解决方案或者使用属性而不是直接访谒常量。
3、当把值类型装箱后,如果拆箱只能拆本钱来装箱前的类型
,好比:
Int32 a=3; Object obj=new object(); //这里装箱告成,不会掉败 obj=i; //拆箱必然会掉败 Int64 b=(Int64)obj;
可以像这样操纵:
Int64 b =(Int64)(Int32)obj;
就能完成转型
4、重载==运算符的错误:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UseOperator { class Program { static void Main(string[] args) { Test t1 = new Test(); t1.MyFun(); Console.ReadLine(); } } class Test { public void MyFun() { Test t = new Test(); if (t == null) { Console.WriteLine("t为空!"); } else { Console.WriteLine("t不为空!"); } } //存在BUG的重载运算法 public static bool operator ==(Test t1, Test t2) { return t2.Equals(t1); } public static bool operator !=(Test t1, Test t2) { return !(t1 == t2); } //笼罩HashCode public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object obj) { return base.Equals(obj); } } }
这里的问题在于MyFun中会把NULL通报进==运算符函数,导致运行的时候报错,正确的做法是:
public static bool operator ==(Test t1, Test t2) { if ((t2 as object) == null) { return (t1 as object) == null; } else { return t2.Equals(t1); } }
5、C#中挪用布局的属性或者要领必需用new来声明布局变量,,否则会堕落。
6、如果使用了params使用多个参数,必需判断参数是否为空,否则措施会有隐藏的BUG。
7、静态成员在创建第一个实例的时候就会初始化,而且只被初始化一次,不要乱用静态成员。
8、如果使用ref Object类型参数接受String类型会堕落,这是因为C#要求参数必需使用正确的类型,不加ref是可以的,如果必然要使用ref Object接受String类型参数,可以先转型成Object,再引用通报。
9、类的结构函数中永远不要挪用虚要领,好比:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FransferVirtualFunction { class Program { static void Main(string[] args) { try { Child ch = new Child(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } public class Ref { public string Str = "这是Ref类的一个成员"; } public class Parent { protected Ref my; public Parent() { my = new Ref(); //结构要领中挪用了虚要领 Console.WriteLine(GetString()); } //虚要领 public virtual string GetString() { return my.Str; //使用了内部成员 } } public class Child : Parent { private Ref my2; public Child() : base() { my2 = new Ref(); } //重写虚要领 public override string GetString() { return my2.Str; //使用了内部成员 } } }
这里在执行基类的结构函数的时候会执行到派生类的虚要领GetString(),在获取my2.Str的时候抛出异常,因为此时派生类东西还没有被结构。
10、在C#和SQL Server通信时要注意NULL的含义,在SQL Server里面这个值代表1900-1-1。SQL Server的空值可以使用DBNull来暗示。
暂时就是这么多了,注意到以上10点可以在编程的时候减少大量BUG。
增补:
1、Math 三角函数 此中的参数为 弧度值,而非角度值。
2、WinForm 中的由相对路径引发的bug:具体可以参考
。
3、使用 xml, json 等序列化后的数据格局通报数据时,如果通报的数据为数值型类型,解析时,最好先将其转为string 然后 tryParse 成相应类型。
至于原因:如上的第三点、是装箱和拆箱的问题。