C#是纯粹的面向对象编程语言,它真正体现了“一切皆为对象”的精神。在C#中,即使是最基本的数据类型,如int,double,bool类型,都属于System.Object(Object为所有类型的基类)类型。此外,使用C#编程,不会存在与游离于对象之外的属于过程的东西。因此,学习C#,就必须具有面向对象思想。
什么是类?
使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类之外的函数。因此,类是面向对象编程的基本单元。
在绝大多数面向对象语言中,一个类都可以包含两种成员:字段与方法。字段与方法这两个概念是面向对象理论的术语,是通用于各种面向对象语言的。而在各种的具体面向对象语言中,可以简单的这样理解:字段即变量,方法即函数。
类的字段:代表了类中的数据,在类的所有方法之外定义了一个变量即定义了一个字段。变量前可以加上public、private和protected表示字段的访问权限。
例:
class ren
{
public decimal tizhong; //体重decimal类型
private static decimal nianling;//年龄decima类型,静态的
public int shengao=175;//身高int类型,身高赋值175cm;
}
类的方法:为了解决代码重复的问题,绝大多数程序设计语言都将完成某一公用功能的多个语句组合在一起,起一个名字用于代表这些语句的全体,这样的代码被称为“函数”。
例如:
[public | private] class 类名 //类名前的修饰符默认是public
{
[public | private] 数据类型 变量名;//定义变量
[public | private] 数据类型 函数名(参数列表)//定义函数
{
函数体;
}
}
在一个program.cs文件中添加一个类,而这个class类就是专门存放程序需要的函数方法的库(平时的积累),每一个 方法函数都由多个变量、语句等组成的一个代码块,而这个代码块有一个方法名,(在方法名前加修饰符public,private,protected等表 示这个函数的访问权限)需要时直接在主函数的文件中调用这个方法名即可。
函数也分为有返回值和无返回值两种情况。
<1>有返回值的情况(多种数据类型,如int,string,double等):
class 类名{
public int 函数名(int x,int y)
{
int z=x+y;
return z;//上面函数的数据类型就是return要返回的数据类型,一定要对应一致,才能在主函数中调用并输出返回值;
}
}
<2>无返回值的情况(void)
class 类名{
public void 函数名(int x,int y)//如果没有返回值,即在定义函数名前加void;
{
int z=x+y;
Console.Write("z的值为:"+z);直接在函数中输出
return;//或者直接return+分号;即没有返回值,不用在主函数中调用输出
}
}
方法的定义与使用
定义:放在一个类的函数(通常加一个存取权限修饰符)称为“方法”;
调用一个方法最基本的方式是通过类创建的对象。new初始化对象的过程是创建一个新对象的过程,利用原有的模板创建一个新的对象,开辟一个新的空间。
例如:ren r=new ren();
在ren类中定义一个Add()方法:
public class ren()
{
public int Add(int x,int y)
{
return x+y;
}
}
在主函数调用ren()这个方法:
static void Main(string[] args)
{
ren r=new ren();//创建ren类的对象,命名r
int result=r.Add(100,200);//通过对象调用类的方法,结果保存在局部变量中
}
方法重载
方法重载是实现多态的另一个方法。通过方法重载,一个类中可以有多个具有相同名字的方法,由传递给它们的不同个数的参数来决定使用哪种方法。例 如,对于一个作图的类,它有一个draw()方法用来画图或输出文字,我们可以传递给它一个字符串、一个矩形、一个圆形,甚至还可以再制定作图的初始位 置、图形的颜色等。对于每一种实现,只需实现一个新的draw()方法即可,而不需要新起一个名字,这样大大简化了方法的实现和调用,程序员和用户不需要 记住很多的方法名,只需要传入相应的参数即可。
因为类可以包含运算符如何运算的指令,所以可以把运算符用于从类实例化而来的对象。
我们为重载运算符编写代码,把它们用作类定义的一部分,而该运算符作用于这个类。也可以重载运算符,以相同的方式处理不同的类,其中一个(或两个)类定义包含达到这一目的的代码。
注意:只能用这种方式重载现有的C#运算符,不能创建新的运算符。
练习:
用结构体做排序问题,输入学生的学号,姓名,成绩,按成绩由大到小排序。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace jiegoutipaixu { class Program { public struct student //定义结构体数据类型 { public int code; public string name; public double degree; } public ArrayList paixu(ArrayList shuzu) { for (int i = 0; i < shuzu.Count - 1; i++) { for (int j = i + 1; j < shuzu.Count; j++) { if (((student)shuzu[i]).degree < ((student)shuzu[j]).degree) { //等量代换 student zhong = new student(); zhong = (student)shuzu[i]; shuzu[i] = shuzu[j]; shuzu[j] = zhong; } } } return shuzu; } static void Main(string[] args) { Console.Write("请输入学生人数:"); int renshu = int.Parse(Console.ReadLine()); ArrayList shuzu = new ArrayList();//根据人数定义数组容器 for (int i = 0; i < renshu; i++) //根据人数去循环输入学生信息 { student s = new student(); Console.Write("请输入第{0}个学生的学号:", i + 1); s.code = int.Parse(Console.ReadLine()); Console.Write("请输入第{0}个学生的姓名:", i + 1); s.name = Console.ReadLine(); Console.Write("请输入第{0}个学生的成绩:", i + 1); s.degree = int.Parse(Console.ReadLine()); shuzu.Add(s); } shuzu = new Program().paixu(shuzu); //3.输出 Console.WriteLine("*********成绩如下*********"); Console.WriteLine(" 学号 姓名 分数"); foreach (student a in shuzu) { Console.Write(" "); Console.Write(a.code); Console.Write(" "); Console.Write(a.name); Console.Write(" "); Console.Write(a.degree); Console.WriteLine(); } Console.ReadLine(); } } }