2026/4/16 20:46:00
网站建设
项目流程
外网网站建设调研报告,seo 新老网站替换 域名不变,网站建设算什么行业,微信公众号图文模板免费下载面向对象编程核心概念总结一、类 vs 对象概念说明类比类 (Class)蓝图/模板#xff0c;定义属性和方法建筑设计图纸对象 (Object)类的实例#xff0c;有具体数据按图纸建好的房子实例化从类创建对象的过程按图纸施工csharp// 定义类#xff08;蓝图#xff09;
public class…面向对象编程核心概念总结一、类 vs 对象概念说明类比类 (Class)蓝图/模板定义属性和方法建筑设计图纸对象 (Object)类的实例有具体数据按图纸建好的房子实例化从类创建对象的过程按图纸施工csharp// 定义类蓝图 public class People { // 类的成员 } // 创建对象实例 People zhangsan new People(); // 实例化二、类的三大成员1.字段 (Field)csharpprivate int age; // 私有字段类内部访问 protected int id; // 受保护字段继承类访问 public string name; // 公有字段不推荐特点存储数据通常私有以小写字母开头2.属性 (Property)csharppublic string Name { get; set; } // 自动属性特点控制字段访问提供get/set方法以大写字母开头3.方法 (Method)csharppublic void Eat() { Console.WriteLine(吃炸鸡); }特点定义行为执行操作三、访问修饰符修饰符访问范围常用场景public任何地方属性、公共方法private本类内部字段默认protected本类及子类受保护成员internal当前程序集类默认csharppublic 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学生管理系统csharppublic 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购物车系统csharppublic class ShoppingCart { private Liststring items new Liststring(); // 私有字段 // 公有方法 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.命名规范csharppublic 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访问私有字段csharpPeople person new People(); person.age 20; // ❌ 编译错误age是私有的 person.Name 张三; // ✅ Name属性是公有的❌ 错误3忘记实例化csharpPeople person; // 只声明未实例化 person.Name 张三; // ❌ 运行时NullReferenceException People person new People(); // ✅ 正确实例化 person.Name 张三; // ✅九、扩展概念1.静态 vs 实例成员csharppublic 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.构造函数csharppublic 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[j1]) { // 相邻比较逆序则交换 (arr[j], arr[j1]) (arr[j1], 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无适用场景小数据量、近乎有序数组小数据量、对交换次数敏感总结两者均为基础排序仅适用于小数据量场景冒泡胜在 “稳定 可优化”选择胜在 “交换少”C# 中可通过元组(a,b)(b,a)简化交换逻辑无需临时变量。C# var、dynamic 对比一、var vs dynamic 核心对比特性vardynamic类型确定时机编译期静态类型运行期动态类型类型推导由初始化值推导不可更改无固定类型运行时动态绑定编译检查有语法 / 类型错误编译报错无错误仅运行时暴露IntelliSense支持编译器已知类型不支持无编译期类型提示适用场景简化冗长类型声明如 LINQ动态交互COM/JSON/ 动态语言核心示例var list new Listint();dynamic obj 10; obj abc;关键补充C# 视角var本质是 “语法糖”编译后会替换为实际类型性能无损耗必须初始化var a;报错。dynamic依赖 DLR动态语言运行时运行时解析成员性能略低可延迟初始化。C# 字典用法极简总结一、一句话核心字典是键值对集合通过键快速查找值键必须唯一。二、基本操作记住这5个就够用1.创建字典csharpDictionarystring, int dict new Dictionarystring, int();2.添加数据csharpdict.Add(苹果, 5); // 方法1 dict[香蕉] 3; // 方法2更常用3.获取数据csharpint count dict[苹果]; // 直接取键必须存在4.安全获取推荐csharpif (dict.TryGetValue(苹果, out int value)) { Console.WriteLine(value); // 5 }5.检查键是否存在csharpif (dict.ContainsKey(苹果)) { // 存在 }三、遍历字典3种方式csharpDictionarystring, int scores new Dictionarystring, int { {张三, 85}, {李四, 92} }; // 方式1遍历键值对最常用 foreach (KeyValuePairstring, 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); }