掌握C#核心概念:类、继承、泛型等
C# 是一门功能强大且灵活的面向对象编程语言,它结合了许多现代编程语言的特点和特性。无论你是编程新手,还是有经验的开发者,理解C#中的核心概念都是非常重要的。本文将介绍C#中的类与对象、构造函数和析构函数、方法的重载与重写、继承与多态等基础知识,并为每个主题提供简要的解释和示例代码。
1. 类与对象
C# 是一种面向对象编程语言,类与对象是其核心。
- 类 是对象的模板,定义了对象的属性和方法。
- 对象 是类的实例,通过
new
关键字创建。
public class Person
{public string Name { get; set; }public int Age { get; set; }public void Greet(){Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");}
}// 使用类创建对象
Person person = new Person { Name = "Alice", Age = 25 };
person.Greet();
在上面的示例中,我们定义了一个 Person
类,并创建了一个名为 person
的对象。类提供了对象的属性(Name
和 Age
)以及方法(Greet
)。
2. 构造函数和析构函数
构造函数 是用于创建对象时初始化属性的方法。析构函数 则用于在对象销毁时执行清理操作。
public class Car
{public string Brand { get; set; }public Car(string brand){Brand = brand;Console.WriteLine($"{brand} car created.");}~Car(){Console.WriteLine($"{Brand} car destroyed.");}
}Car myCar = new Car("Toyota");
构造函数在对象创建时被调用,而析构函数则在对象销毁时自动调用。在实际应用中,析构函数很少使用,更多时候会使用 IDisposable
接口进行资源管理。
3. 属性(Properties)
属性是对象的特征,通过 get
和 set
方法可以控制属性的访问和修改。
public class Circle
{private double _radius;public double Radius{get { return _radius; }set{if (value > 0)_radius = value;elseConsole.WriteLine("Radius must be positive.");}}public double GetArea(){return Math.PI * _radius * _radius;}
}Circle circle = new Circle();
circle.Radius = 5;
Console.WriteLine($"Circle area: {circle.GetArea()}");
在这个例子中,Radius
是一个属性,我们通过 set
方法确保其值为正数。
4. 方法重载与重写
方法重载 允许在同一个类中定义多个同名的方法,只要参数列表不同即可。方法重写 则是在子类中重新定义父类的虚方法。
public class Calculator
{// 方法重载public int Add(int a, int b) => a + b;public double Add(double a, double b) => a + b;
}public class Animal
{public virtual void Speak() => Console.WriteLine("Animal sound");
}public class Dog : Animal
{// 方法重写public override void Speak() => Console.WriteLine("Bark");
}Calculator calc = new Calculator();
Console.WriteLine(calc.Add(1, 2)); // 输出:3
Console.WriteLine(calc.Add(1.5, 2.5)); // 输出:4Dog dog = new Dog();
dog.Speak(); // 输出:Bark
方法重载和重写使得同名方法可以根据上下文执行不同的操作,是实现多态的重要机制之一。
5. 继承与多态
继承 是面向对象编程中的核心概念之一,允许一个类继承另一个类的属性和方法。多态 则是不同对象可以通过同一个接口调用不同的实现。
public class Vehicle
{public virtual void Start() => Console.WriteLine("Vehicle starting");
}public class Car : Vehicle
{public override void Start() => Console.WriteLine("Car starting");
}public class Bike : Vehicle
{public override void Start() => Console.WriteLine("Bike starting");
}Vehicle myCar = new Car();
Vehicle myBike = new Bike();myCar.Start(); // 输出:Car starting
myBike.Start(); // 输出:Bike starting
通过继承,子类可以重用父类的代码,而多态使得不同的对象可以通过相同的接口调用不同的实现。
6. 抽象类与接口
抽象类 不能实例化,只能通过继承实现。接口 定义了类必须实现的行为。
public abstract class Animal
{public abstract void MakeSound();
}public class Cat : Animal
{public override void MakeSound() => Console.WriteLine("Meow");
}public interface IFlyable
{void Fly();
}public class Bird : Animal, IFlyable
{public override void MakeSound() => Console.WriteLine("Chirp");public void Fly() => Console.WriteLine("Flying");
}Cat cat = new Cat();
cat.MakeSound(); // 输出:MeowBird bird = new Bird();
bird.MakeSound(); // 输出:Chirp
bird.Fly(); // 输出:Flying
抽象类和接口的组合为我们提供了灵活且可扩展的设计方式。
7. 静态成员和静态类
静态成员 是属于类本身的,而不是对象。静态类 不能被实例化,所有成员都必须是静态的。
public static class MathHelper
{public static int Square(int x) => x * x;
}int result = MathHelper.Square(5);
Console.WriteLine(result); // 输出:25
静态类和静态成员非常适合存储无需实例化的通用功能或工具方法。
8. 泛型(Generics)
泛型 允许我们编写可以处理任何数据类型的类和方法,而无需为每种数据类型编写不同的代码。
public class Box<T>
{public T Value { get; set; }
}Box<int> intBox = new Box<int> { Value = 123 };
Box<string> strBox = new Box<string> { Value = "Hello" };Console.WriteLine(intBox.Value); // 输出:123
Console.WriteLine(strBox.Value); // 输出:Hello
泛型提高了代码的复用性,并且在编译时提供类型检查的安全性。
结论
C# 提供了一系列强大而灵活的工具来支持面向对象编程,包括类与对象、继承、多态、接口、泛型等概念。掌握这些基础知识有助于构建健壮且易于扩展的应用程序。希望这篇文章能够帮助你更好地理解和应用这些核心概念。
相关文章:
掌握C#核心概念:类、继承、泛型等
C# 是一门功能强大且灵活的面向对象编程语言,它结合了许多现代编程语言的特点和特性。无论你是编程新手,还是有经验的开发者,理解C#中的核心概念都是非常重要的。本文将介绍C#中的类与对象、构造函数和析构函数、方法的重载与重写、继承与多态…...

[VULFOCUS刷题]tomcat-pass-getshell 弱口令
tomcat-pass-getshell 弱口令 启动容器,打开网站 点开manageapp,输入弱口令 tomcat/tomcat 之后在下面上传jsp大马,首先生成一个jsp马 这里我直接使用github别人生成好的 tennc/webshell: This is a webshell open source project (github.…...

golang rpc
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务,对应rpc的是本地过程调用,函数调用是最常用的本地过程调用,将本地过程调用变成远程调用会面临着各种问题。 以两数…...

A Learning-Based Approach to Static Program Slicing —— 论文笔记
A Learning-Based Approach to Static Program Slicing OOPLSA’2024 文章目录 A Learning-Based Approach to Static Program Slicing1. Abstract2. Motivation(1) 为什么需要能处理不完整代码(2) 现有方法局限性(3) 验证局限性: 初步实验研究实验设计何为不完整代码实验结果…...
掌握 C# 中的委托与事件机制
C# 中的委托和事件为开发者提供了处理回调、异步编程以及发布订阅模式的强大工具。委托与事件机制在实际应用中非常常见,特别是在事件驱动编程和 GUI 应用中。本文将带你深入理解委托的定义、匿名方法、Lambda 表达式、事件机制以及多播委托的使用。 1. 委托&#x…...

使用微服务Spring Cloud集成Kafka实现异步通信(消费者)
1、本文架构 本文目标是使用微服务Spring Cloud集成Kafka实现异步通信。其中Kafka Server部署在Ubuntu虚拟机上,微服务部署在Windows 11系统上,Kafka Producer微服务和Kafka Consumer微服务分别注册到Eureka注册中心。Kafka Producer和Kafka Consumer之…...

docker pull 超时Timeout失败的解决办法
当国内开发者docker pull遇到如下提示时,不要惊讶 [rootvm /]# docker pull postgres Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 128.121.146.235:443: i/o timeout [rootvm /]# 自2024…...

YOLOv7改进之主干DAMOYOLO结构,结合 CReToNeXt 结构,打造高性能检测器
一、DAMOYOLO理论部分 论文地址:2211.15444 (arxiv.org) 在本报告中,我们提出了一种快速准确的对象检测方法,称为 DAMO-YOLO,它实现了比最先进的 YOLO 系列更高的性能。DAMO-YOLO 是从 YOLO 扩展而来的,具有一些新技术,包括神经架构搜索 (NAS)、高效的重新参数化广义 …...

进度条(倒计时)Linux
\r回车(回到当前行开头) \n换行 行缓冲区概念 什么现象? 什么现象?? 什么现象??? 自己总结: #pragma once 防止头文件被重复包含 倒计时 在main.c中,windows.h是不可以用的&…...

[每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别
文章目录 1. **支持的磁盘容量**2. **分区数量**3. **引导方式**4. **冗余和数据恢复**5. **兼容性**6. **安全性**7. **操作系统支持**8. 对比 国庆假期前补一篇 在一次扫描机械硬盘故障的问题,发现我本机SSD和机械硬盘的分类型不一样,分别是GPT和MBR&a…...

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例
河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规…...

22.1 k8s不同role级别的服务发现
本节重点介绍 : 服务发现的应用3种采集的k8s服务发现role 容器基础资源指标 role :nodek8s服务组件指标 role :endpoint部署在pod中业务埋点指标 role :pod 服务发现的应用 所有组件将自身指标暴露在各自的服务端口上,prometheus通过pull过来拉取指标但是promet…...

OpenCV计算机视觉库
计算机视觉和图像处理 Tensorflow入门深度神经网络图像分类目标检测图像分割OpenCVPytorchNLP自然语言处理 OpenCV 一、OpenCV简介1.1 简介1.2 OpenCV部署1.3 OpenCV模块 二、OpenCV基本操作2.1 图像的基本操作2.1.1 图像的IO操作2.1.2 绘制几何图像2.1.3 获取并修改图像的像素…...
CentOS 系统中的文件挂载 U 盘
要将 CentOS 系统中的文件保存到 U 盘,可以按照以下步骤进行操作: 一、插入 U 盘并确定设备名称 将 U 盘插入 CentOS 系统的 USB 接口。使用 fdisk -l 命令查看系统中的磁盘和分区情况,确定 U 盘的设备名称。通常 U 盘会显示为类似于 /dev/…...
Lumerical脚本语言-变量操作(Manipulating variables)
下面的命令用来创建和存取变量。 命令描述= 赋值操作符 :数组操作符 []创建矩阵 % 创建包含空格的变量名称 linspace 创建线性空间数组 matrix 创建一个全为 0 的矩阵 randmatrix 创建一个所有元素为 0~1 之间的一个随机数的矩阵 randnmatrix 创建一个所有元素为平均值为 0…...
一个基本的包括爬虫、数据存储和前端展示框架0
创建一个完整的网络爬虫和前端展示页面是一个涉及多个步骤和技术的任务。下面我将为你提供一个基本的框架,包括爬虫代码(使用Python和Scrapy框架)和前端HTML页面(伏羲.html)。 爬虫代码 (使用Scrapy) 首先,你需要安装Scrapy库:bash pip install scrapy 然后,创建一个新…...

简历制作面试篇
一.面试技巧分析 模板: 推荐使用简洁一点的模板,不要太花哨,能够让HR和面试官清楚,快速知道信息就可以,太花哨容易分散别人的注意力。 格式: 一般选用PDF,不要用WORD。 照片: 技术岗一般不用贴照片,推进写上自己的联系方式或者微信。 专业技能: 描述专业技能…...

智能制造--EAP设备自动化程序
EAP是设备自动化程序(Equipment Automation Program)的缩写,他是一种用于控制制造设备进行自动化生产的系统。EAP系统与MES系统整合,校验产品信息,自动做账,同时收集产品生产过程中的制程数据和设备参数数据…...

LabVIEW混合控制器质量检测
随着工业自动化水平的提高,对控制器的精度、稳定性、可靠性要求也在不断上升。特别是在工程机械、自动化生产、风力发电等领域,传统的质量检测方法已无法满足现代工业的高要求。因此,开发一套自动化、精确、可扩展的混合控制器质量检测平台成…...
新技术浪潮下的等保测评:云计算、物联网与大数据的挑战与机遇
随着信息技术的飞速发展,云计算、物联网(IoT)和大数据等新兴技术正以前所未有的速度改变着我们的生活和工作方式。这些技术的广泛应用不仅为信息系统带来了前所未有的性能提升,同时也对等保测评(信息安全等级保护测评&…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...