C#新手常犯的错误汇总
作者:shichen2014 发布时间:2021-10-29 05:05:53
本文所述为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#程序设计可以带来很大的帮助。


猜你喜欢
- 一、什么是并查集对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?并查集是一种树型的数据结构,用于处理一些不相交
- static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概
- 本文实例讲述了C#中Arraylist的sort函数用法。分享给大家供大家参考。具体如下:ArrayList的sort函数有几种比较常用的重
- 现在许多流行的软件中都有欢迎界面,今天就介绍一下欢迎界面的制作,由于界面涉及到页面的滑动,因此要采用ViewPager,sdk在4.0一下的
- 1、@Select注解基本用法@Select注解的目的是为了取代xml中的select标签,只作用于方法上面。下面看一下@Select注解的
- 本文实例讲述了Android实现跑马灯效果的方法。分享给大家供大家参考。具体如下:运行效果截图如下:直接在布局里写代码就好了:<Tex
- 在Java的内存分配中,总共3种常量池:Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池
- Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它
- 设置超时时间设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时
- 代码如下:public class TempTest { public static void main(String[] args) {
- 前言A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中通过二维数组构建的一个迷宫,“%”
- 看到有人在问如何实现淘宝商品详情页效果,献上效果图大致梳理一下思路,这里不提供源码状态栏透明使用开源库StatusBarCompat,为了兼
- 我们都知道在ios手机上面,有一个侧滑退出当前界面的功能,但是在安卓手机上系统没有给我们提供这样的功能,但是这依然阻挡不了强大的安卓的定制功
- 本文实例为大家分享了Java开发实现人机猜拳游戏的具体代码,供大家参考,具体内容如下猜拳游戏游戏规则:人和电分别出剪刀、石头、布,直到人战胜
- 简介我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。
- 需要记录日志的地方包括:进入方法的时候,传参的时候,统计执行时间,方法返回参数的时候,退出语句块的时候,出现异常的时候,等等。先来体验不使用
- Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向图像的Sensor方向:手机Cam
- @Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务。它的实现原理是通过Spring AOP在
- 本文实例为大家分享了SpringBoot实现动态多线程并发定时任务的具体代码,供大家参考,具体内容如下实现定时任务有多种方式,使用sprin
- 本文实例讲述了Android实现GridView中ImageView动态变换的方法。分享给大家供大家参考。具体如下:使用YY影音的时候,发现