当前位置: 首页 > news >正文

C#中的接口、枚举和结构体

接口

在C#中,接口是一种定义契约的引用类型。它只包含方法、属性、事件或索引器的声明,不包含实现。

从C#8.0开始,接口可以包含默认是实现,比如静态或实例方法,但核心依然是“定义能力,而非细节”。

特性

接口内不能包含实例字段,如int age;

内部没有构造和析构方法,不可以实例化;

一个类可以实现多个接口;

C#8.0前,所有成员默认为public;在之后可以指定private、protected、static、virtual等;

当多个接口有同名方法时,可以显式指定实现哪个。

// 定义接口 public interface IAnimal { // 属性(自动属性在接口中只表示必须存在 get/set) string Name { get; set; } // 方法(无实现体) void MakeSound(); } // 实现接口 public class Dog : IAnimal { public string Name { get; set; } public void MakeSound() { Console.WriteLine($"{Name} says: Woof!"); } }

接口的多实现与显式实现

public interface ICanFly { void Move(); } public interface ICanSwim { void Move(); } public class Duck : ICanFly, ICanSwim { // 显式实现(调用时需转型为对应接口) void ICanFly.Move() => Console.WriteLine("Fly"); void ICanSwim.Move() => Console.WriteLine("Swim"); // 普通实现(会同时满足两个接口,但若重名会冲突,通常用显式) } // 使用 Duck d = new Duck(); ((ICanFly)d).Move(); // 输出 Fly ((ICanSwim)d).Move(); // 输出 Swim

C#8.0后,允许接口中添加带实现的方法

public interface ILogger { void Log(string message); // 默认实现(C# 8.0+) void LogError(string error) { Log($"ERROR: {error}"); } } public class ConsoleLogger : ILogger { public void Log(string message) => Console.WriteLine(message); // 无需实现 LogError,直接继承默认实现 }

枚举

在C#中,枚举(enum)是用于定义一组命名常量的值类型。它让代码更易读、更安全,避免使用魔法数字或字符串。

特性

继承自System.Enum,基类是System.ValueType;

默认值类型为int,可以指定为byte、short、long等整数类型;

每个成员都对应一个整数值,默认从0开始依次递增;

不同枚举之间是不能隐式转换的;

支持位运算。

// 定义枚举(默认从 0 开始) public enum Weekday { Sunday, // 0 Monday, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday // 6 } // 手动指定值 public enum ErrorCode { Success = 0, NotFound = 404, ServerError = 500, Timeout = 408 // 可以跳号 } // 指定底层类型 public enum FileSize : long { Small = 1024, Large = 1048576, // 如果值超过 int 范围,必须指定 long }

结构体

C#中结构体是一种值类型,用于封装小型数据组。与类不同,结构体在栈上分配,赋值时复制值而非引用。

特性

继承自System.ValueType,赋值即复制;

由于是在栈上分配内存,所以结构体的性能更高,但当占用内存过大时复制开销也大;

结构体是隐式密封,也就是sealed类型,不能继承也不能被继承,但可以实现接口;

内部必须有有参构造函数,在C#10前,无参构造函数不允许被自定义;

在C#10前,字段不能再声明时初始化。

// 定义结构体 public struct Point { // 字段(推荐私有,通过属性访问) private int _x; private int _y; // 属性(可自动属性) public int X { get; set; } public int Y { get; set; } // 构造函数(必须有参数) public Point(int x, int y) { X = x; Y = y; } // 方法 public double DistanceTo(Point other) { return Math.Sqrt(Math.Pow(X - other.X, 2) + Math.Pow(Y - other.Y, 2)); } // 重写 ToString public override string ToString() => $"({X}, {Y})"; } // 使用 Point p1 = new Point(3, 4); Point p2 = p1; // 复制值,修改 p2 不影响 p1 p2.X = 10; Console.WriteLine(p1); // (3, 4) Console.WriteLine(p2); // (10, 4)

用readonly修饰,强制不可变性,可以提高安全性

public readonly struct ReadOnlyPoint { public int X { get; } // 只读属性 public int Y { get; } public ReadOnlyPoint(int x, int y) { X = x; Y = y; } // 方法必须是 readonly(不会修改状态) public double DistanceTo(ReadOnlyPoint other) { return Math.Sqrt(Math.Pow(X - other.X, 2) + Math.Pow(Y - other.Y, 2)); } }

如果是ref struct,只能分配在栈上,不能装箱也不能作为类字段,用于高性能场景的时候

public ref struct Buffer { private Span<byte> _data; public Buffer(Span<byte> data) { _data = data; } public void Fill(byte value) { _data.Fill(value); } } // 注意:ref struct 不能实现接口,不能装箱
http://www.jsqmd.com/news/1232852/

相关文章:

  • 【电赛打怪连载3】CCS下的MSPM0G3507——封装好的代码如何移植适配???
  • Python机器学习入门:环境配置与核心算法实战
  • JDK 8 与 JDK 11 全面对比:从语言特性到生产选型
  • 我花 600 元用 AI 做了一个本地优先的个人财务管理 App——技术选型与核心实现
  • 二叉树的几道题
  • 2026大厂高频面试题:“AI都能写80%代码了,公司还要你干嘛?”
  • Gemini 3.1 Pro多模态AI与Windows 11系统构建解析
  • OpenClaw:AI代码生成与审核重构开发流程
  • 司法文书与案例检索系统——从裁判文书网到司法知识图谱的全链路实战
  • SEO成本优化实战:从工具到策略的全方位指南
  • Spring Boot高并发支付宝支付系统设计与实战
  • Fable 5:从AI打字机到智能经理的五大核心能力解析
  • Windows 11 24H2下eNSP兼容性问题解决方案
  • C++指令集优化实战:从编译器选项到SIMD内联汇编的性能飞跃
  • C++进制转换算法精解:从原理到竞赛实战,攻克大数与任意进制难题
  • Unity XR交互开发实战:从官方示例到自定义交互的完整指南
  • IL2CPP环境下游戏翻译失效的全面排查与修复指南
  • 微软Office 2024新特性解析与订阅制替代方案
  • 机器学习生产化:从模型上线到系统稳定性的工程实践
  • 中级游戏后端的逆袭之路——常规游戏功能设计(四、帮派系统)
  • 国产CAN总线产品选型与设计实践指南
  • TypeScript 7.0 正式发布 + TanStack Start 实战:2026 全栈开发者的新标配
  • 状态压缩BFS:从迷宫寻路到带锁钥匙问题的算法建模与C++实现
  • 使用POCO C++库构建高效HTTP客户端:从同步到异步的完整指南
  • 如何用AI在3小时内生成专业级中文字体:从零开始的完整指南
  • C++实现高性能列式内存数据库:从架构设计到SIMD优化实战
  • AI对话记录导出与管理全攻略
  • Linux命令行从入门到精通:核心指令与实战技巧
  • C++数据类型深度解析:从内存布局到实战避坑指南
  • C++20协程与io_uring异步IO实战:生产环境避坑指南