SQL ServerC#新手常犯的不当

即使那篇post的标题是新手常犯的一无可取,实际上很多有经历的程序员也常常犯那么些错误,笔者收拾了须臾间,就当是笔记。
① 、遍历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";

 

与此同时在另1个程序里引用了那么些类库,假若您改改了那么些类库中的常量,发表了2个新的版本,那么再运维从前的顺序,你会发觉常量依然原先的常量,并不曾改变。那是因为C#在编写翻译的时候,常量直接当做元数据嵌入,消除办法是再次编写翻译整个化解方案或然应用性质而不是直接待上访问常量。
三 、当把值类型装箱后,即使拆箱只好拆成原来装箱前的体系,比如:

Int32 a=3;
Object obj=new object();

//这里装箱成功,不会失败
obj=i;

 //拆箱一定会失败
Int64 b=(Int64)obj;

 

能够像这么操作:

Int64 b =(Int64)(Int32)obj;

 

就能一鼓作气转型
四 、重载==运算符的不当:

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来声称结构变量,不然会出错。
陆 、借使利用了params使用八个参数,必须认清参数是不是为空,不然程序会有藏匿的BUG。
⑦ 、静态成员在创立第2个实例的时候就会发轫化,而且只被初阶化二次,不要乱用静态成员。
八 、如若选取ref
Object类型参数接受String类型会出错,那是因为C#务求参数必须利用科学的类型,不加ref是足以的,假诺一定要动用ref
Object接受String类型参数,能够先转型成Object,再引用传递。
SQL Server,玖 、类的构造函数中永远不要调用虚方法,比如:

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里面那些值代表一九零四-1-1。SQL Server的空值能够利用DBNull来代表。
临时便是如此多了,注意到以上10点能够在编程的时候减少多量BUG。

 

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

 

分割线

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

 

壹 、Math 三角函数 个中的参数为 弧度值,而非角度值。

② 、WinForm
中的由相对路径引发的bug:WinForm中的暗杀徘徊花——绝对路径 

三 、使用 xml, json
等类别化后的多少格式传递数据时,如若传递的多寡为数值型类型,解析时,最棒先将其转为string
然后 tryParse 成相应项目。

有关原因:如上的第一点、是装箱和拆箱的难题。

 

 

 

 

相关文章