SQL ServerC#新手常犯的失实

虽这首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 成相应项目。

至于因:如齐之老三碰、是装箱和拆箱的题目。

 

 

 

 

相关文章