C#新手常犯的失实

可以像这样操作:

public static bool operator ==(Test t1, Test t2)
{
    if ((t2 as object) == null)
    {
        return (t1 as object) == null;
    }
    else
    {
        return t2.Equals(t1);
    }
}

10、在C#和SQL Server通信时要注意NULL的意义,在SQL
Server里面这一个值代表1900-1-1。SQL Server的空值可以利用DBNull来代表。
暂时就是这么多了,注意到上述10点可以在编程的时候减弱大量BUG。

分割线

5、C#中调用结构的性能或者措施必须用new来声称结构变量,否则会出错。
6、假若运用了params使用三个参数,必须认清参数是否为空,否则程序会有暗藏的BUG。
7、静态成员在创制第一个实例的时候就会开头化,而且只被初叶化两回,不要乱用静态成员。
8、如若应用ref
Object类型参数接受String类型会出错,这是因为C#务求参数必须利用科学的连串,不加ref是可以的,即便一定要利用ref
Object接受String类型参数,可以先转型成Object,再引用传递。
9、类的构造函数中永远不要调用虚方法,比如:

 

 

 

 

 

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

这样就可以完全除去List中的元素。

 

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

2、WinForm
中的由相对路径引发的bug:WinForm中的暗杀杀手——绝对路径 

3、使用 xml, json
等系列化后的数量格式传递数据时,倘诺传递的数目为数值型类型,解析时,最好先将其转为string
然后 tryParse 成相应连串。

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

 

 

 

 

这里的问题在于MyFun中会把NULL传递进==运算符函数,导致运行的时候报错,正确的做法是:

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);
        }
    }
}

 

List<String> strList =newList<String>

for(int i =0; i<strList.Count; i++)
{
    strList.RemoveAt(i);
        i-=1;
}

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

List<String> strList =newList<String>

for(int i =0; i<strList.Count; i++)
{
    strList.RemoveAt(i);
}

2、关于C#常量的谬误
譬如说您写了一个类库,在其中定义了如下常量:

就能到位转型
4、重载==运算符的荒唐:

Int64 b =(Int64)(Int32)obj;

 

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的时候抛出异常,因为此时派生类对象还没有被构造。

并且在另一个程序里引用了这些类库,假使您改改了那个类库中的常量,发布了一个新的本子,那么再运行往日的顺序,你会发觉常量依然本来的常量,并不曾改动。那是因为C#在编译的时候,常量直接当做元数据嵌入,解决方法是重新编译整个解决方案依然利用性质而不是直接访问常量。
3、当把值类型装箱后,假设拆箱只可以拆成原本装箱前的项目,比如:

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

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

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

这段代码看上去是剔除了装有因素,实际上每一次调用RemoveAt方法会招致List元素索引重排,最后导致元素没有完全除去。
可以改成:

public const String str="First Version";

尽管这篇post的题目是新手常犯的失实,实际上很多有经历的程序员也平时犯这么些不当,我收拾了须臾间,就当是笔记。
1、遍历List的荒谬,比如如下代码:

相关文章