1、C# 基础知识,2,C# 数据类型,3,变量 2-2,static void Main(string args)/ 声明布尔型、字符串型、整型、短整型和浮点型变量 bool test = true;short num1 = 19;int num2 = 14000;string val = “Jamie“;float num3 = 14.5f;/ 显示变量值 Console.WriteLine (“布尔值 = “ + test);Console.WriteLine (“短整型值 = “ + num1);Console.WriteLine (“整型值 = “ + num2);Console.Wri
2、teLine (“字符串值 = “ + val);Console.WriteLine (“浮点值 = “ + num3);,变量中存储的值取决于该变量的类型,4,常量 2-2,static void Main(string args) / PI常量PIconst float _pi = 3.14F;/ 由地球引力引起的加速度常量,单位为 cm/s*s const float _gravity = 980;/ 钟摆的长度 int length = 40;/ 钟摆的周期 double period = 0;/ 钟摆周期的计算公式 period = 2 * _pi * Math.Sqrt(lengt
3、h / _gravity);Console.WriteLine (“钟摆的周期为 0 秒“, period); ,声明常量,在表达式中使用常量,const 关键字用于声明常量,5,C# 的基本数据类型 3-1,C# 中的数据类型分为两个基本类别 值类型 表示实际数据 只是将值存放在内存中 值类型都存储在堆栈中 int、char、结构 引用类型 表示指向数据的指针或引用 包含内存堆中对象的地址 为 null,则表示未引用任何对象 类、接口、数组、字符串,6,C# 的基本数据类型 3-2,static void Main(string args) / 声明一个值类型的整型数据类型int val =
4、 100;Console.WriteLine(“该变量的初始值为 0“, val); Test(val);/ 由于该数据类型属于值类型,所以将恢复其初始值 Console.WriteLine(“该变量的值此时为 0“, val); static void Test(int getVal) int temp = 10;getVal = temp * 20; ,将 val 的初始值传递给 Test() 方法,被传递的 val 在 Test() 方法内被改变,不反映已经改变的 val 值,而保留原始值,7,C# 的基本数据类型 3-3,static void Main(string args) Da
5、taTypeTest objTest = new DataTypeTest();objTest.Val = 100;/ 传递属于引用类型的对象Test(objTest);/ 由于该数据类型属于引用类型,所以会考虑新处理的值 Console.WriteLine(“变量的值为 0“, objTest.Val); static void Test(DataTypeTest dataTest) int temp = 10;dataTest.Val = temp * 20; ,将 DataTypeTest 的引用传递给 Test(),被传递的 val 在 Test() 中改变,不反映已经改变的 val
6、值,而保留原始值,class DataTypeTest public int Val; ,8,装箱和拆箱 2-1,装箱是将值类型转换为引用类型 拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与 Object 类型的值相互转换,将值类型与引用类型链接起来,9,装箱和拆箱 2-2,int val = 100; object obj = (object)val; Console.WriteLine (“对象的值 = 0“, obj);,int val = 100; object obj = val; int num = (int) obj; Console.WriteLi
7、ne (“num: 0“, num);,值类型,引用类型,拆箱,装箱,值类型,引用类型,值类型,被装过箱的对象才能被拆箱,10,算术运算符,static void Main(string args) / x2 的系数int coefficient1 = 2;/ x 的系数int coefficient2 = -7;/ 二次方程的常数值 int constant = 3;/ 存放表达式 b2 - 4ac 的值 double expression = 0;double x1 = 0;double x2 = 0;Console.WriteLine(“二次方程为: 0x2 + 1x + 2“, coe
8、fficient1, coefficient2, constant);expression = Math.Sqrt(coefficient2 * coefficient2 - (4 * coefficient1 * constant);x1 = (-coefficient2) + expression) / (2 * coefficient1);x2 = (-coefficient2) - expression) / (2 * coefficient1);Console.Write(“x = 0:F2 “, x1);Console.Write(“ 或 “);Console.WriteLine(
9、“x = 0:F2“, x2); ,将值赋给变量,在表达式中使用的算术运算符,11,foreach 循环,计算总分,计算分数,对班上的每一个学生,教 室,12,foreach 循环 2-1,foreach 循环用于遍历整个集合或数组 语法:foreach (数据类型 元素(变量) in 集合或者数组)/语句,13,foreach 循环,static void Main(string args) / 存放字母的个数 int countLetters = 0;/ 存放数字的个数int countDigits = 0;/ 存放标点符号的个数int countPunctuations = 0;/ 用户
10、提供的输入 string input;Console.WriteLine(“请输入一个字符串 “);input = Console.ReadLine();/ 声明 foreach 循环以遍历输入的字符串中的每个字符。 foreach(char chr in input)/ 检查字母if(char.IsLetter(chr)countLetters+;/ 检查数字if(char.IsDigit(chr)countDigits+;/ 检查标点符号if(char.IsPunctuation(chr)countPunctuations+;Console.WriteLine(“字母的个数为: 0“, c
11、ountLetters);Console.WriteLine(“数字的个数为: 0“, countDigits);Console.WriteLine(“标点符号的个数为: 0“, countPunctuations); ,为所有计数器设置初始值,接受输入,对输入的每一个 字符都进行循环,使用了所有输入的字符 之后,循环自动终止,14,数组 3-1,数组是同一数据类型的一组值 数组属于引用类型,因此存储在堆内存中 数组元素初始化或给数组元素赋值都可以在声明数组时或在程序的后面阶段中进行语法:数据类型元素个数 数组名称;int6 arrayHere;,15,数组 3-3,static void M
12、ain(string args) int count;Console.WriteLine(“请输入您要登记的学生人数 “);count=int.Parse(Console.ReadLine();/ 声明一个存放姓名的字符串数组,其长度等于提供的学生人数 string names = new stringcount;/ 用一个 for 循环来接受姓名 for(int i=0; icount; i+)Console.WriteLine(“请输入学生 0 的姓名 “,i+1);namesi=Console.ReadLine();Console.WriteLine(“已登记的学生如下: “);/ 用
13、foreach 循环显示姓名 foreach(string disp in names)Console.WriteLine(“0“, disp); ,数组声明,初始化数组元素的循环,显示输出的循环,16,二维数组 int , 交错数组 int ,17,struct structEx public int structDataMember;public void structMethod1()/structMethod1 实现 ,自定义数据类型 可以在其内部定义方法 无法实现继承 属于值类型主要结构:,struct student public int stud_id;public string
14、 stud_name;public float stud_marks;public void show_details()/显示学生详细信息,结构体,数据成员,方法,所有与 Student 关联的详细信息都可以作为一个整体进行存储和访问,18,枚举,public class Holiday public enum WeekDaysMonday,Tuesday,Wednesday,Thursday,Fridaypublic void GetWeekDays (String EmpName, WeekDays DayOff)/处理工作日static void Main()Holiday myHol
15、iday = new Holiday();myHoliday.GetWeekDays (“Richie“, Holiday.WeekDays.Wednesday); ,枚举(Enum,Enumerator 的缩写)是一组已命名的数值常量 用于定义具有一组特定值的数据类型 枚举以 enum 关键字声明,Wednesday = 2,19,枚举(续),C# 中的枚举包含与值关联的数字 默认情况下,将 0 值赋给枚举的第一个元素,然后对每个后续的枚举元素按 1 递增 在初始化过程中可重写默认值,public enum WeekDays Monday=1,Tuesday=2,Wednesday=3,Th
16、ursday=4,Friday=5 ,在 C# 中实现 OOP 概念,21,类与对象,类是 C# 中的一种结构,用于在程序中模拟现实生活的事物,类是对象的模板;对象是类的实例化。,语法:,访问修饰符 class ,/ 类的主体 ,示例: class Employee / 类的主体 ,/ 成员变量 / 成员方法,22,语法:,成员变量,访问修饰符,数据类型,成员变量;,private,protected,internal,public,_name,status,.,userName,int,char,.,bool,class Employeeprivate string _name;privat
17、e char _gender;private string _qualification;private uint _salary; ,访问成员变量,步骤 1:创建一个类的对象,Employee objEmployee = new Employee();,步骤 2:使用点号访问成员变量,objEmployee._name = “张三“; objEmployee._name = M;,23,访问修饰符 2-1,Teacher 类,private 成员,protected 成员,public 成员,internal 成员,Student 类,只有 Student 类在 Teacher 类都在同一程
18、序集中,才可访问internal成员,不可访问,不可访问,可以访问,24,访问修饰符 2-2,25,构造函数 2-1,构造函数是类的一种特殊方法,每次创建类的实例都会调用它,访问修饰符,(),/ 构造函数的主体 ,语法:, / 默认构造函数 Employee() _qualification = “研究生“; ,示例:,26,演示:示例 1,构造函数 2-2,class Employee ,private string _name;private char _gender;private string _qualification;private uint _salary;,/ 默认构造函数p
19、ublic Employee()_qualification = “研究生“;,static void Main(string args) / 调用默认构造函数Employee objEmployee = new Employee();Console.WriteLine(“资格= “ + objEmployee._qualification);Console.WriteLine(“薪水= “ + objEmployee._salary); ,27,参数化构造函数 2-1,访问修饰符, (),/ 构造函数的主体 ,语法:,(参数列表), / 参数化构造函数 Employee(string str
20、Qualification) _qualification = strQualification; ,示例:,28,参数化构造函数 2-2,/ 默认构造函数 private Employee() _qualification = “研究生“; ,/ 参数化构造函数 private Employee(string strQualification, string strName, char gender, uint empSalary) _qualification = strQualification;_name = strName;_gender = gender;_salary = emp
21、Salary; ,public static void Main(string args) / 调用默认构造函数Employee objGraduate = new Employee();/ 调用参数化构造函数Employee objMBA = new Employee(“ACCPS3“, ”张亮影“, 男, 5500); Console.WriteLine(“默认构造函数输出:n资格=“ + objGraduate._qualification);Console.WriteLine(“n参数化构造函数输出:n资格= “ +objMBA._qualification); ,29,方法,对象的行
22、为,接听,响铃,挂断,PickUp() . /用于传送和接收信号的代码,Ring() . /用于显示主叫号码的代码,Hang() . /用于结束会话的代码,30,声明方法 2-1,语法,访问修饰符(可选),默认情况下为 private,访问修饰符 返回类型 (参数列表)/ 方法主体,如果不需要返回任何值,方法可能返回 void 数据类型,31,声明方法 2-2, class Point int x;int y;void Assign()System.Console.WriteLine(“输入点的值“);x = int.Parse(System.Console.ReadLine();y = in
23、t.Parse(System.Console.ReadLine(); ,方法 Assign() 的定义,不返回任何值 (void)不接收任何值 (Assign(),Assign( ) 方法,32,当调用方法时,传递参数的个数、数据类型、顺序必须与方法签名一致。 方法名+方法的参数列表合称为方法签名(如上例),参数传递,值传递:方法会接收变量的一个值拷贝,然后方法使用这个值拷贝执行操。 引用传递:当变量通过引用来传递时,方法接收到的是对实际变量数值的引用。在方法中对值的改变将会影响到原来的变量。 (1)ref关键字: (2)明确赋值:所有参数变量在传递给方法前必须初始化。 (3)使用out关键字
24、:避免多余初始化。,33,演示:示例 3,调用方法 3-2,private void Accept()Console.WriteLine(“请输入实数部分“);_real = int.Parse(Console.ReadLine();Console.WriteLine(“请输入虚数部分“);_imaginary = int.Parse(Console.ReadLine();void ShowResult()Console.WriteLine(“相加之和为:“);Console.WriteLine(_real + “+“ + _imaginary + “i“);/ 此方法用于将两个复数相加Com
25、plexNumber Add(ComplexNumber objParam1)objParam1._real += _real ;objParam1._imaginary += _imaginary;return objParam1;,接收实部和虚部的值,显示实部和虚部的值,请参阅对象的实例变量,objParam1 与 objNumber2 相关联,STAThread public static void Main(string args) ComplexNumber objNumber1 = new ComplexNumber();ComplexNumber objNumber2 = new
26、 ComplexNumber();objNumber1.Accept();objNumber2.Accept();ComplexNumber objTemp = objNumber1.Add(objNumber2);objTemp.ShowResult(); ,34,方法重载 4-1,固定电话,电,移动电话,帐单,管理层,供应商 1,供应商 2,电信,电,电话,电,对不同的数据执行相同的任务,35,方法重载 4-2, Class BillPayment void PayBill(int telephoneNumber)/此方法用于支付固定电话话费void PayBill(long consum
27、erNumber)/此方法用于支付电费void PayBill(long consumerNumber, double amount)/此方法用于支付移动电话话费 ,对不同数据执行相似的功能,36,方法重载4-3,int greatest(int num1, int num2) Console.WriteLine(“0 和 1 相比, 最大的是: “, num1, num2);if(num1 num2)return num1;elsereturn num2; int greatest(int num1, int num2, int num3) Console.WriteLine(“0, 1 和
28、 2 相比, 最大的是: “, num1, num2, num3);if(num1 num2 ,具有不同数量的参数的方法重载,37,方法重载 4-4,int greatest(int numbers) int temp = numbers0;for(int i = 1;i numbers.Length;i+)if(temp numbersi)temp = numbersi;return temp; double greatest(double numbers) double temp = numbers0;for(int i = 1;i numbers.Length;i+)if(temp nu
29、mbersi)temp = numbersi;return temp; ,具有不同类型的参数的方法重载,38,命名空间,namespace 命名空间的名称 / 该名称空间的所有类都放在这里。 ,语法,39,命名空间,namespace Samsung class Monitorpublic void ListModels() Console.WriteLine(“供应以下型号的显示器:“);Console.WriteLine(“14“, 15“ n“);STAThreadstatic void Main(string args)/ TODO: 在此处添加代码以启动应用程序/ ,40,命名空间
30、6-6,namespace Sony public class Monitorpublic void ListModelStocks() Console.WriteLine(“以下是 Sony 显示器的规格及其库存量:“); Console.WriteLine(“14“=1000, 15“=2000, 17“=3000“);static void Main(string args)Samsung.Monitor objSamsung = new Samsung.Monitor();Monitor objSony = new Monitor();objSamsung.ListModels();o
31、bjSony.ListModelStocks(); ,C# 中的继承,42,继承 2-1,Class Base / 成员变量int basevar;/ 成员函数Base_fun1()/ 定义 .,Class Derived : Base / 成员变量int derivedvars;/ 成员函数Derived_fun1()/ 定义.,基类,void main() Derived dr_obj = new Derived() ;dr_obj.Base_fun1(); ,无需重新编写代码,派生类,43,狗,马,继承 2-2,动物,基类,派生类,继承的层次结构示例,Class Animal / 成员变
32、量int eyes, nose;Animal() eyes = 2;nose = 1; Pet_Animal()/ 定义 ,基类,Class Dog : Animal / 成员变量/ 成员函数private Barking()/ 定义private Wagging_Tail() ,派生类,44,继承 C# 中的类,public class Graduate: Student, Employee / 成员变量/ 成员函数 ,多重继承,允许多重接口实现,45,演示,public class Student:Person private string _school;private uint _en
33、g;private uint _math;private uint _sci;public void GetMarks()Console.WriteLine(“请输入学校名称“);_school = Console.ReadLine();Console.WriteLine(“请分别输入英语、数学和自然科学的分数。“); _eng = uint.Parse(Console.ReadLine();_math = uint.Parse(Console.ReadLine();_sci = uint.Parse(Console.ReadLine();Console.WriteLine(“所得总分为:0“
34、,_eng+_math+_sci); ,派生类,public class Person private string _name;private uint _age;public void GetInfo()Console.WriteLine(“请输入您的姓名和年龄“);_name = Console.ReadLine();_age = uint.Parse(Console.ReadLine();public void DispInfo()Console.WriteLine(“尊敬的 0,您的年龄为 1 “, _name, _age); ,基类,static void Main(string
35、args) Student objStudent = new Student();objStudent.GetInfo(); objStudent.DispInfo(); objStudent.GetMarks(); ,调用的基类成员,无法实现 GetInfo() 和 DispInfo() 方法,46,演示,public class Person private string _name;private uint _age;public void GetInfo()Console.WriteLine(“请输入您的姓名和年龄“);_name = Console.ReadLine();_age =
36、 uint.Parse(Console.ReadLine();public void DispInfo()Console.WriteLine(“尊敬的 0,您的年龄为 1“, _name, _age); ,public class Student:Person private string _school;private uint _eng;private uint _math;private uint _sci;private uint _tot;public uint GetMarks()Console.WriteLine(“请输入学校名称“);_school = Console.Read
37、Line();Console.WriteLine(“请分别输入英语、数学和自然科学的分数。 “); _eng = uint.Parse(Console.ReadLine();_math = uint.Parse(Console.ReadLine();_sci = uint.Parse(Console.ReadLine();_tot = _eng + _math + _sci;Console.WriteLine(“所得总分为:0 “,_tot);return _tot; ,基类,派生类,public class UnderGraduate:Student public void ChkEgbl(
38、)Console.WriteLine(“要上升一级,要求总分不低于 150 “);if(this.GetMarks() 149)Console.WriteLine(“合格“);elseConsole.WriteLine(“不合格“); ,派生类,public static void Main(string args) UnderGraduate objUnderGraduate = new UnderGraduate();objUnderGraduate.GetInfo();objUnderGraduate.DispInfo();objUnderGraduate.ChkEgbl(); ,47,
39、用于从派生类中访问基类成员 可以使用 base 关键字调用基类的构造函数,关键字 base,48,调用 base 构造函数,public class Student:Person private uint id;/调用 Person 构造函数 public Student(string name,uint age,uint id):base(name,age)this.id = id;Console.WriteLine(id); ,:base 关键字将调用 Person 类构造函数,49,演示,public class Person public string _name;public uin
40、t _age;public Person(string name, uint age)this._name = name;this._age = age;Console.WriteLine(_name);Console.WriteLine(_age); ,public class Student:Person private uint _id;public Student(string name, uint age, uint id):base(name, age)this._id = id;Console.WriteLine(_id); ,还将调用 Base 构造函数,static void
41、 Main(string args) /构造 Student Student objStudent = new Student(“XYZ“, 45, 001); ,50,关键字 override,Class Base / 成员变量int basevar;/ 成员函数GetInfo()/ 定义 .,Class Derived : Base / 成员变量int derivedvars;/ 成员函数override GetInfo()/ 定义 .,基类,派生类,base 方法的新实现,51,关键字 virtual,Access modifier virtual return type name( p
42、arameters-list ) ./ Virtual 方法实现. ,public virtual void Func() Console.WriteLine(“这是 virtual 方法,可以被重写“); ,52,/将执行派生类的变量,/要求 new 访问修饰符,将输出派生类中的 val,相同字段,new,隐藏继承成员,关键字 new,53,class Employee public virtual void EmpInfo() Console.WriteLine(“此方法显示职员信息“); ,class DervEmployee: Employee public override void
43、 EmpInfo() base.EmpInfo();Console.WriteLine(“此方法重写 base 方法“); ,static void Main(string args) DervEmployee objDervEmployee = new DervEmployee();objDervEmployee.EmpInfo();Employee objEmployee = objDervEmployee; objEmployee.EmpInfo(); ,54,抽象类和抽象方法 2-1,abstract class ClassOne /类实现,访问修饰符,派生类的基类,不能实例化,55,
44、abstract class Base / 成员变量int basevar;/ 成员函数 abstract void base_fun1(parameters);/ 无法实现. ,抽象方法,class Derived : Base / 成员变量int derivedvars;/ 成员函数 override void Base_fun1(parameters) / 实际实现. ,抽象类,派生类,提供,重写方法,原型,必须重写,抽象类和抽象方法 2-2,56,演示,using System; namespace Example_5 abstract class ABC public abstrac
45、t void AFunc();public void BFunc()Console.WriteLine(“这是一个非抽象方法!“); class Derv : ABC public override void AFunc() Console.WriteLine(“这是一个抽象方法! “); ,抽象类 不能实例化,派生类 重写方法,static void Main(string args) Derv objB = new Derv();objB.AFunc();objB.BFunc(); ,57,abstract class MyAbs public abstract void AbMethod
46、(); /派生类 class MyClass : MyAbs public override void AbMethod()Console.WriteLine(“在 MyClass 中实现的抽象方法“); /派生自 MyClass 的子类 class SubMyClass:MyClass public void General()/未实现 AbMethod 抽象方法 Console.WriteLine(“在 SubMyClass 中未实现的抽象方法 “); ,static void Main(string args) SubMyClass objSubClass = new SubMyClas
47、s();objSubClass.General(); ,58,接口 4-1,OFF,ON,请按开关按钮:ON/OFF,两种方法ON OFF,59,接口 4-2,ISwitchON() OFF(),60,接口 4-3,class IBase void method1(); int method2(); int method3(float);/没有实现. ,接口,interface,只有方法声明,没有实现,61,public interface IPict int DeleteImage();void DisplayImage(); ,隐式声明为 public,无访问修饰符,示例中的 IPict 接口用于演示接口,接口 4-4,62,演示,public class MyImages : IPict /第一个方法的实现 public int DeleteImage()Console.WriteLine(“DeleteImage 实现!“);return(5);/第二个方法的实现 public void DisplayImage()Console.WriteLine(“DisplayImage 实现!“); ,