C程序设计课件(资料全集)c6.ppt

上传人:sccc 文档编号:5373682 上传时间:2023-06-30 格式:PPT 页数:55 大小:329.01KB
返回 下载 相关 举报
C程序设计课件(资料全集)c6.ppt_第1页
第1页 / 共55页
C程序设计课件(资料全集)c6.ppt_第2页
第2页 / 共55页
C程序设计课件(资料全集)c6.ppt_第3页
第3页 / 共55页
C程序设计课件(资料全集)c6.ppt_第4页
第4页 / 共55页
C程序设计课件(资料全集)c6.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《C程序设计课件(资料全集)c6.ppt》由会员分享,可在线阅读,更多相关《C程序设计课件(资料全集)c6.ppt(55页珍藏版)》请在三一办公上搜索。

1、第六章 面向对象程序设计,C#.net程序设计,本章主要内容,对象、类和结构方法,方法的参数(值类型,引用类型,参数数组params)静态类与静态成员属性与索引器继承(多态性,new,Virtual和Override关键字),接口继承abstract抽象类和类成员和sealed密封类和类成员重载运算符使用Visual Studio类关系图可视化创建对象,对象、类和结构概述,对象、类和结构具有以下特点:新数据类型是使用类和结构定义的。对象是给定数据类型(类和结构)的实例。在执行应用程序时,数据类型为创建对象(或实例化)提供蓝图。C#应用程序始终包含至少一个类。结构可视为轻量类,是创建用于存储少量

2、数据的数据类型的理想选择,不能通过继承进行扩展的类型。类支持继承,这意味着它们可以从先前定义的类中派生。典型的 C#应用程序由自定义的类和.NET框架 的类组成。类是 C#中功能最为强大的数据类型。类定义了数据类型的数据和行为。,对象、类和结构,结构(struct),结构与类一样都具有表示其数据和行为的成员。这些成员包括:字段,属性,方法,事件,运算符,索引器,构造函数,析构函数和嵌套类型。结构与类共享几乎所有相同的语法,但结构比类受到的限制更多。结构有以下特点:结构是值类型,而类是引用类型。如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有

3、数据,对新副本所做的任何修改都不会改变旧副本的数据。尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。结构不能声明默认构造函数(没有参数的构造函数)或析构函数。与类不同,结构的实例化可以不使用 new 运算符。一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。结构可以实现接口。由于结构不使用引用,因此结构没有标识,具有相同数据的两个值类型实例是无法区分的。,对象、类和结构,对象,对象指的是一个实体的实例,在这个实体中包括了特定的属性数据和对这些数据进行操作的方法。对象具

4、有以下特点:C#中使用的全都是对象,包括 Windows 窗体和控件。对象是实例化的;也就是说,对象是从类和结构所定义的模板中创建的。对象使用属性获取和更改它们所包含的信息。对象通常具有允许它们执行操作的方法和事件。Visual Studio 提供了操作对象的工具:使用“属性”窗口可以更改对象(如 Windows 窗体)的属性。使用对象浏览器可以检查对象的内容。所有 C#对象都继承自object。,对象、类和结构,类声明,类是使用class关键字来定义的,类声明语句定义一个新类,其语法格式为:特征 修饰符 class 类名:基类名和任何实现接口的列表类体类的主要修饰符有以下几种之一。publi

5、c 表示不限制对该类的访问protected 表示只能从所在类和所在类派生的子类进行访问private只有其所在类才能访问abstract 抽象类不允许建立类的实例internal 只有在同一程序集(.exe 或.dll)的文件中的类型或成员才可访问的partial 表示将类的定义拆分到两个或多个源文件中默认情况下,在命名空间中或在编译单元顶部(例如,不在命名空间、类或结构中)声明的任何类型都是internal。下面是声明类Shape的代码:,对象、类和结构,abstract class Shape/抽象基类,不可实例化public const double pi=System.Math.PI

6、;/常量protected double x,y;/受保护,可继承变量public Shape()/默认构造函数x=y=0;public Shape(double x,double y)/带参数构造函数this.x=x;this.y=y;public abstract double Area();/抽象方法,需重载在该例中 abstract class Shape类定义使用了修饰符abstract,这表示该类是抽象基类,不可实例化。类的名称位于 class 关键字的后面,就是Shape。Shape类定义的其余部分是类的主体,用于定义行为和数据。类的字段、属性、方法和事件统称为“类成员”。,分部

7、类定义,可以将类、结构或接口的定义拆分到两个或多个源文件中。每个源文件包含类定义的一部分,编译应用程序时将把所有部分组合起来。拆分类定义,使用 partial 关键字修饰符,partial 修饰符只能出现在紧靠关键字 class、struct 或 interface 前面的位置。如下例所示。Visual Studio 在创建 Windows 窗体使用此分部定义方法,例如:下面在form1.cs和Form1.Designer.cs代码文件中使用分部定义共同定义类Form1。其中Form1.Designer.cs是窗体设计器自动生成的源代码,而form1.cs是手工编程代码的文件。public p

8、artial class Form1:Form/form1.cs 文件partial class Form1/Form1.Designer.cs,对象、类和结构,类继承定义,继承是类的重要特性。类可以从其他类中继承。在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。例如定义一个继承了Shape类的Ellipse类:class Ellipse:Shape public Ellipse(double x,double y):base(x,y)/使用基类Shape的构造函数 public override double Area()/函数重载 return pi*x*y;

9、使用继承定义的类称为用派生类,派生类的成员包括基类的所有非私有数据和行为以及派生类为自己定义的其他数据或行为。派生类将无法继承基类私有的成员。例如:派生类Ellipse继承基类Shape的公有的常量pi和受保护的字段x,y。,对象、类和结构,字段,类的字段存储类要满足其设计所需要的数据。声明字段时可以使用赋值运算符为字段指定一个初始值。字段恰好在创建对象实例调用构造函数之前初始化。字段初始值设定项不能引用其他实例字段。字段可标记为public、private、protected、internal。这些修饰符定义类的使用者访问字段的方式。可以选择将字段声明为static静态,这使得在没有创建实例

10、能调用静态字段。常数被声明为字段,声明时在字段的类型前面使用const关键字。常数必须在声明时初始化。例如:public const double pi=System.Math.PI;只读字段将字段声明为readonly。只读字段只能在初始化期间或在构造函数中赋值。为了简单起见,下面示例使用public字段,这样可以直接获取或设置字段值,但是不建议这样做。字段通常应为private。外部类应当通过方法、属性或索引器来间接访问字段。例如:,对象、类和结构,字段,public class Point public double x,y;/声明字段 public double z=0;/声明字段具有

11、初始值。public readonly string name=Point;/声明具有初始值只读字段。public Point(double x,double y)/构造函数用于初始化字段。this.x=x;this.y=y;name=string.Format(0(1,2,3),name,x,y,z);public Point():this(0,0)/调用其他构造函数,对象、类和结构,构造函数,构造函数是在创建给定类型的对象时执行的类的方法。构造函数具有与类或结构相同的名称,它通常用于初始化新对象的数据成员。只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。在

12、上面的示例中,定义了一个具有一个简单的构造函数名为Point的类。类定义对象的类型,但它不是对象本身。对象是基于类的具体实体,有时称为类的实例。通过使用 new 关键字,后跟类的构造函数,可以创建对象,在为新对象分配内存之后,new 运算符立即调用构造函数。下面的TestPoint类Main()中使用 new 运算符创建对象来实例化Point类:class TestPoint static void Main()Point p=new Point(1.0,3.0);/创建Point对象实例p p.z=1;/Point对象实例p的z字段赋值 Console.WriteLine(x,y,z)=0,

13、1,2,3,p.x,p.y,p.z,p.name);,对象、类和结构,构造函数,不带参数的构造函数称为“默认构造函数”。当类没有构造函数,系统自动生成一个构造函数,并且将用默认值来初始化对象字段,有关默认值参见表2.1。构造函数可以使用 this 关键字调用同一类中的另一构造函数。如public Point():this(0,0)/调用其他构造函数基类的构造函数将在其派生类构造函数调用前调用,使用:base(x,y)表示调用基类的构造函数。在前面示例中,抽象基类Shape的构造函数在执行派生类Ellipse构造函数块之前被调用,使用:base(x,y)表示调用基类Shape的构造函数。publ

14、ic Ellipse(double x,double y):base(x,y)/使用基类Shape的构造函数在派生类中,如果不使用base关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。这意味着下面的构造函数隐式调用基类Shape默认构造函数:public Ellipse(double x,double y)/隐式调用基类Shape的构造函数:base()如果基类没有提供默认构造函数,派生类必须使用 base 显式调用基构造函数。如没有默认构造函数,前面不使用base 关键字的派生类构造函数将无法编译。,对象、类和结构,析构函数,在类的实例超出范围时,类的实例将会自动执行

15、析构函数。例如:Shape()/析构函数,对象销毁时的清除语句.Console.WriteLine(调用Shape析构函数(0,1),x,y);Ellipse()/析构函数 Console.WriteLine(调用Ellipse析构函数(0,1,Area2:f),x,y,Area();析构函数特点:一个类只能有一个析构函数。无法继承或重载析构函数。无法调用析构函数。它们是被自动调用的。析构函数既没有修饰符,也没有参数。可以通过调用GC.Collect()强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。调用对象结束将按照从派生程度最大的到派生程度最小的次序调用析构函数。,对

16、象、类和结构,方法声明,方法是包含一系列语句的代码块,是类或结构中用于执行计算或其它行为的成员。在 C#中,每个执行指令都是在方法中完成的。方法在类或结构中声明,声明时需要指定访问级别、返回值、方法名称以及任何方法参数。方法参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。方法的声明格式:特征 修饰符 方法名称(形式化参数表)方法体 方法的修饰符可以是(public,protected,internal,private,static,abstract,virtual,override等)及其组合。例如下面例子的Area方法:Shape类:public abstract double Ar

17、ea();/抽象方法,需要在派生类重载该方法Ellipse类:public override double Area()/派生类重载基类抽象,方法,方法的参数,C#中方法的参数有以下两种类型:值传递类型参数:不含任何修饰符。如:void SquareIt(int x)引用传递类型参数:以ref 或out 修饰符声明。如:void SquareIt(ref int x)方法值传递类型参数意味着向方法传递变量的一个副本。方法内发生的参数更改对该变量中存储的原始数据无任何影响。而引用传递类型参数意味所调用的方法可更改参数的原始数据值。向方法传递结构和类引用之间的区别:向方法传递结构时,传递的是该结构

18、的副本,而在传递类实例时,传递的是一个引用。传递类型参数修饰符out与ref 的区别在于:传递到 ref的参数必须先初始化。而out 的参数在传递之前不需要显式初始化。值传递有以下两种类型:值传递值类型,如:void SquareIt(int x)参数int x 是值类型。值传递引用类型,如:void Change(int pArray)数组pArray 为引用类型。引用传递有以下两种类型:引用传递值类型,如:void SquareIt(ref int x)引用传递引用类型,如:void Change(ref int pArray),方法,值传递值类型参数示例(ParamSample项目代码)

19、:class PassingValByVal static void SquareIt(int x)x*=x;System.Console.WriteLine(SquareIt方法内的n值:0,x);static void Main()int n=5;System.Console.WriteLine(调用SquareIt方法前的n值:0,n);SquareIt(n);/通过值来传递值 System.Console.WriteLine(调用SquareIt方法后的n值:0,n);该程序运行输出:调用SquareIt方法前的n值:5 SquareIt方法内的n值:25 调用SquareIt方法后的

20、n值:5 在这例子里,变量 n 为值类型,包含数据(值为 5)。当调用 SquareIt 时,n 的内容被复制到参数 x 中,在方法内将该参数求平方。但在 Main 中,n 的值在调用 SquareIt 方法前后是相同的。实际上,方法内发生的更改只影响局部变量 x。,值传递引用类型例子:class PassingRefByVal static void Change(int pArray)pArray0=888;/将pArray的第一个元素赋值为888,改变arr0 pArray=new int5-3,-1,-2,-3,-4;/引用新的数组,不改变arr System.Console.Writ

21、eLine(方法内的数组第一元素:0,pArray0);static void Main()int arr=1,4,5;System.Console.WriteLine(调用方法前的数组第一元素:0,arr0);Change(arr);System.Console.WriteLine(调用方法后的数组第一元素:0,arr0);在上个示例中,数组 arr 为引用类型,在未使用 ref 参数的情况下传递给方法。在此情况下,将向Change方法传递指向 arr 的引用的一个副本。Change方法有可能更改数组元素的内容,输出显示arr0 从 1 改为 888。但是,在 Change 方法内使用 ne

22、w 运算符来分配新的内存部分,将使变量 pArray 引用新的数组。因此,这之后的任何更改都不会影响原始数组 arr(它是在 Main 内创建的)。,该程序运行输出:调用方法前的数组第一元素:1方法内的数组第一元素:-3调用方法后的数组第一元素:888,引用传递值类型示例 class PassingValByRef/参数X的值通过关键字ref来传递,改变x的值,将会改变输入的x的值 static void SquareIt(ref int x)x*=x;System.Console.WriteLine(SquareIt方法内的n值:0,x);static void Main()int n=5;

23、System.Console.WriteLine(调用SquareIt方法前的n值:0,n);SquareIt(ref n);/通过ref关键字来传递变量引用.System.Console.WriteLine(调用SquareIt方法后的n值:0,n);该程序运行输出:调用SquareIt方法前的n值:5 SquareIt方法内的n值:25 调用SquareIt方法后的n值:25 本示例中,传递的不是 n 的值,而是对 n 的引用。参数 x 不是 int 类型,它是对 int 的引用(本例中为对 n 的引用)。因此,当在方法内对 x 求平方时,实际被求平方的是 x 所引用的项:n。,引用传递引

24、用类型示例:class PassingRefByRef static void Change(ref int pArray)/下面两个数组赋值都将改变原始的元素 pArray0=888;/将pArray的第一个元素赋值为 pArray=new int5-3,-1,-2,-3,-4;/pArray 引用新的数组 System.Console.WriteLine(Change方法内的数组第一元素:0,pArray0);static void Main()int arr=1,4,5;System.Console.WriteLine(调用Change方法前的数组第一元素:0,arr0);Change(

25、ref arr);/通过ref关键字来传递数组引用 System.Console.WriteLine(调用Change方法后的数组第一元素:0,arr0);该程序运行输出:调用Change方法前的数组第一元素:1Change方法内的数组第一元素:-3调用Change方法后的数组第一元素:-3本示例中Change方法内发生的所有更改都影响 Main 中的原始数组。实际上,使用 new 运算符对原始数组进行了重新分配。因此,调用 Change 方法后,对 arr 的任何引用都将指向 Change 方法中创建的五个元素的数组。,参数数组params当方法的参数数量不确定时,可以考虑使用参数数组par

26、ams作为方法参数,如:void UseParams(params int list);在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。项目params1的代码如下:public class MyClass public static void UseParams(params int list)for(int i=0;i list.Length;i+)Console.WriteLine(listi);public static void UseParams2(params object list)for(int i=0;i lis

27、t.Length;i+)Console.WriteLine(listi);static void Main()UseParams(1,2);/可以使用不同数目的整数作为参数 UseParams2(1,a,test);/可以使用不同数目的任何类型值作为参数 int myarray=new int3 10,11,12;UseParams(myarray);/可以使用数组作为参数,类的静态成员和静态类,静态类和类成员用于创建无需创建类的实例就能够访问的数据和方法。静态类成员可用于独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。静态类成员是一种特殊的成员,它不属于类

28、的某一个具体的实例。当类只有静态成员时就可以使用静态类。类的静态成员在成员的返回类型之前使用 static 关键字来声明静态类成员。即使没有创建类的实例,也可以调用该类中的静态方法、字段、属性或事件。如果创建了该类的任何实例,不能使用实例来访问静态成员。静态成员通常用于表示不会随对象状态而变化的数据或计算。非静态方法可以访问类中的静态或非静态成员,而静态方法只能访问类中的静态成员。静态类:当类中没有依赖类的特定对象的数据或行为时,即仅包含静态成员,就可以使用。静态类声明为static,以指示它仅包含静态成员的静态类。不能使用 new 关键字创建静态类的实例。,静态成员和静态类,类静态成员例子,

29、class classA int x;static int y;static public void F()/x=1;错误不允许访问 y=2;/正确允许访问 class TestA static void Main()classA aClass=new classA();/创建类A的实例aObject/aClass.F();/错误,不能使用类A的实例aObject来访问静态成员 classA.F();/正确,使用类来访问静态成员,静态成员和静态类,静态类例子,public static class TemperatureConverter/静态类/静态方法 public static doub

30、le CelsiusToFahrenheit(string temperatureCelsius)/将string型的temperatureCelsius转化成double型 double celsius=System.Double.Parse(temperatureCelsius);/将计算结果也转换成double型 double fahrenheit=(celsius*9/5)+32;return fahrenheit;class TestTemperatureConverter static void Main()/调用静态类的静态方法 double F=TemperatureConve

31、rter.CelsiusToFahrenheit(38.9);,静态成员和静态类,继承多态性,通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C#中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object类型,因为任何类型都自动将 Object 当作基类型。多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。当派生类从基类继承时,它会获得基类的所有非私有的方法、字段、属性和事件。若要更改基类的数据和行为,有两种选择:可以使用新的派生成员替换基成员,或者可

32、以重写虚拟的基成员。,继承,使用new关键字,派生类可以包含与基类方法名称相同的数据和方法成员。使用新的派生成员替换基类的成员需要使用 new 关键字。如果基类定义了一个方法、字段或属性,则new关键字用于在派生类中创建该方法、字段或属性的新定义。new 关键字放置在要替换的类成员的返回类型之前。例如:public class BaseClass public void DoWork()Console.WriteLine(Base DoWork);public int WorkField;public int WorkProperty get return 0;public class Der

33、ivedClass:BaseClass public new void DoWork()Console.WriteLine(Derive DoWork);public new int WorkField;public new int WorkProperty get return 1;,继承,使用new关键字,使用new关键字时,调用的是新的类成员而不是已被替换的基类成员。这些基类成员称为隐藏成员。如果将派生类的实例强制转换为基类的实例,就仍然调用隐藏类成员。例如:public class test static void Main()DerivedClass B=new DerivedCla

34、ss();B.WorkField=2;B.DoWork();/调用DerivedClass方法DoWork().显示“Derive DoWork”Console.WriteLine(B.WorkField=0,B.WorkField);/显示“B.WorkField=2”BaseClass A=(BaseClass)B;/A.WorkField未赋值,为int的默认值 A.DoWork();/调用BaseClass的方法DoWork().显示“Base DoWork”Console.WriteLine(A.WorkField=0,A.WorkField);/显示“A.WorkField=0”,

35、继承,使用virtual和override关键字,为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加 virtual 关键字来实现的。字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的。然后,派生类可以选择使用 override 关键字而不是 new,将基类实现替换为它自己的实现。当派生类重写某个虚拟成员时,即使该派生类的实例被当作基类的实例访问,也会调用派生类的成员,而在派生类可以使用 base 关键字访问基类的成员,例如:public class BaseClass public virtual void DoWork()

36、Console.WriteLine(Base DoWork);public virtual int WorkProperty get return 0;,继承,public class DerivedClass:BaseClass public override void DoWork()base.DoWork();/调用BaseClass方法DoWork()显示Base DoWork Console.WriteLine(Derive DoWork);public override int WorkProperty get return 1;public class test static v

37、oid Main()DerivedClass B=new DerivedClass();/调用重写方法DoWork().显示Base DoWork和“Derive DoWork”B.DoWork();/显示B.WorkProperty=1”Console.WriteLine(B.WorkProperty=0,B.WorkProperty);BaseClass A=(BaseClass)B;A.DoWork();/调用重写方法DoWork().显示“Derive DoWork”/显示B.WorkProperty=1”Console.WriteLine(A.WorkProperty=0,A.Wor

38、kProperty);,abstract抽象类,使用 abstract 关键字可以创建仅用于继承用途的类和类成员。将类声明为抽象类的方法是在类定义中将关键字 abstract 置于关键字 class 的前面。例如:abstract class Shape;抽象类不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义。在抽象类中可以定义抽象方法。方法是将关键字 abstract 添加到方法的返回类型的前面。例如:public abstract double Area();抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。,继承,sealed

39、密封类和类成员,可以将类声明为sealed密封类。密封类主要用于防止派生。声明方法是在类定义中将关键字 sealed 置于关键字 class 的前面。例如:public sealed class sClass 类定义体。密封类不能用作基类。因此,它也不能是抽象类。在对基类的虚成员进行重写的派生类上的类成员(包括方法、字段、属性或事件)可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。例如:public class sClass:bClass public sealed override vo

40、id DoWork()下面abstractShape项目的代码演示 Shape 的多个子类,并演示它们如何重写 Area 属性来提供自己的实现。然后创建若干 Shape 派生对象,并输出它们的面积。,继承,public abstract class Shape private string m_id;public Shape(string s)Id=s;public string Id/属性Id get return m_id;set m_id=value;public abstract double Area get;/抽象只读属性Area public override string To

41、String()return Id+Area=+string.Format(0:F2,Area);public class Square:Shape private int m_side;/正方形边长 public Square(int side,string id):base(id)m_side=side;public override double Area get return m_side*m_side;/正方形面积边长边长,public class Rectangle:Shape private int m_width;private int m_height;public Rect

42、angle(int width,int height,string id):base(id)m_width=width;m_height=height;public override double Area getreturn m_width*m_height;/长方形面积class TestClass static void Main()Shape shapes=new Square(5,Square#1),new Rectangle(4,5,Rectangle#1);foreach(Shape s in shapes)/下句相当于System.Console.WriteLine(s.ToS

43、tring();System.Console.WriteLine(s);,接口继承,接口具有下列属性:接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。不能直接实例化接口。接口可以包含事件、索引器、方法和属性。接口不包含方法的实现。类和结构可从多个接口继承。接口自身可从多个接口继承。,继承,重载运算符,用户定义的类型可以通过使用 operator 关键字定义静态成员函数来重载运算符。下表列出了可重载的运算符:下面定义一个DBBool结构,主要运用了以下的转换运算符定义和重载运算符:使用implicit隐式转换运算符定义了从bool到DBBool的隐式转换。使用explici

44、t显式转换运算符定义了从DBBool到bool的强制转换.定义重载运算符=、!=、!、&、|、true、false、Equals等。dbBool项目的代码如下:,继承,public struct DBBool/三个可能的 DBBool 值:public static readonly DBBool dbNull=new DBBool(0);public static readonly DBBool dbFalse=new DBBool(-1);public static readonly DBBool dbTrue=new DBBool(1);int value;/为 dbFalse、dbNu

45、ll、dbTrue 存储-1、0、1 的私有字段:DBBool(int value)/私有构造函数。值参数必须为-1、0 或 1:this.value=value;/从bool到DBBool的隐式转换。将true映射为DBBool.dbTrue,/将false映射BBool.dbFalse public static implicit operator DBBool(bool x)return x?dbTrue:dbFalse;/从 DBBool 到 bool 的显式转换。如果/给定的 DBBool 为 dbNull,则引发异常;否则返回 true 或 false:public static

46、explicit operator bool(DBBool x)if(x.value=0)throw new InvalidOperationException();return x.value 0;public static DBBool operator=(DBBool x,DBBool y)if(x.value=0|y.value=0)return dbNull;return x.value=y.value?dbTrue:dbFalse;,/不等运算符。如果任何一个操作数为/dbNull,则返回 dbNull;否则返回 dbTrue 或 dbFalse:public static DBB

47、ool operator!=(DBBool x,DBBool y)if(x.value=0|y.value=0)return dbNull;return x.value!=y.value?dbTrue:dbFalse;/逻辑 AND 运算符。如果任何一个操作数为dbFalse,则返回 dbFalse;/如果任何一个操作数为 dbNull,则返回 dbNull;否则,返回 dbTrue:public static DBBool operator,public override bool Equals(object o)/重写Object.Equals(object o)方法 return(boo

48、l)(this=(DBBool)o);/重写 ToString 方法以便将 DBBool 转换为 string:public override string ToString()return(string)this;class Test static void Main()DBBool a,b,c,d;a=DBBool.dbTrue;b=DBBool.dbNull;c=false;/从 bool 到 DBBool 的隐式转换 bool blnA=(bool)a;/从 DBBool 到 bool 的显式转换 d=(a=b);/相等运算符=Console.WriteLine(!0=1,a,!a);

49、Console.WriteLine(string)a=0,(string)a);Console.WriteLine(0,属性的定义,属性是这样的成员:它们提供灵活的机制来读取、编写或计算类或结构的私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称为“访问器”的特殊方法。这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性。属性的定义形式为:特征 修饰符 属性名属性访问器。其中属性访问器有两种:get访问器和set访问器。例如:public string Name/名字属性 get return name;set name=value;get访问器是一个不带参数的方法,它

50、用于向外部返回属性成员的值。它的基本格式为:修饰符 get访问体。get访问器必须以一条return语句结束,或者是一条异常抛出语句throw。set访问器是一个带有单个参数并且返回类型为void类型的方法,它用于处理类外部的写入值,其中参数类型就是属性的类型。它的基本格式为:修饰符 set访问体。set访问器带有一个特殊的关键字value。用以传递属性赋值的内容。,属性与索引器,使用属性,属性结合了字段和方法的多个方面,以字段形式出现,用方法来实现。对于对象的使用者,属性显示为字段,访问属性与字段需要完全相同的语法。一个属性不一定需要既具备get访问器,又具备set访问器。不具有 set 访

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号