news 2026/4/15 9:07:12

类,对象基础概念 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/14 13:29:00

点赞之交,朋友圈里的“虚情”与“假意”

点击文末“阅读原文”即可参与节目互动剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间在这个“点赞”即“已阅”的时代&#xff0c;我们的朋友圈究竟是生活的记录册&#xff0c;还是精心修饰的橱窗…

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

GAIA基准实战指南:构建智能助手评估体系的完整方案

GAIA基准实战指南&#xff1a;构建智能助手评估体系的完整方案 【免费下载链接】agents-course This repository contains the Hugging Face Agents Course. 项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course 面对市场上琳琅满目的AI助手&#xff0c;你…

作者头像 李华
网站建设 2026/4/11 13:47:17

好用的安全帽撞击体验机构

好用的安全帽撞击体验机构引言在建筑施工等行业中&#xff0c;安全帽的重要性不言而喻。而安全帽撞击体验能够让从业者更直观地感受安全帽的防护作用&#xff0c;从而提高安全意识。市场上也出现了不少提供安全帽撞击体验服务的机构&#xff0c;筑小安便是其中好用且可靠的一家…

作者头像 李华
网站建设 2026/4/10 4:30:03

3分钟掌握PostHog自托管:从零开始的完整部署实战

你是否曾因商业分析工具的高昂费用而苦恼&#xff1f;是否担心数据隐私无法得到保障&#xff1f;开源产品分析平台PostHog提供了完美的解决方案。本文将带你从零开始&#xff0c;3分钟内完成PostHog的完整自托管部署&#xff0c;无需专业运维知识&#xff0c;全程跟随操作即可拥…

作者头像 李华
网站建设 2026/4/13 1:06:17

AI面试官TOP6大盘点:AI招聘工具如何提升效能?

企业招聘常受 “简历堆压、初面低效、识人不准” 困扰&#xff1a;校招 5 万份简历人工筛选需 10 天&#xff0c;蓝领旺季 2000 人面试要 3 人满负荷运转&#xff0c;传统面试还易因标准不统一错失人才。本文对比 2025 年 6 款主流 AI 面试软件&#xff0c;助企业找到 “降本、…

作者头像 李华
网站建设 2026/4/13 4:52:29

C# 基于halcon的视觉工作流-章69 深度学习-异常值检测

C# 基于halcon的视觉工作流-章69 深度学习-异常值检测 本章目标&#xff1a; 一、模型训练&#xff1b; 二、模型推理&#xff1b;本章与章67基本相同&#xff0c;不再进行重复描述。不同之处在于需用算子get_dl_model_param设置模型参数&#xff0c;如图片尺寸等 匹配效果如下…

作者头像 李华