尽管如此这篇post的标题是新手常犯的左,实际上很多有经验的程序员也常发作这些不当,我整理了一晃,就当是记。
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。

 

原稿出自:王锐 http://www.shunix.com 

 

分割线

————————————————————————————————————————————————————————————

 

1、Math 三角函数 其中的参数为 弧度值,而休角度值。

2、WinForm
中的出于相对路径引发的bug:WinForm中之干杀手——相对路径 

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

关于因:如达到的老三沾、是装箱和拆箱的问题。

 

 

 

 

相关文章

网站地图xml地图