29.C#核心语法知识总结

29.总结


29.1 知识点

学习的主要内容

强调



29.2 核心要点速览

封装

类 和 对象

  • :模板/类型,定义特征(成员变量)、行为(成员方法)以及构造/析构等。
  • 对象:类的实例,引用类型,必须 new(或声明为 null)。

成员变量

  • 用途:描述对象特征。
  • 位置:类体内,任意类型,任意数量。
  • 默认值:值类型 = 0/false,引用类型 = null
  • 访问:由访问修饰符 (public/private/protected) 控制。

成员方法

  • 用途:描述对象行为。
  • 规则:写在类体内;不用 static;通过实例调用;可有任意参数和返回值。

构造 / 析构

  • 构造函数

    • 名称同类,无返回值,可重载。
    • 用于初始化成员;有参顶掉默认无参;可用 this(...) 链接重用。
  • 析构函数

    • ~ClassName(),无参数,无修饰符。
    • GC 回收对象时调用,C# 中少用。

C#垃圾回收机制

  1. 自动回收:对象无引用时,GC自动回收内存,无需手动释放。
  2. 分代策略
    • 第0代:新对象(优先回收)
    • 第1代:短期存活对象
    • 第2代:长期存活对象(如静态变量)
  3. 触发条件:内存不足、手动调用GC.Collect()或系统压力大时。
  4. 回收流程
    • 标记:从根对象遍历标记可达对象。
    • 清除:回收未标记对象。
    • 压缩:整理内存碎片。
  5. 优势:防内存泄漏,简化开发。
  6. 注意
    • 非托管资源(如文件句柄)需用usingDispose()手动释放。
    • 频繁GC影响性能,避免过度创建对象。

成员属性 (Properties)

  • 用途:包装字段,添加 get/set 逻辑,保护成员变量。

  • 语法

    public Type Name {
      get { … }  
      set { … }  // value 代表外部赋值
    }
    
  • 可选get/set 可单独存在;可加访问修饰符;支持自动属性:public int X { get; private set; }.

索引器 (Indexers)

  • 用途:让对象像数组一样用 obj[index] 访问内部集合。

  • 语法

    public ElementType this[int index] {
      get { … }  
      set { … }
    }
    
  • 可重载:参数数量/类型不同视为不同签名。

静态成员 & 静态类

  • 静态成员static 修饰字段、方法、属性等,程序启动即分配,用法:ClassName.Member
  • 静态类:只能包含静态成员,不能实例化,常作工具类。
  • 静态构造static ClassName() { … },无修饰符、无参数,仅调用一次,用于初始化静态成员。

拓展方法 (Extension Methods)

  • 作用:为现有类型“添砖加瓦”地增加方法,无需继承或修改原类型。

  • 要求:在静态类中写静态方法,首个参数加 this,指明要扩展的类型。

  • 语法

    public static void SpeakValue(this int value)
    {
    }
    

运算符重载

  • 关键词public static 返回类型 operator 符号(…)
  • 作用:让自定义类型支持 +-== 等操作符。
  • 注意:必须实现为静态方法;条件运算符需成对;不可使用 ref/out

内部类 & 分部类/分部方法

  • 内部类:在一个类内部定义另一个类,用于表示紧密关联的类型;访问时 Outer.Inner
  • 分部类partial class,同一类型可分散声明于多个文件,访问修饰符一致,成员不重复。
  • 分部方法partial void MethodName(); 与其实现分离,只能 void、无访问修饰符,局限性大。

继承

继承基本规则

  • 概念:子类可继承父类所有公共受保护成员(字段、方法、属性)。

  • 语法

    class Sub : Base { … }
    
  • 特点

    • 单根性:只能继承一个直接父类。
    • 传递性:可链式继承祖先类的成员。
  • 访问修饰符影响

    • public → 内外皆可访问
    • protected → 自身及子类可访问
    • private → 仅自身可访问
    • internal → 同程序集可访问
  • 示例

    class Teacher { protected int id; public void Speak(){} }
    class Lecturer : Teacher { public void Teach(){} }
    class SeniorLecturer : Lecturer { /* 可直接用 id/Speak/Teach */ }
    

继承中的构造函数

  • 执行顺序

    1. 最远祖先类(顶级父类)无参 / 指定构造
    2. 逐级向下:父类 → 子类 …
  • base 调用

    • 子类可在构造签名上显式调用父类某个构造:

      public Sub(int x) : base(x) { … }
      
    • 若不显式 base(...),则自动调用父类无参构造,故无参构造务必保留或补写

里氏替换原则 (LSP)

  • 核心:任何父类能出现的地方,子类都可替代。

  • 表现:可用父类类型的变量或容器存放子类实例。

  • 示例

    GameObject obj = new Player();
    GameObject[] list = { new Player(), new Monster(), new Boss() };
    

类型判断与转换 (is / as)

  • **is**:检查对象是否可视为某类型 → 返回 bool

  • **as**:尝试将对象转换为某类型 → 成功返回实例,失败返回 null

  • 示例

    if (obj is Player) 
       (obj as Player).Attack();
    

万物之父 (object)

  • 概念:所有类型(值与引用)的基类。

  • 用途:不确定类型时用作参数或容器。

  • 示例

    object o1 = 123;     // 装箱
    object o2 = "abc";   // 引用
    int x = (int)o1;     // 拆箱
    string s = o2 as string;
    

装箱与拆箱

  • 装箱:将值类型复制到堆上,生成引用类型实例。
  • 拆箱:将堆上已装箱的值类型提取回栈。
  • 性能:涉及堆→栈/栈→堆复制,频繁使用会有开销。

密封类 (sealed)

  • 概念:用 sealed 修饰的类,禁止被继承。

  • 语法

    sealed class MyClass { … }
    
  • 作用:确保设计不再被扩展,增强安全与规范。

多态

多态基本概念 (Polymorphism)

  • 定义:同一父类引用调用同名方法,执行子类不同实现
  • 关键词virtual(基类)、override(子类)、base(调用父级逻辑)
  • 好处:父类容器存放不同子类,调用统一接口即可实现不同表现

抽象类 & 抽象方法

  • 抽象类abstract class,不能实例化,可含抽象和虚方法
  • 抽象方法public abstract void M(); 无实现,子类必须 override
  • 虚方法public virtual void M(){} 可选覆写
  • 用途:在框架设计中定义“必须由子类实现”的接口模板

接口 (Interface)

  • 本质:纯“行为规范”声明,无字段,仅方法/属性/索引器/事件签名

  • 继承:类可继承多个接口;接口可继承接口

  • 实现:必须公开实现所有成员;支持显示实现解决同名冲突:

    void IFirst.M() {…}  void ISecond.M() {…}
    
  • 用途:解耦行为,与类继承并行实现多重职责

密封类 & 密封方法

  • 密封类sealed class C {} → 禁止任何派生
  • 密封方法public sealed override void M(){} → 在覆写后锁定,不再可重写
  • 用途:阻止不当继承或覆写,强化安全和稳定性

面向对象关联知识点

命名空间 (Namespace)

  • 作用:组织、分组、避免命名冲突,类似工具包

  • 声明

    namespace MyGame { class A { } }
    namespace MyGame.UI { class Image { } }
    
  • 引用

    using MyGame;
    var o = new GameObject();
    // 或显式指定全名
    var o2 = new MyGame.GameObject();
    
  • 同名类:不同命名空间可有同名类,必须 using + 命名空间或全名区分

  • 嵌套命名空间

    namespace MyGame { namespace UI { class Image { } } }
    using MyGame.UI;
    

object 类型核心成员

成员 功能
Equals(a,b) 静态:按左侧对象逻辑比较相等;实例:可重写自定义相等规则
ReferenceEquals 静态:判断引用是否相同(值类型永 false)
GetType() 返回运行时类型 Type,反射基础
MemberwiseClone 浅拷贝:值类型复制,引用类型仍指向同一对象
ToString() 虚:返回字符串,可重写定义格式;默认打印 Namespace.ClassName

string 核心方法

  • 不可变:每次变更都产生新实例 → 若频繁拼接用 StringBuilder
  • 索引访问s[i]
  • 查找IndexOf, LastIndexOf
  • 截取/移除Substring, Remove
  • 替换Replace
  • 分割Splitstring[]
  • 格式化Format("{0}{1}",…)
  • 大小写ToUpper(), ToLower()

StringBuilder(高效可变字符串)

  • 用途:频繁增删改字符时,减少内存分配

  • 容量Capacity 自动翻倍扩容;可在构造时指定初始容量

  • 常用方法:

    • Append / AppendFormat 添加
    • Insert 插入
    • Remove 删除
    • 索引器 sb[i] 读写
    • Replace 替换
    • Clear 清空
    • Equals 比较内容

结构体 vs 类

特性 结构体 (struct) 类 (class)
类型 值类型 引用类型
存储
继承 不能继承,只能实现接口 支持继承、多态
构造函数 不可定义无参;自定义有参不顶掉默认 可多重重载,有参顶掉默认需显式补无参
成员初始值 声明时不可赋初值 可赋初值
访问修饰符 protected 支持全部访问级别
静态成员 不支持 支持
自身字段引用 不能声明自身类型字段 可声明且不必初始化
  • 选用:数据小且多次复制不影响原值时用结构体;需继承、多态或大型对象用类

抽象类 vs 接口

特性 抽象类 (abstract class) 接口 (interface)
实例化
成员变量
构造函数
多继承 不支持(单继承) 支持(可继承多接口)
方法实现 可含抽象方法 & 虚方法 & 普通方法 仅声明,无实现
访问修饰符 支持全等级 默认 public,不建议写其他
何时用 表示对象抽象,共享字段+方法→子类实现 表示行为规范,可混入多功能


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏