博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#新手常犯的错误
阅读量:7212 次
发布时间:2019-06-29

本文共 3733 字,大约阅读时间需要 12 分钟。

虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记。

1、遍历List的错误,比如如下代码:

List
strList =newList
for(int i =0; i

 

这段代码看上去是删除了所有元素,实际上每次调用RemoveAt方法会导致List元素索引重排,最后导致元素没有完全删除。

可以改成:

List
strList =newList
for(int i =0; i

这样就可以完全删除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 成相应类型。

至于原因:如上的第三点、是装箱和拆箱的问题。

 

 

 

 

转载于:https://www.cnblogs.com/08shiyan/p/3481640.html

你可能感兴趣的文章
php根据二分查找法从普通csv文件中获取ip的地理位置(效率比使用mysql提高近800倍)...
查看>>
结巴分词
查看>>
常见的NSArray和NSMutableArray方法
查看>>
Ucenter 整合第三方应用
查看>>
golang 用sublime text3 作为IDE进行配置
查看>>
magento 搜索
查看>>
selenium ide 自动化测试
查看>>
各种架构简易图
查看>>
JuniperSRX 基本初始配置步骤(Security Policy 2)
查看>>
java学习之7个java内存管理技巧
查看>>
SpringBoot的启动方式
查看>>
迁移到Server2008 R2
查看>>
mariadb-10.1主从复制
查看>>
fedora/centos系统下完美解决gedit和vim中文乱码
查看>>
java.lang.IllegalStateException: commit already ca
查看>>
linux下八步安装mongodb数据库
查看>>
git 命令
查看>>
我的友情链接
查看>>
链表原地反转
查看>>
Solr笔记四之Solrj创建索引和搜索的一般步骤
查看>>