当前位置: 首页 > 编程笔记 >

C#新手常犯的错误汇总

杜元明
2023-03-14
本文向大家介绍C#新手常犯的错误汇总,包括了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:具体可以参考WinForm相对路径的陷阱。

3、使用 xml, json 等序列化后的数据格式传递数据时,如果传递的数据为数值型类型,解析时,最好先将其转为string 然后 tryParse 成相应类型。

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

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

 类似资料:
  • 本文向大家介绍oracle代码的常见错误汇总,包括了oracle代码的常见错误汇总的使用技巧和注意事项,需要的朋友参考一下 很多使用其他数据库的朋友在转到Oracle数据库的时候经常会犯一些习惯性的错误,本文汇总了一些常见的Oracle代码错误,供大家查询比对。 1. 插入语句写成: 应为: 2. 应改为: 3. 永远不会触发no_data_found错误,应该判断v_count=0 4.返回值问

  • 本文向大家介绍程序员常犯的Python编程错误是什么?,包括了程序员常犯的Python编程错误是什么?的使用技巧和注意事项,需要的朋友参考一下 这是程序员犯下的一些最常见的python编程错误/陷阱- 范围名称查找-Python按照LEGB(本地,封闭,全局,内置)的顺序遵循作用域规则。由于python没有严格的类型绑定,因此程序员可以将外部作用域变量与另一个值相关联,该变量稍后可能会在外部作用域

  • 本文向大家介绍Python程序员开发中常犯的10个错误,包括了Python程序员开发中常犯的10个错误的使用技巧和注意事项,需要的朋友参考一下 Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库。与其它大多数程序设计语言使用大括号不一样 ,它使用缩进来定义语句块。   在平时的工作中,Python开发者很容易犯一些小错误,这些错误都很容易避免,本文总结了Python开发

  • 本文向大家介绍Ajax犯的错误处理方法,包括了Ajax犯的错误处理方法的使用技巧和注意事项,需要的朋友参考一下 1, ajax 发送请求时状态判断 if else 语句问题。   当时输出了两个200 的状态码,然后才输出xhr.responseText, 获取到的内容。 当时很奇怪,不知道这两个200 是怎么来的?   当时尝试输出不少内容,但还是找不到原因。 只有到把else 语句中改为 co

  • 最近帮几位同学做了模拟面试,发现大家都会犯一些常见错误,之前招社招同学的时候也发现了类似的问题,我汇总一下,希望对你有些帮助 1.上来自我介绍过于简短,或者过于平淡,无法让面试官形成记忆点和兴趣点。 自我介绍是你主动展示的环节,好的自我介绍可以引导谈话的方向,聊自己有充分准备的内容,突出自己的优势。 如果你说的太少,等着对方问,可能会有点尴尬。因为面试官可能没提前详细看你的简历,也不知道立马能问啥

  • 万事开头难, Java 编程的初学者常常会遇到各种各样的问题。对于自学的读者来说,则是需要花费更多的时间、精力来解决这些问题,而且一旦遇到的问题几天都得不到解决,往往会带来很大的挫败感。 所以本节介绍一些初学者经常出现的错误,以便减少读者在学习中的障碍。 1)大小写问题 之前我们已经提到,Java 是区分大小写的语言。但由于大部分读者都是 Windows 操作系统的忠实拥护者,因此对大小问题往往都