C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记。
1、遍历List的错误,比如如下代码:
List<String> strList =newList<String> for(int i =; i<strList.Count; i++)
{
strList.RemoveAt(i);
}
这段代码看上去是删除了所有元素,实际上每次调用RemoveAt方法会导致List元素索引重排,最后导致元素没有完全删除。
可以改成:
List<String> strList =newList<String> for(int i =; i<strList.Count; i++)
{
strList.RemoveAt(i);
i-=;
}
这样就可以完全删除List中的元素。
2、关于C#常量的错误
比如你写了一个类库,在里面定义了如下常量:
public const String str="First Version";
并且在另一个程序里引用了这个类库,如果你修改了这个类库中的常量,发布了一个新的版本,那么再运行之前的程序,你会发现常量还是原来的常量,并没有改变。这是因为C#在编译的时候,常量直接作为元数据嵌入,解决方法是重新编译整个解决方案或者使用属性而不是直接访问常量。
3、当把值类型装箱后,如果拆箱只能拆成原来装箱前的类型,比如:
Int32 a=;
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。
原文出自:王锐 http://www.shunix.com
分割线
————————————————————————————————————————————————————————————
1、Math 三角函数 其中的参数为 弧度值,而非角度值。
2、WinForm 中的由相对路径引发的bug:WinForm中的暗杀杀手——相对路径
3、使用 xml, json 等序列化后的数据格式传递数据时,如果传递的数据为数值型类型,解析时,最好先将其转为string 然后 tryParse 成相应类型。
至于原因:如上的第三点、是装箱和拆箱的问题。
C#新手常犯的错误的更多相关文章
- 零基础怎么学Python编程,新手常犯哪些错误?
Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...
- Python 新手常犯错误
Python 新手常犯错误(第二部分) 转发自:http://blog.jobbole.com/43826/ 作用域 在这篇文章里,我们来关注作用域在Python被误用的地方.通常,当我们定义了一个全 ...
- 网站移植到linux上后常犯的错误
常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...
- Python 新手常犯错误(第二部分)
转发自:http://blog.jobbole.com/43826/ 在之前几个月里,我教一些不了解Python的孩子来慢慢熟悉这门语言.渐渐地,我发现了一些几乎所有Python初学者都会犯的错误,所 ...
- Python 新手常犯错误(第一部分)
转载自:http://blog.jobbole.com/42706/ 在之前几个月里,我教一些不了解Python的孩子来慢慢熟悉这门语言.渐渐地,我发现了一些几乎所有Python初学者都会犯的错误,所 ...
- Python 新手常犯错误(第一部分)转载
觉得这篇文章针对python的默认参数写的不错,翻译的也不错,故转载下. 原文链接: Amir Rachum 翻译: 伯乐在线- 伯乐在线读者译文链接: http://blog.jobbole.c ...
- 在CMMI推广过程中EPG常犯的错误(转)
本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...
- web设计经验<八>20个设计新手常犯的排版设计误区
很多同学问设哥,为什么别人字体就那么随意放一下就辣么好看,其实排版可有大学问,不是随意放就好看.这就如同配色一样,也有千变万化的学问.相信大家看完Designschool这篇头条热文,一定倍有收获. ...
- 使用DX绘制3D物体时新手常犯错误,看不见物体时可以一一排查
1.镜头不对: 物体不在镜头范围内,检查视图矩阵,世界矩阵,投影矩阵. 2.颜色全黑: 打开光照情况下,MATERIAL全为0, 或,在没有打开光照情况下,颜色值为0,造成全黑.检查当前Materia ...
随机推荐
- c#多线程介绍(上)
转载原文:这里是链接内容 转载原文:这里写链接内容 转载原文:这里写链接内容 (重要事情说三遍) 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个 ...
- Independent Components Analysis:独立成分分析
一.引言 ICA主要用于解决盲源分离问题.需要假设源信号之间是统计独立的.而在实际问题中,独立性假设基本是合理的. 二.随机变量独立性的概念 对于任意两个随机变量X和Y,如果从Y中得不到任何关于X的信 ...
- 探索c#之跳跃表(SkipList)
阅读目录: 基本介绍 算法思想 演化步骤 实现细节 总结 基本介绍 SkipList是William Pugh在1990年提出的,它是一种可替代平衡树的数据结构. SkipList在实现上相对比较简单 ...
- Ubuntu 16 安装JDK1.8
检查是否JDK已被安装: 上图表示没有安装,创建文件夹: 下载JDK: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
- 未找到与约束 ContractName Microsoft.VisualStudio.Text.ITextBufferFactoryService RequiredTypeIdentity Microsoft.VisualStudio.Text.ITextBufferFactoryService
问题:vs2013在装了 之后,重启,打开VS提示: 未找到与约束 ContractName Microsoft.VisualStudio.Text.ITextBufferFactoryService ...
- CentOS 7 网络配置
Virtual box 安装了CentOS 7最小模式后马上用ifconfig命令查看网络情况,发现该命令不存在. [root@centos1 ~]# ifconfig -bash: ifconfig ...
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- Ucos系统任务间的通信详解
物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧. 1)消息邮箱 我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描 ...
- 解密jQuery内核 DOM操作
jQuery针对DOM操作的插入的方法有大概10种 append.prepend.before.after.replaceWith appendTo.prependTo.insertBefore.in ...
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...