C#新手常犯的错误汇总

本文所述为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 成相应类型。

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

相信本文所述对大家C#程序设计可以带来很大的帮助。

除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
  C#新手常犯的错误汇总

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23602.html

相关内容

C#中把任意类型的泛型集合转换成SQLXML数据格式的实例

C#简单访问SQLite数据库的方法(安装,连接,查询等)

C#.Net ArrayList的使用方法

WinForm实现自定义右下角提示效果的方法


C#显示文件夹下所有图片文件的方法

c#实现抓取高清美女妹纸图片

WinForm中的几个实用技巧汇总

C#中类与结构的区别实例分析

时间: 2024-09-29 19:47:29

C#新手常犯的错误汇总的相关文章

代码整洁之道,新手常犯的错误。

工作几年来,见过很多糟糕的代码.It是人口流动性很大的行业,如果不注重质量,那就是无数个坑.当需求变动,去改一段很长很糟糕第n手的代码时,内心是崩溃的,这就是国内IT的现状.下面是几个写出优质代码的好习惯,大部分公司没有硬性要求,所以很多人常犯这些错误.     1.形参的命名和数量. 变量命名的好建议是可以读出来的,有具体含义的,而不是mcount,amerber这种缩写的. 形参的数量最多控制在四个,再多就需要建对象.  2.临时变量的命名和数量. 临时变量的命名很多人不注意,比如s1,st

新手常犯的错误

1:忽略大小写的区别2:“{}”与“()”使用不当造成错误3:在if,while,#include,#define,for后直接加分号,如for(int a=1:a<10;a++);4:使用循环语句不慎产生死循环5:do....while与while之间的区别6:数据溢出产生的错误7:除号/用法导致的错误8:变量未定义9:用scanf输入数据时忘记加&符号10:使用scanf函数输入格式不符11:输入的数据类型不符的12:switch语句中忘记使用break;13:指针没被初始化14:超出动

java中自己常犯的错误汇总

1package debug; 2 3/* 4 1.定义一个公共的动物类,包含名字.年龄.颜色和吃饭东西方法 5 2.定义一个猫类,继承动物类,同时拥有玩游戏的本领 6 3.定义一个狗类,继承动物类,同时拥有看门的本领 7/ 8 9class Animal{10private String name;11privateint age;12private String color;1314public Animal() {1516 }1718publicAnimal(String name,int

Python 新手常犯错误

Python 新手常犯错误(第二部分) 转发自:http://blog.jobbole.com/43826/ 作用域 在这篇文章里,我们来关注作用域在Python被误用的地方.通常,当我们定义了一个全局变量(好吧,我这样说是因为讲解的需要——全局变量是不好的),我们用一个函数访问它们是能被Python理解的: 1 2 3 bar = 42 def foo():     print bar 在这里,我们在foo函数里使用了全局变量bar,然后它也如预想的能够正常运行: 1 2 >>> fo

python新手常犯的17个错误

1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 "SyntaxError :invalid syntax") 该错误将发生在类似如下代码中: 1 2 if spam== 42 print('Hello!') 2) 使用 = 而不是 ==(导致"SyntaxError: invalid syntax") = 是赋值操作符而 == 是等于比较操作.该错误发生在如下代码中: 1 2 if spam

网站移植到linux上后常犯的错误

常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里目录下去, 搜索gcc, 把相关的软件都装上. 在安装gcc的过程中,因为依赖性问题,在安装gcc之前 需要B->C->D软件 没有libppl*相关的软件,怎么办? 答:在光盘的packges里目录下,ls|grep ppl,找相关的软件装上. 2: 这类提示,缺少curses/tempcap库

程序员在页面上常犯的错误以及改正方法

我是一个性情乖戾的Web用户,但我想这也帮助促使我成为了一名优秀的Web开发人员.当我看到一个网站上有让人不爽的设计时就会非常的恼怒,一些很简单的东西为什么做不好?下面是5种常见的可用性方面的错误,以及如何纠正这些问题的方法.给自己方便,也与人方便,确保自己不要犯这样的错误. 使用表达submit事件,不要用click事件:请用表单标签form! 我不知道遇到过多少次,当我使用回车键提交一个表单时(或手机上用箭头/输入键),却什么都没发生.我只好又用鼠标点击提交按钮,表单终于有了反应.这是我最痛

信息安全事故中企业常犯的错误

古语云:"亡羊补牢,犹未为晚".随着信息化的飞速发展,企业的信息安全正受到日益严峻的挑战,近年来,很多大企业都遭受到了攻击而泄露数据的事故,更何况一些中小企业或个人.最近的iCloud信息泄露事件,不仅"坑到"了众多好莱坞女星,也再一次在信息安全领域拉响了数据危机警报. 企业在受到攻击数据泄露后,尤其是对外部,如果不能正确处理,将导致事态恶化,并对企业品牌.业绩造成二次打击,更有甚者会带来进法律风险.如何有效的处理,这其实是<信息安全管理实施指南>即IS

Python新人常犯的错误有哪些?

Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码,有一个外国小伙总结了一些大家常犯的错误,我把他翻译过来并在原来的基础补充了我的一些理解,希望可以让你避开这些坑,更好的学习python. 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 ":" if spam == 42 print(