news 2026/4/16 12:00:34

类,对象基础概念 var与dynamic对比 字典基础用法 冒泡与选择排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
类,对象基础概念 var与dynamic对比 字典基础用法 冒泡与选择排序

面向对象编程核心概念总结

一、类 vs 对象

概念说明类比
类 (Class)蓝图/模板,定义属性和方法建筑设计图纸
对象 (Object)类的实例,有具体数据按图纸建好的房子
实例化从类创建对象的过程按图纸施工

csharp

// 定义类(蓝图) public class People { // 类的成员 } // 创建对象(实例) People zhangsan = new People(); // 实例化

二、类的三大成员

1.字段 (Field)

csharp

private int age; // 私有字段,类内部访问 protected int id; // 受保护字段,继承类访问 public string name; // 公有字段(不推荐)

特点:存储数据,通常私有,以小写字母开头

2.属性 (Property)

csharp

public string Name { get; set; } // 自动属性

特点:控制字段访问,提供get/set方法,以大写字母开头

3.方法 (Method)

csharp

public void Eat() { Console.WriteLine("吃炸鸡"); }

特点:定义行为,执行操作

三、访问修饰符

修饰符访问范围常用场景
public任何地方属性、公共方法
private本类内部字段(默认)
protected本类及子类受保护成员
internal当前程序集类(默认)

csharp

public class People { private int age; // ✅ 私有:数据安全 public string Name { get; set; } // ✅ 公有:外部访问 protected int id; // ⚠️ 保护:继承可用 public void Eat() { } // ✅ 公有:外部调用 }

四、对象创建和使用

创建对象:

csharp

// 语法:类名 对象名 = new 类名(); People person = new People(); // 设置属性 person.Name = "张三"; // 调用方法 person.Eat();

五、代码执行流程

csharp

// 1. 定义类(编译时) public class People { public string Name { get; set; } public void Eat() { Console.WriteLine("吃炸鸡"); } } // 2. Main方法执行(运行时) static void Main(string[] args) { // 3. 创建对象(内存分配) People zhangsan = new People(); // 4. 设置属性 zhangsan.Name = "李四"; // 实际:zhangsan.Name.set("李四") // 5. 调用方法 zhangsan.Eat(); // 输出:吃炸鸡 // 6. 对象生命周期结束(垃圾回收) }

六、实际应用示例

示例1:学生管理系统

csharp

public class Student { // 字段(私有) private string studentId; // 属性(公有) public string Name { get; set; } public int Age { get; set; } public double Score { get; set; } // 方法 public void Study(string subject) { Console.WriteLine($"{Name}正在学习{subject}"); } public bool IsPass() { return Score >= 60; } } // 使用 Student stu = new Student(); stu.Name = "张三"; stu.Age = 20; stu.Score = 85; stu.Study("数学"); Console.WriteLine($"是否及格: {stu.IsPass()}");

示例2:购物车系统

csharp

public class ShoppingCart { private List<string> items = new List<string>(); // 私有字段 // 公有方法 public void AddItem(string item) { items.Add(item); Console.WriteLine($"已添加: {item}"); } public void ShowItems() { Console.WriteLine("购物车商品:"); foreach (var item in items) { Console.WriteLine($"- {item}"); } } }

七、最佳实践

1.封装原则

csharp

// ❌ 不好:字段公有 public class BadExample { public int age; // 外部可以直接修改,不安全 } // ✅ 好:字段私有,属性公有 public class GoodExample { private int age; // 私有字段 public int Age // 公有属性 { get { return age; } set { if (value >= 0 && value <= 150) // 添加验证 age = value; } } }

2.命名规范

csharp

public class Person { // 字段:_camelCase 或 camelCase private string _firstName; private int age; // 属性:PascalCase public string FirstName { get; set; } // 方法:PascalCase public void DisplayInfo() { } }

3.初始化建议

csharp

// 方式1:默认构造函数 + 属性设置 People p1 = new People(); p1.Name = "张三"; // 方式2:构造函数初始化 public class People { public People(string name) { Name = name; } } People p2 = new People("李四"); // 方式3:对象初始化器(C# 3.0+) People p3 = new People { Name = "王五", Age = 25 };

八、常见错误

❌ 错误1:混淆类和对象

csharp

// 错误:试图使用类调用实例方法 People.Eat(); // ❌ 编译错误 // 正确:必须先创建对象 People person = new People(); person.Eat(); // ✅

❌ 错误2:访问私有字段

csharp

People person = new People(); person.age = 20; // ❌ 编译错误:age是私有的 person.Name = "张三"; // ✅ Name属性是公有的

❌ 错误3:忘记实例化

csharp

People person; // 只声明,未实例化 person.Name = "张三"; // ❌ 运行时NullReferenceException People person = new People(); // ✅ 正确实例化 person.Name = "张三"; // ✅

九、扩展概念

1.静态 vs 实例成员

csharp

public class Calculator { // 实例成员:需要对象 public int Add(int a, int b) { return a + b; } // 静态成员:直接通过类访问 public static int Multiply(int a, int b) { return a * b; } } // 使用 Calculator calc = new Calculator(); int sum = calc.Add(1, 2); // 需要对象 int product = Calculator.Multiply(3, 4); // 直接类访问

2.构造函数

csharp

public class Person { public string Name { get; set; } // 默认构造函数 public Person() { } // 带参数构造函数 public Person(string name) { Name = name; } }

十、一句话总结

类是模板,对象是实例。字段存数据要私有,属性控访问要公有,方法定行为可调用。用new创建对象,用.访问成员。记住:先有类蓝图,再有对象实例。


C# 冒泡排序 & 选择排序 核心知识点极简总结

一、冒泡排序(Bubble Sort)

核心逻辑

重复遍历数组,相邻元素两两比较交换,每轮将最大 / 最小元素 “冒泡” 到数组末尾,共需n-1轮遍历(n 为数组长度)。

核心特点

维度说明
时间复杂度平均 / 最坏 O (n²),最好(已排序)O (n)
空间复杂度O (1)(原地排序)
排序性质稳定排序(相等元素相对位置不变)
核心优势逻辑简单,可提前终止(优化版)
核心劣势交换次数多,大数据量效率低

极简代码(升序)

csharp

运行

void BubbleSort(int[] arr) { for (int i = 0; i < arr.Length - 1; i++) { bool swapped = false; // 优化:无交换则提前结束 for (int j = 0; j < arr.Length - 1 - i; j++) { if (arr[j] > arr[j+1]) { // 相邻比较,逆序则交换 (arr[j], arr[j+1]) = (arr[j+1], arr[j]); // C# 元组交换 swapped = true; } } if (!swapped) break; } }

二、选择排序(Selection Sort)

核心逻辑

分 “已排序区” 和 “未排序区”,每轮遍历未排序区找到最小 / 最大元素,仅 1 次交换到已排序区末尾,共需n-1轮。

核心特点

维度说明
时间复杂度所有情况 O (n²)(必遍历完所有轮次)
空间复杂度O (1)(原地排序)
排序性质不稳定排序(相等元素可能交换位置)
核心优势交换次数少(每轮最多 1 次)
核心劣势效率固定,无优化空间

极简代码(升序)

csharp

运行

void SelectionSort(int[] arr) { for (int i = 0; i < arr.Length - 1; i++) { int minIndex = i; // 记录未排序区最小值索引 for (int j = i + 1; j < arr.Length; j++) { if (arr[j] < arr[minIndex]) minIndex = j; } if (minIndex != i) { // 找到更小值才交换 (arr[i], arr[minIndex]) = (arr[minIndex], arr[i]); } } }

三、核心对比(C# 视角)

特性冒泡排序选择排序
交换次数多(相邻逆序就交换)少(每轮仅 1 次)
稳定性稳定不稳定
优化空间可提前终止(无交换则 break)
适用场景小数据量、近乎有序数组小数据量、对交换次数敏感

总结

  1. 两者均为基础排序,仅适用于小数据量场景;
  2. 冒泡胜在 “稳定 + 可优化”,选择胜在 “交换少”;
  3. C# 中可通过元组(a,b)=(b,a)简化交换逻辑,无需临时变量。

C# var、dynamic 对比

一、var vs dynamic 核心对比

特性vardynamic
类型确定时机编译期(静态类型)运行期(动态类型)
类型推导由初始化值推导,不可更改无固定类型,运行时动态绑定
编译检查有(语法 / 类型错误编译报错)无(错误仅运行时暴露)
IntelliSense支持(编译器已知类型)不支持(无编译期类型提示)
适用场景简化冗长类型声明(如 LINQ)动态交互(COM/JSON/ 动态语言)
核心示例var list = new List<int>();dynamic obj = 10; obj = "abc";

关键补充(C# 视角)

  • var:本质是 “语法糖”,编译后会替换为实际类型,性能无损耗;必须初始化(var a;报错)。
  • dynamic:依赖 DLR(动态语言运行时),运行时解析成员,性能略低;可延迟初始化。

C# 字典用法极简总结

一、一句话核心

字典是键值对集合,通过键快速查找值,键必须唯一。

二、基本操作(记住这5个就够用)

1.创建字典

csharp

Dictionary<string, int> dict = new Dictionary<string, int>();

2.添加数据

csharp

dict.Add("苹果", 5); // 方法1 dict["香蕉"] = 3; // 方法2(更常用)

3.获取数据

csharp

int count = dict["苹果"]; // 直接取(键必须存在)

4.安全获取(推荐!)

csharp

if (dict.TryGetValue("苹果", out int value)) { Console.WriteLine(value); // 5 }

5.检查键是否存在

csharp

if (dict.ContainsKey("苹果")) { // 存在 }

三、遍历字典(3种方式)

csharp

Dictionary<string, int> scores = new Dictionary<string, int> { {"张三", 85}, {"李四", 92} }; // 方式1:遍历键值对(最常用) foreach (KeyValuePair<string, int> pair in scores) { Console.WriteLine($"{pair.Key}: {pair.Value}"); } // 方式2:只遍历键 foreach (string name in scores.Keys) { Console.WriteLine(name); } // 方式3:只遍历值 foreach (int score in scores.Values) { Console.WriteLine(score); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:26:27

多传感器时间同步技术实战指南:从理论到工程实现

多传感器时间同步技术实战指南&#xff1a;从理论到工程实现 【免费下载链接】cartographer Cartographer is a system that provides real-time simultaneous localization and mapping (SLAM) in 2D and 3D across multiple platforms and sensor configurations. 项目地址…

作者头像 李华
网站建设 2026/4/16 12:17:39

智能命名革命:如何用Codelf让变量生成效率提升300%

你是否曾在深夜coding时&#xff0c;为一个变量名反复纠结&#xff1f;当"用户登录状态"这个概念在脑海中清晰无比&#xff0c;却找不到对应的英文表达&#xff1f;中文开发者的命名困境&#xff0c;Codelf用一套完整的智能解决方案彻底改善。这个开源工具通过创新的…

作者头像 李华
网站建设 2026/4/16 12:23:29

探索性测试:技巧与案例深度剖析

在当今快速发展的软件开发领域&#xff0c;探索性测试&#xff08;Exploratory Testing&#xff09;已成为提升测试覆盖率和质量的关键手段。相比于传统的脚本化测试&#xff0c;它强调测试人员的自主性和创造性&#xff0c;能够更有效地发现边缘场景和潜在缺陷。对于软件测试从…

作者头像 李华
网站建设 2026/4/16 7:59:35

硬件流控制(RTS/CTS)

硬件流控制&#xff08;RTS/CTS&#xff09;是串口通信中一种高效的流量协调机制。为了让你快速把握核心&#xff0c;我们先通过一个表格来梳理它的关键信息&#xff0c;随后再深入其工作细节和应用场景。特性维度硬件流控 (RTS/CTS)核心原理​通过独立的物理信号线&#xff08…

作者头像 李华
网站建设 2026/4/16 14:05:02

3大核心优势深度解析:Actix Web如何重塑分布式系统架构

3大核心优势深度解析&#xff1a;Actix Web如何重塑分布式系统架构 【免费下载链接】actix-web Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust. 项目地址: https://gitcode.com/gh_mirrors/ac/actix-web 在现代分布式系统开发中&…

作者头像 李华
网站建设 2026/4/14 19:36:13

14、信号处理中的核特征提取与降维

信号处理中的核特征提取与降维 在当今的信号处理领域,基于核的特征提取和降维技术正变得越来越重要,尤其是在处理高维数据的应用场景中。本文将深入探讨这一领域的相关方法,包括多元分析、基于核依赖估计的特征提取、大规模和半监督问题的扩展,以及域适应等方面。 1. 多元…

作者头像 李华