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 ...
随机推荐
- PreparedStatement的应用
package it.cast.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql ...
- DM 多路径存储
DM多路径存储 系统环境:RHEL5.4 small install selinux and iptables disabled主机规划:主机网卡软件station133eth0: 192.168. ...
- iOS开发系列--UITableView全面解析
--UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...
- [转] Android优秀开源项目
Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习.今天爬爬把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助.另外, ...
- 【笔记】js获取当前点击元素的索引
以前用jq 做过图片切换 滑动之类的特效现在想用js 试试是怎么一回事 jq图片切换的思路是用index()函数获取当前点击的按钮的索引然后根据索引值将对应索引的图片显示出来 于是查了一下js 是如何 ...
- LINQ系列:Linq to Object投影操作符
投影是指在将序列中的元素转换为一个自定义形式的操作.投影操作符Select和SelectMany用于选择出赋予了适当功能的值.SelectMany操作符可以处理多个集合. LINQ表达式语法: 1. ...
- MVC4做网站后台:用户管理 ——用户组补充
上次做完发现存在点问题. 1.是类型显示的为数字(如下图): 2.是不能根据类型进行查询. 首先做查询.easyui-datagrid可以添加toolbar. 在datagrid的data-optio ...
- 配置 L3 agent - 每天5分钟玩转 OpenStack(99)
上一节我们介绍了路由服务(Routing)的基本功能,今天教大家如何配置. Neutron 的路由服务是由 l3 agent 提供的. 除此之外,l3 agent 通过 iptables 提供 fir ...
- 掌握 Cinder 的设计思想 - 每天5分钟玩转 OpenStack(46)
上一节介绍了 Cinder 的架构,这节讨论 Cinder 个组件如何协同工作及其设计思想. 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder 学习来说,Volu ...
- JS+CSS3实现带预览图幻灯片效果
这个案例学习起来还有点吃力,目前还没有独自自己写出来过,贴出来以免忘记. 慕课网该课程原地址:http://www.imooc.com/learn/412 源码: <!DOCTYPE html& ...