C#学习笔记第一篇——类进阶

本文深入探讨C#类的各种成员,包括数据成员和函数成员,如字段、常量、方法、属性、构造函数、析构函数等。解析静态成员、成员常量、属性的特性,及实例和静态构造函数的区别。介绍对象初始化列表、析构函数和Dispose函数的作用,以及本地常量和readonly修饰符的使用。最后,阐述this关键字、索引和访问器修饰符的概念,以及分部类和分部方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

我所看的书籍,C#图解教程第四版有一些老了,现在C#的最新版本是7,但是这本书挺好的,官网有关于每一个版本更新的要点,https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/index
C#4之后增加的是一些更加高级的功能,以后再慢慢了解吧

类的成员

类的成员按照本质来分,有数据成员和函数成员

  • 字段
  • 常量
  • 方法
  • 属性
  • 构造函数
  • 析构函数
  • 运算符
  • 索引
  • 事件

静态成员
  • 可以声明为static的类成员如下所示
    • 字段
    • 方法
    • 属性
    • 构造函数
    • 运算符
    • 事件
  • 他们有下面这些性质:

    1. 静态成员即使没有类的实例也存在 . 如果静态字段有初始化语句,那么该字段在类的任 何静态成员被使用之前初始化,但没必要在程序执行的开始就初始化.
    2. 静态成员被所有实例共享
    3. 静态函数可以访问静态字段,但是不能访问实例成员
    4. 实例成员可以像访问实例成员那样访问静态成员
成员常量
  1. 成员常量使用修饰符const
  2. 他在编译期被替换,并没有自己的存储位置
  3. 他表现的十分像静态字段,即使没有实例,也可以用类名+点+成员常量名字来访问
属性
  1. 属性是函数成员,拥有set,get两个方法体,但是表现的像字段
  2. 他没有存储空间
  3. set方法隐式有一个value参数,和属性类型相同
  4. 唯一的必须要求是get方法必须要返回一个数据
  5. set与get很随意,可以对关联字段传进传出,也可以执行任何计算
  6. 属性可以设置成静态
  7. 可以只有set或只有get,变成只读属性或者只写属性,必须要有一个进行设定
  8. 有自动实现属性的方法,编译器会隐式创建后备字段和其关联,但是set,get不能有方法体,以分号结尾。
  9. 不能显式的调用访问器
  10. 可以像字段那样,直接引用属性名称
实例构造函数
  1. 如果没有构造函数,系统会默认有一个无参构造函数,没有方法体
  2. 构造函数可以重载,只要参数列表不同
  3. 如果自己为类声明了构造函数,那么系统就不会再提供默认无参构造函数
  4. 我们可以使用构造函数方法体
  5. 我们可以给实例构造函数指派访问修饰符,如public,private等,如果是private,则只能在类内部使用该函数。
静态构造函数
  1. 静态字段通常在静态构造函数中进行初始化
  2. 或者在静态构造函数中初始化
  3. 静态构造函数不能有访问修饰符
  4. 类只能有一个静态构造函数,不能有参数
  5. 不能在程序中显式调用静态构造函数,他们会被系统自动调用
    1. 在类的任何实例被创建之前
    2. 在类的任何静态成员被引用之前
对象初始化列表
  1. 他只是扩展了创建语法
  2. 允许在创建新对象实例时,设置字段和属性的值
  3. 有两种形式
  4. 初始化发生在构造函数的执行之后,因此会产生不同的值
  5. 设置的属性和字段必须是可访问的
Myclass ins=new Myclass{FieldOrProp=InitExpr }
Myclass ins=new Myclass(ArgList){FieldOrProp=InitExpr}
析构函数
  1. 这个函数是用来清理资源的
  2. 当你觉得自己的程序需要析构函数,你就必须为系统提供他
  3. 析构函数不能被显式调用,他是被系统在某个不确定的时间点调用,在垃圾收集过程中。
  4. 每个类只能有一个析构函数
  5. 析构函数不能有参数,不能有修饰符,名称和普通函数一样,但是多一个‘~’
  6. 析构函数只对实例起作用,所以没有静态形式
Dispose函数
  • 如果想要显式清理资源,就要实现一个IDisposable的接口,把清理资源的代码封装在一个void的无参数方法中,叫做dispose
  • 一些指导方针
    • 如果dispose已经清理过了,就调用GC.SuppressFinalize 告诉CLR不要再调用析构函数
    • 如果某种原因dispose没有清理,就要析构函数来清理
    • dispose函数应该属于就算被多次调用也不能出现问题
本地常量
  • 常量在声明中必须初始化
  • 常量在声明后不能改变
  • 在类型之前增加关键字const
  • 必须有初始化语句,初始化值必须在编译期决定
  • 值可以是null引用或者预定义简单类型的数据或者表达式,不能是引用类型,因为对象的引用在运行时确定的
  • 声明在方法体里面
成员常量
  • 成员常量和本地常量差不多
  • 只是声明在类声明里面
readonly修饰符
  • 他的作用和const差不多,但是有稍微不同
  • 他可以在声明时就初始化,也可以在类的任何构造函数中进行初始化
  • 他在内存中有存储位置
  • 他不用在编译期就确定,可以在运行期就确定
class Shape
{ 
  readonly double PI=3.1416;
  readonly int    NumberOfSides;

    public Shape(double side1, double side2)
    {
    NumberOfSides =4;//在构造函数中确定
    }

    public Shape(double side1, double side2,double side3)
    {
    NumberOfSides =3;//在构造函数中确定
    }
}
this关键字
  • this关键字只能用在下面这些类成员的代码块中
    • 实例构造函数
    • 实例方法
    • 属性或索引的实例访问器
索引
  • 索引和属性差不多一样,都有set和get
  • 不用分配内存来存储
  • 他们都被用来访问其他数据成员,这些成员和它们关联,为这些成员提供设置和获取访问
  • 属性表示单独的数据成员
  • 索引表示多个数据成员
  • 索引可以只有一个访问器,也可以两个都有
  • 索引总是实例成员,不能被声明为static
  • 和属性一样,set与get访问器可以什么都不做,只要get访问器返回某个指定类型的值即可
  • 声明语句
  • string this [ int index]{}
  • 参数列表在方括号中间
  • 参数列表至少必须声明一个参数
  • 索引没有名称,在名称的位置关键字this
  • 索引可以重载,由于名称都是this,所以参数列表必须不一样
访问器修饰符
  • 访问器修饰符有很多限制,如下:
  • 只有两个访问器都存在的情况下,才可以有修饰符
  • 修饰符只能有一个
  • 修饰符的等级不能比成员的等级高
  • 没有修饰符的访问器继承成员的修饰符
分部类和分部类型
  • 类的声明可以被分割成几个分部类的声明
  • 每个分部类的声明都含有一些类成员的声明
  • 类的分部类声明可以在同一文件中,也可以不在同一文件中
  • 局部声明需要被标记partial class
  • partial 是上下文关键字
  • 分部类需要在一起进行编译,并且具有相同的含义,如同所有类成员被声明在一个单独的类声明体内
分部方法
  • 定义声明和实现声明的签名必须相同
  • 定义声明和实现声明在不同的分部类
  • 方法返回值为void、不能有修饰符,为隐式私有
  • 参数列表不能包含out参数
  • 可以有定义部分而没有实现部分,那么对该方法的任何调用将全部删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值