《使用类的索引器与静态成员》由会员分享,可在线阅读,更多相关《使用类的索引器与静态成员(34页珍藏版)》请在金锄头文库上搜索。
1、院级精品课程院级精品课程面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计安徽机电职业技术学院信息工程系安徽机电职业技术学院信息工程系汪学文(汪学文(wxwOOP)2013年年10月月( (使用使用使用使用VS 2010VS 2010和和和和C#)C#)9 9 使用类的索引器与静态成员使用类的索引器与静态成员2第9课 使用类的索引器与静态成员l本课在第5课 创建并管理类和对象的基础上:定义类使用属性声明方法使用构造函数继续介绍类与对象的其它知识:索引器类的静态成员l并通过一个实例,来说明类的应用。39.1 索引器l介绍索引器之前,看下面这个Country类,它用以保存世界上各个国
2、家的人口数量: public class Country private string country = 中国中国, 美国美国, 法国法国, 日本日本, 韩国韩国, 印度印度 ; private double peoples = 1.306e+10, 2.5e+9, 6.09e+8, 1.274e+9, 4.829e+8, 1.027e+10 ; 如何将各个国家的人数以只如何将各个国家的人数以只读方式方式对外公开,以方外公开,以方便使用者便使用者访问?示例代码位于示例代码位于“Lesson9Indexer”49.1 索引器使用属性可以使用属性可以吗?public class Country
3、private string country = 中国中国, 美国美国, 法国法国, 日本日本, 韩国韩国, 印度印度 ; private double peoples = 1.306e+10, 2.5e+9, 6.09e+8, 1.274e+9, 4.829e+8, 1.027e+10 ; public double Peoples get return this.peoples; 示例代码位于示例代码位于“Lesson9Indexer”59.1 索引器l看起来可以:static void Main(string args) Country c = new Country(); Consol
4、e.WriteLine(中国人口数量中国人口数量:0,c.Peoples0);q但如果中间插上这么一句,也能运行:但如果中间插上这么一句,也能运行:static void Main(string args) Country c = new Country(); c.CountryPeoples0 = 1.458e+10; Console.WriteLin (中国的人口数量中国的人口数量:0, c.Peoples0);原因是因原因是因为数数组是引用是引用类型型示例代码位于示例代码位于“Lesson9Indexer”69.1 索引器l当类中包含数组或集合时,如果能够把类看成是一个数组,那么,会简化
5、对这些数组或集合的访问。索引器(Indexer)是一种属性,它允许以数组的方式来索引对象。l索引器是一种属性,因此它可以包含get访问器和set访问器。l索引器的属性名必须是this,形式如下:访问属性属性 返回返回值类型型 this类型型 索引名,索引名,类型型 索引名,索引名,get/ 获取数据取数据set/ 设置数据置数据这儿看起来就像是儿看起来就像是方法的参数方法的参数哟79.1 索引器public class Country private string country = 中国中国, 美国美国, 法国法国, 日本日本, 韩国韩国, 印度印度 ; private double peo
6、ples = 1.306e+10, 2.5e+9, 6.09e+8, 1.274e+9, 4.829e+8, 1.027e+10 ; public double thisint index get return this.peoplesindex; static void Main(string args) Country c = new Country(); Console.WriteLine(韩国的人口数量:韩国的人口数量:0 , c4);这时如果使用如果使用c0=1.458e+10;可可是要是要报错的的哟示例代码位于示例代码位于“Lesson9Indexer”89.1 索引器l上面的索引
7、器还不够好l因为我并不知道中国是在第0个位置呀,如果能用c中国来取中国的人口数量就更好了。public double thisstring index get int i = 0; foreach (string c in country ) if ( c = index ) break; i+; if (i=peoples.Length) return 0; else return peoplesi;static void Main(string args) Country c = new Country(); Output(中国的人口数量是中国的人口数量是: + c中国中国);示例代码位于
8、示例代码位于“Lesson9Indexer”99.1 索引器l索引器使用更加灵活:索引器同属性一样,可以分别有get访问器和set访问器。可以使用整数作下标,也可以使用字符串等其它类型作下标。也可以使用多个下标,比如访问二维数组的时候。返回值可以是数组中的值类型,也可以是与数组中值的类型不同的其它类型。注意:由于注意:由于属性属性或或索引器索引器是特殊的是特殊的方法方法,因此属性或索引器不能作,因此属性或索引器不能作为方法的方法的ref参数参数或或out参数参数109.2 实例:贷款分析l编写一个贷款分析程序,对于给定的贷款数量、年利率和贷款周期,计算月付款额,并显示一个分期偿还的时间表,即显
9、示在贷款期间内任何一年中任一月末贷款余额的表格。假设此贷款每月等额偿还。l计算月付款的公式为:l其中:p为贷款金额;r为月年率(年利率除以12),以0到1(100%)给出;n是还完贷款需要的时间(以月为单位)l计算下一月份的余额的公式为:余额=(1+r)*b-m其中:b为上月的余额(未偿还贷款的金额),m是每月的偿还金额。119.2 实例:贷款分析l需求分析:用户有哪些要求?签订贷款合同时,我选择好贷款额、贷款年限和贷款年利率使用构造函数,贷款额、贷款年限和贷款年利率 作为参数我可以方便地了解以下信息:l贷款额l贷款年数、贷款月数l贷款年利率、贷款月利率l月付款额l每月余额可以使用方法或属性来
10、实现。129.2 实例:贷款分析l设计分析类名起为Loan设计构造函数Loan( )l贷款额、贷款年限和贷款年利率 作为参数, 据此,也就可以计算出月付款额类的字段有哪些?l类的字段是为类设计者服务的,认为有以下字段就可以了。贷款额principal, 贷款月数months, 贷款月利率montlyInterestRate月付款额payment,存放每月余额的数组balance需要向使用者提供哪些信息?l贷款额Principal,贷款年数Years、贷款月数Months,贷款年利率AnnualInterestRate、贷款月利率MonthlyInterestRate,月付款额Payment,
11、每月余额 (通过索引器提供)l使用 方法 或 属性 来实现139.2 实例:贷款分析lLoan类149.2 实例:贷款分析lLoan类的内部字段示例代码位于示例代码位于“Lesson9Loan”159.2 实例:贷款分析lLoan类的构造函数 public Loan(decimal principal, double annualInterestRate, int years) / 如果所给初始化的参数不符合要求,抛出异常如果所给初始化的参数不符合要求,抛出异常 if (principal = 0.0M) | (annualInterestRate = 0.0) | (years 1e-6M)
12、 month+; balancemonth = balancemonth - 1 * (decimal)(1.0 + monthlyInterestRate); balancemonth -= payment; 示例代码位于示例代码位于“Lesson9Loan”199.2 实例:贷款分析Loan类类如果要想使使用者访问帐户余额方便,可以定义一个索引器如果要想使使用者访问帐户余额方便,可以定义一个索引器索引器:求某个月的贷款余额索引器:求某个月的贷款余额示例代码位于示例代码位于“Lesson9Loan”20 private void btnRun_Click(object sender, Rou
13、tedEventArgs e) Loan l = new Loan(10000M, 0.0655, 10); / 构造用以输出结果的字符串构造用以输出结果的字符串 string sOutput = String.Empty; sOutput += String.Format(本金:本金:0:Crn, l.Principal); sOutput += String.Format(还款月数:还款月数:0rn, l.Months); sOutput += String.Format(月利率:月利率:0:P4rn, l.MonthlyInterestRate); sOutput += String.F
14、ormat(月还款额:月还款额:0:Crn, l.Payment); for (int month = 0; month = l.Months; month+) sOutput += String.Format(第第0月月:1,-10:Crn, month, lmonth); tbOutput.Text = sOutput; 9.2 实例:贷款分析l使用Loan类,一个简单的测试示例代码位于示例代码位于“Lesson9Loan”21思考题:l应用Loan类来实现贷款计算器,要求实现类似于下面的界面。22Extended WPF Toolkit控件使用l从CodePlex下载Extended W
15、PF Toolkit控件库http:/ 使用类的静态成员l本节介绍类的静态成员。静态成员属于类,而不属于实例。通过使用静态构造函数可以初始化类。l学习完本节后,你将能够:使用类的静态成员使用静态构造函数初始化类249.3.1 如何使用类的静态成员l静态成员属于类在类的实例创建以前完成初始化被同一个类的所有实例共享public class Student public static string TypeName = 学生学生;.Console.WriteLine( 人员类型人员类型: 0, Student.TypeName );注意:是使用注意:是使用类名来引用的名来引用的示例代码位于示例代码
16、位于“Lesson9StaticStudent”259.3.1 如何使用类的静态成员l静态方法方法也可以是静态的,当对方法使用静态修饰符时,方法只能通过类而不能通过对象来访问。由于静态方法是类的一部分,所以调用它们时无需创建类的实例。在C#中,不能通过类的实例来访问静态方法。使用静态修饰声明的方法是全局方法。当静态声明某个方法时,无论这个方法所属的类被实例化多少次,静态方法只有一个。当成员引用或操作的信息是关于类而不是类的实例时,这个成员就应该设置为静态成员。例如,可以使用一个静态方法来统计类对象的数量,或者使用静态方法来维护有关类的对象的日志信息。具体示例见下页。269.3.1 如何使用类的
17、静态成员public class Student private static int count =0; / 统计学生人数统计学生人数 / 为简单起见,以下字段没有使用属性封装为简单起见,以下字段没有使用属性封装 public string ID; / 学号学号 public string Name; / 姓名姓名 public int Age; / 年龄年龄 public Student(string id, string name, int age) count+; / 每创建一个学生对象,计数器加每创建一个学生对象,计数器加1 this.ID = id; this.Name = nam
18、e; this.Age = age; public static int Count get return count; 静静态的字段的字段静静态的方法的方法(属性属性)注意:不能使注意:不能使用用this引用引用示例代码位于示例代码位于“Lesson9StaticStudent”27示例代码位于示例代码位于“Lesson9StaticStudent”9.3.1 如何使用类的静态成员 Student s1 = new Student(2005001, 张三张三, 21); Console.WriteLine(s1); Student s2 = new Student(2005002, 李四李四
19、, 20); Console.WriteLine (s2); Student s3 = new Student(2005003, 王五王五, 19); Console.WriteLine (s3); Console.WriteLine (学生对象总数是:学生对象总数是:0 , Student.Count);289.3.2 如何初始化类l静态构造函数 只会执行一次在第一个对象创建以前运行没有参数没有访问修饰符可与类的构造函数一起存在用来初始化类299.3.2 如何初始化类public class Student public static string TypeName; /学生的人员类型学生的
20、人员类型 private static int count =0; / 统计学生人数统计学生人数 static Student() TypeName = 学生学生; count = 0; 注意:静注意:静态构造函数没有用构造函数没有用public修修饰,也没有参数,也没有参数30.NET框架类库中的静态成员l.NET框架类库中许多类使用了静态成员(包括静态字段和属性等)Console类的WriteLine方法(也有许多静态属性,试试看)MessageBox类的Show方法Math类的许多数学运算函数,还有Math.PI和Math.EConvert类的若干转换函数使用使用“对象象浏览器器”,看看
21、,看看这些方法和属性的些方法和属性的说明明319.3.3 课堂练习 使用类的静态成员l在本练习中,通过为Antelope类添加一个静态成员,并且在类的构造函数中递增该静态成员来统计Antelope对象的数量。1.打开Visual Studio .NET,然后打开实验文件夹下的Lesson9StaticStatic.sln。2.复查任务列表3.为Antelope类增加一个公有静态int型变量nummberOfAntelopes。1.在“任务列表”窗口中,双击TODO1: 增加一个称为nummberOfAntelope的公有静态变量2.在类中添加以下代码:public static int num
22、berOfAntelopes;329.3.3 课堂练习 使用类的静态成员l在本练习中,通过为Antelope类添加一个静态成员,并且在类的构造函数中递增该静态成员来统计Antelope对象的数量(续)。4.在Antelope构造函数中增加成员变量numberOfAntelopes的值。1.找到任务TODO2:将numberOfAntelopes成员变量值加12.通过在构造函数中增加以下代码,使得在每次创建对象时,变量memberOfAntelopes加1:numberOfAntelopes+;5.显示antelope类被实例化的次数:1.找到任务TODO3:显示创建的antelope对象的数量
23、2.在Ouput方法中,把参数null替换成对静态变量numberOfAntelopes的引用,如:Output(羚羊的数量:+Antelope.numberOfAntelopes);6.测试代码(注意使用逐步运行)7.保存程序,然后退出Visual Studio .NET。339.4 回顾类和对象的基本概念,类的定义和类对象的实例化;类成员的访问属性:public和private;类属性的作用和实现;方法的重载;构造函数的作用和重载;析构函数;索引器的作用和实现类的静态成员掌握使用类来构造应用程序349.5 上机实验l完成实验9实验报告程 序 1: 完 成 “索 引 器 ”的 课 堂 示 例(Lesson9Country);程序2:“使用类的静态成员”的课堂练习(Lesson9Static);程 序 3: 使 用 贷 款 类 完 成 贷 款 计 算 器(Lesson9Loan);