C#本质论6.0第五章:类

2021-07-05 04:05

阅读:604

标签:调用   获取参数   垃圾回收器   关键字   操作符   name   tle   默认值   值方法   

面向对象编程

封装:

封装的目的是隐藏细节。在必要的时候,细节仍然可以访问,但通过巧妙的封装细节,大的程序变得更容易理解,数据不会因为不慎而被修改,代码也变得更容易维护。

继承:

继承允许在这些相似但又不同的物体之间建立“属于”关系从而得到一个类层次结构。更具体的类型称为派生类型或者子类型,更常规的类型称为基类型或者超类型

多态性:

多态性意味着一个方法或类型可以具有多种形式的表现。在多态性的帮助下,不同的类型能自己照料一个方法的实现细节,因为共享同一个公共基类型(或接口)的多个派生类型也包含了相同的方法签名。

访问修饰符:

访问修饰符的作用是提供封装,标识所修饰成员的封装级别。

字段

在类中存储数据的变量称为成员变量,更标注的为字段,它是与包容类型关联的具名存储单元,实例字段是在类的级别上声明的变量,用于存储与对象关联的数据。

属性

class Employee
{
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }
    private string _FirstName;
}

依然可以使用简单的赋值操作符对属性进行赋值,属性的定义使用了三个上下文关键字:get,setvalue

  • C#3.0支持自动实现的属性:允许在声明属性时,不添加取值或赋值方法,也不声明任何支持字段,一切都将自动实现。
public string Title{ get; set; }
  • 在C#6.0中,可以类似于初始化字段实现初始化属性:
public string Salary { get; set; } = "Not Enough";

属性的内部工作机制:待补

构造器

构造器是“运行时”用来初始化对象实例的方法。

  • new操作符返回一个引用,它指向实例化好的对象。new操作符从内存管理器获取“空白”内存,调用指定的构造器,将对“空白”内存的引用作为隐式的this参数传给构造器。构造器链剩余的部分开始执行,在构造器之间传递引用。这些构造器都没有返回类型。构造器链上的执行结束后,new操作符返回内存引用。现在,该引用指向的内存处于初始化好的形式。

  • 又在声明中又在构造器内部进行赋值的情况下,只要在声明时赋值发生之后,构造器内部的赋值才会发生,最终生效的是构造器内部的赋值,它会覆盖声明时的赋值。

默认构造器:

没有显式定义的构造器,该构造器不获取参数,称为默认构造器。

对象初始化器:

class Program
{
    static void Main()
    {
        Employee employee1 = new Employee("Inigo","Montoga")
        {
            Title = "Computer Nerd",
            Salary = "Not enough"
        };
    }
}

集合初始化器:

class Program
{
    static void Main()
    {
        List employees = new List()
        {
            new Employee("Inigo","Montoya"),
            new Employee("Kevin","Bost")
        };
    }
}

终结器:

终结器是在对象被判定“不可达”之后的不确定时间内执行,垃圾回收器会在一次垃圾回收过程中识别出带有终结器的对象。但不是立即回收这些对象,而是将它们添加到一个终结队列中。一个独立的线程遍历终结队列中的每一个对象,调用其终结器,然后将其从队列中删除,使其再次可供垃圾回收器处理。

构造器的重载:

可同时存在多个构造器,只要参数的数量和类型有区别。

构造器链:

在一个冒号后面添加this关键字,再添加被调用构造器的参数列表。

class Employee
{
    public Employee(string firstName,string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }
    public Employee(int id,string firstName,string lastName):this(firstName,lastName)
    {
        Id = id;
    }
    public Employee(int id)
    {
        Id = id;
    }
    //...
}

匿名类型:

它们是由编译器动态生成的数据类型,而不是通过显式的类定义来声明的。编译器遇到匿名类型的语法时,会自动生成一个CIL类,该类具有与匿名属性声明中的已经命名的值和数据类型对应的属性。该类型为静态类型,具有完全的可访问性。

虽然编译器支持匿名类型声明,但除非使用Lambda表达式和查询表达式关联来自不同类型的数据,或者对数据进行水平投射,否则一般情况下还是应该尽量避免使用这样的声明,甚至避免使用var来指定隐式类型的变量,除非需要频繁查询集合中的数据而使显式的类型声明成为负担,否则最好还是显式地声明类型。

静态成员:

静态字段:

为了定义能由多个实例共享的数据,需要使用static关键字。包含static修饰符的字段称为静态字段

实例字段,也就是非静态字段,可以在声明的同时进行初始化。

未初始化的静态字段将获得默认值(0,null,false)等,即default(T)的结果。所以即使没有显式赋值的静态字段也可以被访问。

非静态字段针对它们从属的每个对象,都提供一个新的存储位置。

静态方法:

直接在类名之后访问静态方法,访问这种方法不需要有实例,所以this关键字在静态方法中无效。除此之外,要在静态方法内部直接访问实例字段或实例方法,必须先获得对字段或方法所从属于的那个特定的实例的引用。

静态构造器:

用于对类进行初始化。静态构造器不支持显式调用,而是运行时在首次访问类时自动调用静态构造器,使用静态构造器将类中的静态数据初始化特定的值,尤其是无法通过声明的一次简单赋值来获得初始值的时候。

  • 在静态构造器中进行的赋值,将优先于声明的赋值。
  • 不要在静态构造器中引发异常,这会造成类型在应用程序剩余的生存期中无法使用。

静态属性:

相较于公共静态字段来说,提供了一定程度的封装。

静态类:

不包含任何实例字段,用static关键字修饰该类,防止该类被实例化,同时防止在类的内部声明任何实例字段或方法。

不能从静态类派生出其他类。

拓展方法:

能模拟为不同的类创建实例方法只需更改静态方法的签名,使第一个参数成为要拓展的类型,并在类型名称前面附加this关键字。

public static void CopyTo(
    this DirectoryInfo sourceDirectory, string target, SearchOption option, string searchPattern)
{
    //...
}
  • 第一个参数是要拓展或者要操作的类型,这称为“被拓展的类型”。
  • 为了指定拓展方法,要在被拓展类型名称前面附加this修饰符。
  • 要将方法作为拓展方法来访问,要用using指定导入拓展类型的命名空间,或者使拓展类型和调用代码在同一个命名空间里。

封装数据:

  • const关键字:const字段包含在编译时确定的值,它不可以在运行时改变。常量字段自动成为静态字段,但是将常量字段显式声明为static会造成编译错误。常量字段通常只使用包括包含字面量的类型。
  • readonly关键字:readonly字段修饰符只能用于字段,不能用于局部变量,它指出字段值只能从构造器中更改,或者在声明时通过初始化器修改。可以在执行时为readonly字段赋值,由于readonly字段必须从构造器中设置,所以编译器要求这种字段能从其属性外部访问。另外,readonly字段不限于包含字面量的类型。

嵌套类:

假如一个类在它的包容类外部没有多大意义,就适合将其设计成嵌套类。

  • 嵌套类中的this成员代表嵌套类而不是包容类的实例,若想访问包容类的实例,一个方法是显式传递包容类的实例。
  • 嵌套类能访问包容类的任何成员,包括私有成员,反之则不行。

分部类:

分部类是一个类的多个部分,这些部分可以合并成一个完整的类。

//File: Program1.cs
partial class Program
{ 
}
//File: Program2.cs
partial class Program
{
}

分部方法:(待补)

分部方法使生成的代码能调用并非一定要实现的方法。

C#本质论6.0第五章:类

标签:调用   获取参数   垃圾回收器   关键字   操作符   name   tle   默认值   值方法   

原文地址:https://www.cnblogs.com/zhang-mo/p/9834060.html


评论


亲,登录后才可以留言!