[C#基础]基础知识一: 面向对象的基本知识.

激励自己有时间多看看.!!

C#基础共分为七个部分:

  一: 面向对象

     二: 值类型, 引用类型, 字符串操作

  三: 集合文件操作

  四: 正则表达式

  五: XML操作

  六: 委托, 事件

  七: 反射

1, 面向对象:

  面向对象的三大特性: 封装, 继承, 多态

2, 什么是类? 什么是对象? 类和对象的区别?

  类: 类似模子, 确定对象将会拥有的特征(属性) 和行为 (方法)

  对象是一个你能够看得到, 摸得着的具体实现-- 万物皆对象.

    --类是模具, 创建对象的模具, 抽象的

       .类是一组数据类型, 用户自定义的数据类型.

     .类组成: 字段, 属性, 方法, 构造函数.

    --对象是具体的, 是类的具体实例. 对象是具有属性(特征)和方法(行为)

    --类中包含了数据(用字段标示)与行为(用方法(函数, 功能)标示, 方法为一块具有名称的代码)

3, 知识点总结

封装继承多态

一、封装:

  封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。

封装的意义:   封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

  封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。私有的数据可以用两种方式来间接的控制。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。

  使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、“只读”、“只写”灵活的操作方法。

访问修饰符:

二、继承:

  继承主要实现重用代码,节省开发时间。

1、C#中的继承符合下列规则:

  1. 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
  2. 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
  3. 构造函数和析构函数不能被继承。除此之外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
  4. 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
  5. 类可以定义虚文法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。

  2、new关键字

   如果父类中声明了一个没有friend修饰的protected或public方法,子类中也声明了同名的方法。则用new可以隐藏父类中的方法。(不建议使用)

  3、base关键字

   base 关键字用于从派生类中访问基类的成员:

  1. 调用基类上已被其他方法重写的方法。
  2. 指定创建派生类实例时应调用的基类构造函数。

 三、多态

  1、多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

  编译时的多态性:   编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。    运行时的多态性:   运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。    编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

   2、实现多态:

  1. 接口多态性。
  2. 继承多态性。
  3. 通过抽象类实现的多态性。

  3、override关键字:

   重写父类中的virtual修饰的方法,实现多态。

五个访问修饰符

Private:只有类本身能存取.   Protected:类和派生类可以存取.   Internal:只有同一个项目中的类可以存取.   Protected Internal:是Protected和Internal的结合.    Public:完全存取.

  1. C# 方法默认访问级别 : private  
  2. C# 类默认访问级别 : internal 
  3. 接口成员访问修饰符默认为public,且不能显示使用访问修饰符。
  4. 类(class) 构造函数默认为public访问修饰符。 析构函数不能显示使用访问修饰符且默认为private访问修饰符。  析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
  5. 类的成员默认访问修饰符为private; 
  6. 枚举(enum) 枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。
  7. 结构(struct)  结构成员默认为private修饰符。  结构成员无法声明为protected成员,因为结构不支持继承。 
  8. 嵌套类型 嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。

字段和属性及索引器

1、属性   所谓属性其实就是特殊的类成员,它实现了对私有类域的受控访问。在C#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,创建学生姓名属性,控制对name字段的受控访问:

 1 using System;
 2 
 3 public class Student
 4 {
 5     private string name;
 6     /// <summary>
 7     /// 定义学生的姓名属性
 8     /// </summary>
 9     public string Name
10     {
11         get { return name; }
12         set { name = value; }
13     }
14 }
15 
16 
17 class Program
18 {
19     static void Main(string[] args)
20     {
21         Student student = new Student();
22         student.Name = "Jeff Wong";
23         Console.WriteLine(student.Name);
24         Console.Read();
25     }
26 }

2、索引器 简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。比如,上例中,我们假设一个班级有若干个学生,构建索引器就可以很方便地调用:

 1 using System.Collections.Generic;
 2 
 3 public class Student
 4 {
 5     public List<Student> listStudents = new List<Student>();
 6 
 7     /// <summary>
 8     /// 构建索引器
 9     /// </summary>
10     /// <param name="i"></param>
11     /// <returns></returns>
12     public Student this[int i]
13     {
14         get { return listStudents[i]; }
15         set { listStudents[i] = value; }
16     }
17 
18     private string name;
19     /// <summary>
20     /// 属性
21     /// </summary>
22     public string Name
23     {
24         get { return name; }
25         set { name = value; }
26     }
27     public Student(string name)
28     {
29         this.name = name;
30     }
31     public Student()
32     {
33         this.listStudents.Add(new Student("jeff wong"));
34         this.listStudents.Add(new Student("jeffery zhao"));
35         this.listStudents.Add(new Student("terry lee"));
36         this.listStudents.Add(new Student("dudu"));
37     }
38 }
39 
40 
41 class Program
42 {
43     static void Main(string[] args)
44     {
45         Student student = new Student();
46         int num = student.listStudents.Count;
47         Console.WriteLine("All the students:");
48         for (int i = 0; i < num; i++)
49         {
50             Console.WriteLine(student[i].Name); //通过索引器,取所有学生名
51         }
52 
53         //设置索引器的值
54         student[0].Name = "jeff";
55         Console.WriteLine("After modified,all the students:");
56         for (int i = 0; i < num; i++)
57         {
58             Console.WriteLine(student[i].Name); 
59         }
60 
61         Console.Read();
62     }
63 }

上面代码中,我们看到索引器的访问器带一个参数(参数为整数),其实可以构建多个参数的索引器。还以上述代码为例,我们要根据学生学号和姓名得到学生的考试总分,修改后代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 public class Student
 5 {
 6     public List<Student> listStudents = new List<Student>();
 7 
 8     public Student this[int i,string name]
 9     {
10         get
11         {
12             foreach (Student stu in listStudents.ToArray())
13             {
14                 if (stu.sid == i && stu.name == name) //按照学号和姓名取出学生
15                 {
16                     return stu;
17                 }
18             }
19             return null;
20         }
21         set { listStudents[i] = value; }
22     }
23 
24     private int sid; //学号
25     public int Sid
26     {
27         get { return sid; }
28         set { sid = value; }
29     }
30     private string name;//姓名
31     public string Name
32     {
33         get { return name; }
34         set { name = value; }
35     }
36     private int score; //总分
37     public int Score
38     {
39         get { return score; }
40         set { score = value; }
41     }
42     public Student(int sid, string name, int score)
43     {
44         this.sid = sid;
45         this.name = name;
46         this.score = score;
47     }
48     public Student()
49     {
50         this.listStudents.Add(new Student(1, "jeff wong", 375));
51         this.listStudents.Add(new Student(2,"jeffery zhao",450));
52         this.listStudents.Add(new Student(3,"terry lee",400));
53         this.listStudents.Add(new Student(4,"dudu",500));
54     }
55 }
56 
57 
58 class Program
59 {
60     static void Main(string[] args)
61     {
62         Student student = new Student();
63         Student stu = student[1, "jeff wong"];
64         Console.WriteLine("student number:" + stu.Sid + ",name:" + stu.Name + ",score:" + stu.Score);
65 
66         Console.Read();
67     }
68 }

3、总结: <1>、

属性的定义: 访问修饰符 返回类型 属性名

{       get{语句集合}       set{语句集合} }

索引器的定义:

访问修饰符 返回类型 this[参数类型 参数...] {        get{语句集合}        set{语句集合} }

<2>、

索引器使得对象可按照与数组相似的方法进行索引。 this 关键字用于定义索引器。 get 访问器返回值。set 访问器分配值。 value 关键字用于定义由 set 索引器分配的值。 索引器不必根据整数值进行索引,由你决定如何定义特定的查找机制。 索引器可被重载。 <3>、属性和索引器的主要区别:  a、类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。  b、属性可以是static(静态的)而索引器则必须是实例成员。 <4>、索引器重载实例:

 1 using System.Collections.Generic;
 2 
 3 public class Student
 4 {
 5     public List<Student> listStudents = new List<Student>();
 6 
 7     public Student this[int i,string name]
 8     {
 9         get
10         {
11             foreach (Student stu in listStudents.ToArray())
12             {
13                 if (stu.sid == i && stu.name == name) //按照学号和姓名取出学生
14                 {
15                     return stu;
16                 }
17             }
18             return null;
19         }
20         set { listStudents[i] = value; }
21     }
22 
23     /// <summary>
24     /// 索引器重载
25     /// </summary>
26     /// <param name="i"></param>
27     /// <returns></returns>
28     public Student this[int i] //i从0开始
29     {
30         get { return listStudents[i]; }
31         set { listStudents[i] = value; }
32     }
33 
34     private int sid; //学号
35     public int Sid
36     {
37         get { return sid; }
38         set { sid = value; }
39     }
40     private string name;//姓名
41     public string Name
42     {
43         get { return name; }
44         set { name = value; }
45     }
46     private int score; //总分
47     public int Score
48     {
49         get { return score; }
50         set { score = value; }
51     }
52     public Student(int sid, string name, int score)
53     {
54         this.sid = sid;
55         this.name = name;
56         this.score = score;
57     }
58     public Student()
59     {
60         this.listStudents.Add(new Student(1, "jeff wong", 375));
61         this.listStudents.Add(new Student(2,"jeffery zhao",450));
62         this.listStudents.Add(new Student(3,"terry lee",400));
63         this.listStudents.Add(new Student(4,"dudu",500));
64     }
65 }
66 
67 
68 class Program
69 {
70     static void Main(string[] args)
71     {
72         Student student = new Student();
73         Student stu = student[1, "jeff wong"];
74         Console.WriteLine("student number:" + stu.Sid + ",name:" + stu.Name + ",score:" + stu.Score);
75       
76         Console.WriteLine("all the students:");
77 
78         for (int i = 0; i < student.listStudents.Count; i++)
79         {
80             Console.WriteLine("student number:" + student[i].Sid + ",name:" + student[i].Name + ",score:" + student[i].Score);
81         }
82 
83         Console.Read();
84     }
85 }

里氏替换

 一句话总结: 子类可以替换父类的位置,而程序的功能不受影响

更多链接: http://blog.csdn.net/yisuowushinian/article/details/18976629

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海天一树

小朋友学C++(20):内联函数

第(2)种方法比第(1)种方法,有三个优点: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修...

8220
来自专栏Laoqi's Linux运维专列

python3–函数

59750
来自专栏鸿的学习笔记

Python和Scala里的闭包

在函数式编程里,闭包(closure)是绕不过的话题,它的实现基础来源于变量作用域和一等函数。也正是因为如此,我们可以进一步把代码块抽象,Python也诞生了装...

6910
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day7 Java输入与输出

  本篇主要介绍Java的输入与输出,当然,这里说的是控制台下的输入与输出,窗口程序的设计将会再后续篇章中有详细说明。     Java的输出很简单,调用Sys...

23690
来自专栏菩提树下的杨过

python:函数的高级特性

22930
来自专栏猿人谷

C++ 模板学习

1. 模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为...

257100
来自专栏Bug生活2048

Python自学之路-内置函数说明及实例(二)

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

14910
来自专栏Bingo的深度学习杂货店

Q189 Rotate Array

Rotate an array of n elements to the right by k steps. For example, with n = 7 a...

37770
来自专栏草根专栏

C# 7.0简而言之 -- 02. C#基础 (1)

语句1里面计算了表达式(expression) 12 * 30, 并把结果保存到了本地变量x里面, x是整型类型.

396120
来自专栏平凡文摘

7大经典的排序算法总结实现

14620

扫码关注云+社区

领取腾讯云代金券