C# 学习基础记录

1、深入.NET框架
  1. .NET框架结构
    a) .NET 框架运行在操作系统之上,是.NET 最基础的框架。它提供了创建,部署和运行.NET应用的环境,主要包含CLR 和框架类库,并支持多种开发语言。
    b).NET包含两个组件:公共语言运行时(CLR)和框架类库。
           其中公共语言运行时(CLR)是.NET框架的基础。 框架类库是一个综合性的面向对象的可重用类型集合。
  2. 公共语言运行时(CLR)
           a)公共语言运行时(CLR)是所有.NET应用程序运行时的环境,是所有.NET应用程序都要使用编程基础,它如同一个支持.NET应用程序运行和开发的虚拟机。
           b)公共语言运行时(CLR)包含两个部分:CLS(公共语言规范)和 CTS(通用类型系统)
           CLS(公共语言规范)是用于解决不同语言的数据类型不同的问题
           CTS(通用类型系统)限制了由这些不同点引发的互操作性问题,CLS是一种最低的语言标准,制定了一种以.NET 语言之间实现互操作性所需要的完备特征。
     3. 框架类库
           框架类库提供了对系统功能的调用,建立.NET应用程序,组件和控件的基础。
2、深入C#数据类型
     1.类和对象
        类和对象的区别,类定义了一组概念的模型,而对象是真实的实体
        1)有对象归纳类,是对象共性的过程
    2)在类的基础上,将状态和行为对象的过程称为实例化
    关于get和set访问和设置
    1)只读:只包含get访问器
    2)只写:只包含set访问器
    3)读写:同时包含set和get两个访问器
    注:自动属性的快捷键为:prop关键字+Tab键+tab键
  2.封装
    封装指利用抽象数据类型将数据和数据的操作结合在一起,使其构成一个不可分割的独立实体,尽可能隐藏内部的细节,只保留一些对外接口,使之与外部发生联系。
    封装的优点
    1)保证数据的安全性
    2)提供清晰的对外接口
    3)类内部实现可以任意修改,不影响其他类
  3.值类型和引用类型
    1)值类型
    每个值类型的对象都有一个独立的内存区域保存自己的值,值类型数据所在的内存区域称为栈
    类别 描述
    值类型 基本数据类型
    整形: int
    长整形: long
    浮点型: float
    字符型: char
    布尔型: bool
    值类型 枚举:enum
    结构类型 结构:struct
    引用类型 类
    基类: System.Object
    字符型: string
    自定义类: class
    接口 接口: interface
    数组 数组: int[],string[]
    注:值类型数据储存在栈中 引用类型储存在堆中
3、使用集合组织相关数据
  1.ArrayList
    1) ArrayList类似于数组,也可以叫做数组列表,ArrayList 类属于System.Collections,ArrayList 可以直观地动态维护,它的容量可以根据需要自动扩充,它的索引会根据程序的扩展而重新进行分配和调整。
    2)给Array添加数据(ArrayList通过add方法添加元素)
    语法:
      public int Add(object value)
      含义:该方法将对象添加到ArrayList的尾处
      返回值:换回是一个int整型,用于返回所添加的元素的索引(即下标)
      参数:在ArrayList中的所有事值类型,这些类型都会被转换为object引用类型然后保存。
    3)删除ArrayList中的元素
      删除ArrayList的元素以下三种方式:
      语法:
      RemoveAt(int index)方法删除指定index(索引)的元素
      Remove(object value)方法删除一个指定对象名元素
      Clear()方法移除集合中的所有元素
  2.Hashtable的概述
    注: 哈希表的数据时通过键(key)和(value)来组织的 ,也是属于System.Collections命名空间,给Hashtable添加对象,也要使用Add(),但哈希表有两个参数,一个表示键,一个表示键所对应的值。
    添加元素
    语法:
      public void Add(object key,object value)
    1)获取哈希表的元素
    可以直接通过键名来获取具体值
    2)删除哈希表的元素
    语法:
      public void Remove(object key)
  3.泛型集合list<T>
    泛型集合list<T>在System.Collections.Generici命名空间中
    定义一个list<T>泛型集合:
    语法:
    list<T> 对象名=new list<T>
    注:“<T>”中的T可以对集合中的元素类型进行约束,T表明集合中管理的元素类型。
    list<T>与ArrayList的区别
    1)异同点 List<T> ArrayList
    2)不同点 List<T>对所保存元素做类型约束 ArrayList可以增加
    List<T>添加/读取值类型元素无须拆箱装箱 ArrayList添加/读取值类型元素需要拆箱装箱

 

    3)相同点 通过索引访问集合中的元素
    添加元素的方法相同
    删除元素方法相同

  4.泛型集合Dictionary<k,y>
    1)泛型集合Dictionary<k,y>
    泛型集合Dictionary<k,y>在System.Collections.Generic命名空间中,它具有泛型的全部特性,编译时检查类型约束,获取元素时无须类型转换,与哈希表相似,也是通过key/value(键/值)保存元素的。
    定义Dictionary<k,v>泛型集合:
    语法:
      Dicyionary<k,v> 对象名 =new Dicyionary<k,v>();
    2)Dicyionary<k,v> 与 Hashtable的区别
      异同点 Dictionary<k,v> Hashtable
      不同点 Dictionary<k,v>对所保存元素做类型约束 Hashtable可以增加
      Dictionary<k,v>添加/读取值类型元素无须拆箱装箱 Hashtable添加/读取值类型元素需要拆箱装箱
      相同点 通过key获取值
      添加元素的方法相同
      删除元素方法相同
    遍历方法也相同
4、深入类的方法
  构造函数:
  1.什么是构造函数
    类的构造函数是类中的一种特殊方法,有这么几个特点:
    1)它的方法名与类名相同
    2)没有返回类型
    3)主要完成对象的初始化工作
  2.无参构造函数
    在系统默认会给类分配一个无参的构造函数,并没有方法体。
  3.带参构造函数
    语法:
      public 类名(参数列名)
      {
          //....方法体
      }
  4.隐式构造函数
    隐式构造函数在类中只有一个带参的构造函数
  方法重载:
    1.构造函数的重载
    在一个类中有两个名字相同但参数个数不相同的构造函数。很显然多个构造函数提供多个构造函数提供了多种实例化一个类的方式,这种方式被称为方法重载。
    注:构造函数的重载是方法重载的一种特殊方式
    方法重载的特点:
     1)方法名称相同。
     2)方法参数个数不同,参数类型不同
     3)在同一个类中
    2.对象交互实例
    注: 对象交互主要通过参数传递,方法调用,以及属性操作来实现

5、初识继承和多态

       1.什么是继承

            .........

             被继承的类称为父类,继承其它类的类称为子类或者派生类。

              注;在有继承关系的两个类中,子类不仅具有自己独有的成员,还具有父类的成员。

       2.base关键字和protected修饰符

           this:表示当前实例,通过它可以访问类本身的成员

            base:用于表示父类,可以用于访问父类的成员 (例:调用父类的属性,调用父类的方法。)

           protected:指被这个访问修饰符修饰的成员允许被其子类访问,而不允许其它子类访问。

            public, private和protected修饰符的访问区别

       修饰符           类内部    子类       其他类

       public            可以       可以       可以

       private           可以       不可以    不可以

       protected       可以       可以       不可以

 

       3.继承的特性

             1)传递性

                   父类与子类之间的传递

             2)单根性

                   一个子类不能同时继承多个父类

       4.IS-A的应用

            is关键字用来判断对象是否给定的类型,如果属于会返回true,否则返回false。例:声明一个集合A对象 if(A is 子类)表示判断A对象是否为子类型。

      5.什么是多态

             多态是指两个或多个属于不同类的对象,对于同一消息(方法调用)作出不同的响应方式。

       6.实现多态

             如何用虚方法实现多态

             1)实现方法重写。例:在父类中定义Say()方法,用virtual关键字定义为虚方法

             2)在子类中定义子类自己的Say()方法,用override关键字修饰(即修改),就实现了对父类Say()方法的重写。

             3)定义父类变量,用子类对象初始化父类变量

6、深入理解多态

       1.里氏替换原则

             里氏替换原则指出子类对象可以代替父类对象,在开发程序时可以编写一父类类型作为传参方法,在实际调用时传入子类对象

              当子类可以替换带哦父类是,软件的功能不受影响,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。

       2.is和as的操作和使用

              is操作符用于检查对象和指定的类型是否兼容

              as操作符主要用于两个对象和指定的类型转换

       3.抽象方法是一个没有实现的方法,通过在定义方法是增加关键字abstract可以声明抽象方法。

     语法:

             访问修饰符 abstract 返回类型 方法名();

       4.含有抽象方法的类必然是抽象类

      语法:

             访问修饰符 abstract 返回类型 类名;

       5.实现抽象方法

             实现子类中一个抽象方法的方式也是使用override关键字来重写抽象方法

      语法;

             访问修饰符 override 返回类型 方法();

       注:对于抽象类有一个限制:它不能实例化。

       注:抽象类不能使密封或者静态的。

7、partial(关键字)是局部类型的意思

       就是说有这个关键字的类、结构或接口可以写成几个部分

       比如      public partial class Program

             {

                         static void Main(string[] args)

                         {

                         }

             }

 

             partial class Program

             {

                         public void Test()

                         {

                         }

             }

       编译后它相当于

              public class Program

             {

                         static void Main(string[] args)

                         {

                         }

 

                   public void Test()

                         {

                         }

             }

       局限性:

              1、必须存在于同一个程序集(dll.exe)中

              2、修饰符还必须一样,如public/private/protected的,则不成

              3、只能应用于class/interface/and/struct

              4、不易统一管理

8、internal(关键字)只能在程序集中访问

       如果你记录日志的程序集是这么定义的

       namespace LogerHelper {   

              internal class aa{        

                     public void bb(){            

                            return "";        

                     }   

              }   

              public class Write{       

                     public void WriteIn(string content){            

                            class x = new aa();               

                            x.bb();       

                     }   

              }

       }

       当另一个项目引用了此DLL它可以这么访问 

       LogerHelper.Write x = new LogerHelper.Write();

       x.WriteIn("");

       但不可以这么访问

       LogerHelper.aa x = new LogerHelper.aa();

       x.bb();

       只能在程序集中访问

posted @ 2021-03-04 11:15  方寸山学习  阅读(93)  评论(0)    收藏  举报