C#基础知识系列五(构造函数).doc_第1页
C#基础知识系列五(构造函数).doc_第2页
C#基础知识系列五(构造函数).doc_第3页
C#基础知识系列五(构造函数).doc_第4页
C#基础知识系列五(构造函数).doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言本节主要来学习下实例构造函数、私有构造函数和静态构造函数。构造函数的作用:1、当一个类在new实例化对象时,可调用构造函数进行初始化对象。2、不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。除非类是static的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。3、通过将构造函数设置为私有构造函数可以阻止类被实例化。4、结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将struct中的每个字段初始化为默认值。 只有当 struct 用 new 实例化时,才会调用此默认构造函数。实例构造函数使用 new 表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。 要初始化静态类或非静态类中的静态变量,必须定义静态构造函数。class CoOrds public int x, y; / constructor public CoOrds() x = 0; y = 0; 只要创建基于CoOrds类的对象,就会调用此实例构造函数。诸如此类不带参数的构造函数称为“默认构造函数”。然而,提供其他构造函数通常十分有用。例如,可以向CoOrds类添加构造函数,以便可以为数据成员指定初始值:public CoOrds(int x, int y) this.x = x; this.y = y;这样便可以用默认或特定的初始值创建CoOrd对象,如下所示:CoOrds p1 = new CoOrds();CoOrds p2 = new CoOrds(5, 3);如果某个类没有构造函数,则会自动生成一个默认构造函数,并使用默认值来初始化对象字段。也可以用实例构造函数来调用基类的实例构造函数。类构造函数可通过初始值设定项来调用基类的构造函数,如下所示:abstract class Shape public const double pi = Math.PI; protected double x, y; public Shape(double x, double y) this.x = x; this.y = y; public abstract double Area();class Circle : Shape public Circle(double radius) : base(radius, 0) public override double Area() return pi * x * x; 在此示例中,Circle类将表示半径和高度的值传递给Shape(Circle从它派生而来)提供的构造函数。私有构造函数私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如:class NLog / Private Constructor: private NLog() public static double e = Math.E; /2.71828.声明空构造函数可阻止自动生成默认构造函数。 注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。 但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。当没有实例字段或实例方法(如 Math 类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。 如果类中的所有方法都是静态的,可考虑使整个类成为静态的。下面是使用私有构造函数的类的示例: public class Counter private Counter() public static int currentCount; public static int IncrementCount() return +currentCount; class TestCounter static void Main() / Counter aCounter = new Counter(); / Error Counter.currentCount = 100; Counter.IncrementCount(); Console.WriteLine(New count: 0, Counter.currentCount); Console.WriteLine(Press any key to exit.); Console.ReadKey(); 注意,如果您取消注释该示例中的以下语句,它将生成一个错误,因为该构造函数受其保护级别的限制而不可访问:/ Counter aCounter = new Counter(); / Error静态构造函数静态构造函数用于初始化任何 静态 数据,或用于执行仅需执行一次的特定操作。 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。 class SimpleClass static readonly long baseline; static SimpleClass() baseline = DateTime.Now.Ticks; 静态构造函数具有以下特点: 静态构造函数既没有访问修饰符,也没有参数。 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。 无法直接调用静态构造函数。 在程序中,用户无法控制何时执行静态构造函数。 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用LoadLibrary方法。 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。C#基础知识系列四(运算符汇总) 前言本节主要来讲C#中的各种运算符。主要包括is运算符、as运算符、checked和unchecked运算符、sizeof运算符、空接合运算符(?)、&和&、移位运算符、增量和减量运算符、条件运算符(三元运算符)、命名空间别名限定符。正文1、is运算符is运算符可以检查对象是否与特定的类型兼容。比如下例中要检查变量是否与object类型兼容:int i=0;if(i is object) Console.WriteLine(i is an object.);2、as运算符as运算符用于执行引用类型的显式类型转换。如果要转换的类型和指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。举例如下: static void Main(string args) object obj1 = a string; object obj2 = 5; string str1 = obj1 as string; string str2 = obj2 as string; Console.Write(str1为0rn, str1); Console.Write(str2为0, str2); Console.ReadLine(); 注:as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。3、checked和unchecked运算符 static void Main(string args) byte b = 255; b+; Console.WriteLine(第一个+b.ToString(); try byte c = 255; checked c+; /抛出OverflowException Console.WriteLine(b.ToString(); catch (Exception e) Console.WriteLine(抛出异常); Console.ReadLine(); byte数据类型只能包含0255的数,所以b值的增量会溢出。CLR如何处理溢出?C#提供了checked和unchecked运算符。如果把一块代码段标志为checked,CLR就会执行溢出检查,如果发生异常,就抛出异常。如果要禁止溢出检查,可以把代码标记为unchecked。注:unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。4、sizeof运算符sizeof可以用来确定堆栈中值类型需要的长度(单位是字节):5、空接合运算符(?)空接合运算符为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型不同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。但如果第一个操作数是null,则整个表达式就等于第二个操作数的值。例如:int?a=null;int b;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即 0000 0011 & 0000 0101 = 0000 0001因此,3&5的值得1。5&7 即 0000 0101 & 0000 0111 = 0000 0101 因此,5&7的值得5。7、移位运算符是用(右移) 运算符是用来执行移位运算。 左移 () 将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。 左移相当于乘.左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。 x1= x*2 x2= x*4 x3= x*8 x) 将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。 右移相当于整除.右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。 x1= x/2 x2= x/4 x3= x/8 x4=x/16当声明重载C#移位运算符(这个在第一节中也有一个重载符+/aehyok/p/3499822.html)时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是 int,如: class Program static void Main(string args) ShiftClass shift1 = new ShiftClass(5, 10); ShiftClass shift2 = shift1 2; Console.WriteLine(0 2 结果是:1, shift1.valA, shift2.valA); Console.WriteLine(0 2 结果是:1, shift1.valA, shift3.valA); Console.WriteLine(0 2 结果是:1, shift1.valB, shift3.valB); Console.ReadLine(); public class ShiftClass public int valA; public int valB; public ShiftClass(int valA, int valB) this.valA = valA; this.valB = valB; public static ShiftClass operator (ShiftClass shift, int count) int a = shift.valA count; int b = shift.valB (ShiftClass shift, int count) int a = shift.valA count; int b = shift.valB count; return new ShiftClass(a, b); 8、增量和减量运算符、条件运算符(三元运算符)这个在第一节中也有提到过/aehyok/p/3499822.html9、命名空间别名限定符假如你实现了下面的代码,想打印一下:Console.WriteLine(Hello World);接下来再看,我们使用命名空间来进行访问:你会发现这两种方式都无法实现了。那么可以通过如下方式进行调用 static void Main() global:System.Console.WriteLine(Hello World); global 是 C# 2.0 中新

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论