前言本节主要来学习下实例构造函数、私有构造函数和静态构造函数。构造函数的作用:1、当一个类在new实例化对象时,可调用构造函数进行初始化对象。2、不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。除非类是static的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。3、通过将构造函数设置为私有构造函数可以阻止类被实例化。4、结构类型的构造函数与类的构造函数类似,但是structs不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将struct中的每个字段初始化为默认值。只有当struct用new实例化时,才会调用此默认构造函数。实例构造函数使用new表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。要初始化静态类或非静态类中的静态变量,必须定义静态构造函数。classCoOrds{publicintx,y;//constructorpublicCoOrds(){x=0;y=0;}}只要创建基于CoOrds类的对象,就会调用此实例构造函数。诸如此类不带参数的构造函数称为“默认构造函数”。然而,提供其他构造函数通常十分有用。例如,可以向CoOrds类添加构造函数,以便可以为数据成员指定初始值:publicCoOrds(intx,inty){this.x=x;this.y=y;}这样便可以用默认或特定的初始值创建CoOrd对象,如下所示:CoOrdsp1=newCoOrds();CoOrdsp2=newCoOrds(5,3);如果某个类没有构造函数,则会自动生成一个默认构造函数,并使用默认值来初始化对象字段。也可以用实例构造函数来调用基类的实例构造函数。类构造函数可通过初始值设定项来调用基类的构造函数,如下所示:abstractclassShape{publicconstdoublepi=Math.PI;protecteddoublex,y;publicShape(doublex,doubley){this.x=x;this.y=y;}publicabstractdoubleArea();}classCircle:Shape{publicCircle(doubleradius):base(radius,0){}publicoverridedoubleArea(){*x*x;}}在此示例中,Circle类将表示半径和高度的值传递给Shape(Circle从它派生而来)提供的构造函数。私有构造函数私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如:classNLog{//PrivateConstructor:privateNLog(){}publicstaticdoublee=Math.E;//2.71828...}声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用private修饰符来清楚地表明该类不能被实例化。当没有实例字段或实例方法(如Math类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。如果类中的所有方法都是静态的,可考虑使整个类成为静态的。下面是使用私有构造函数的类的示例:publicclassCounter{privateCounter(){}publicstaticintcurrentCount;publicstaticintIncrementCount(){return++currentCount;}}classTestCounter{staticvoidMain(){//CounteraCounter=newCounter();//ErrorCounter.currentCount=100;Counter.IncrementCount();Console.WriteLine(Newcount:{0},Counter.currentCount);Console.WriteLine(Pressanykeytoexit.);Console.ReadKey();}}注意,如果您取消注释该示例中的以下语句,它将生成一个错误,因为该构造函数受其保护级别的限制而不可访问://CounteraCounter=newCounter();//Error静态构造函数静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。classSimpleClass{staticreadonlylongbaseline;staticSimpleClass(){=DateTime.Now.Ticks;}}静态构造函数具有以下特点:静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用LoadLibrary方法。如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。C#基础知识系列四(运算符汇总)前言本节主要来讲C#中的各种运算符。主要包括is运算符、as运算符、checked和unchecked运算符、sizeof运算符、空接合运算符(??)、&和&&、移位运算符、增量和减量运算符、条件运算符(三元运算符)、命名空间别名限定符。正文1、is运算符is运算符可以检查对象是否与特定的类型兼容。比如下例中要检查变量是否与object类型兼容:inti=0;if(iisobject){Console.WriteLine(iisanobject.);}2、as运算符as运算符用于执行引用类型的显式类型转换。如果要转换的类型和指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。举例如下:staticvoidMain(string[]args){objectobj1=astring;objectobj2=5;stringstr1=obj1asstring;stringstr2=obj2asstring;Console.Write(str1为{0}\r\n,str1);Console.Write(str2为{0},str2);Console.ReadLine();}注:as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。3、checked和unchecked运算符staticvoidMain(string[]args){byteb=255;b++;Console.WriteLine(第一个+b.ToString());try{bytec=255;checked{c++;//抛出OverflowExceptionConsole.WriteLine(b.ToString());}}catch(Exceptione){Console.WriteLine(抛出异常);}Console.ReadLine();}byte数据类型只能包含0~255的数,所以b值的增量会溢出。CLR如何处理溢出?C#提供了checked和unchecked运算符。如果把一块代码段标志为checked,CLR就会执行溢出检查,如果发生异常,就抛出异常。如果要禁止溢出检查,可以把代码标记为unchecked。注:unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。4、sizeof运算符sizeof可以用来确定堆栈中值类型需要的长度(单位是字节):5、空接合运算符(??)空接合运算符为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型不同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。但如果第一个操作数是null,则整个表达式就等于第二个操作数的值。例如:int?a=null;intb;b=a??10;//b的值为10;a=15;b=a??10;//b的值为15;6、&和&&&:二元运算符(&)为整型和bool类型预定义了二进制&运算符。对于整型,&计算操作数的按位“与”。对于bool操作数,&计算操作数的逻辑“与”;也就是说,当且仅当两个操作数均为true时,其结果才为true。&&:条件“与”运算符(&&)执行布尔操作数的逻辑“与”运算,但如有必要,只计算第二个操作数。它与二元运算符(&)很像,不同的是,如果x为false,则不计算y(因为不论y为何值,与操作的结果都为false)。这被称作为“短路”计算。稍微提一下按位“与”:运算规则:0&0=0;0&1=0;1&0=0;1&1=1;即:两位同时为“1”,结果才为“1”,否则为0例如:3&5即00000011&00000101=00000001因此,3&5的值得1。5&7即00000101&00000111=00000101因此,5&7的值得5。7、移位运算符是用(左移)和(右移)运算符是用来执行移位运算。左移()将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。左移相当于乘.左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。x1=x*2x2=x*4x3=x*8x4=x*16同理,右移即相反:右移()将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。右移相当于整除.右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。x1=x/2x2=x/4x3=x/8x4=x/16当声明重载C#移位运算符(这个在第一节中也有一个重载符《+》)时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是int,如:classProgram{staticvoidMain(string[]args){ShiftClassshift1=newShiftClass(5,10);ShiftClassshift2=shift12;ShiftClassshift3=shift12;Console.WriteLine({0}2结果是:{1},shift1.valA,shift2.valA);Console.WriteLine({0}2结果是:{1},shift1.valB,shift2.valB);Console.WriteLine({0}2结果是:{1},shift1.valA,shift3.valA);Console.WriteLine({0}2结果是:{1},shift1.valB,shift3.valB);Console.ReadLine();}publicclassShiftClass{publicintvalA;publicintvalB;publicShiftClass(intvalA,intvalB){this.valA=valA;this.valB=valB;}publicstaticShiftClassoperator(ShiftC