C#编程技术指南:从入门到精通的全面教程
无论你是编程新手,还是想要深化.NET技能的开发者,本文都将为你提供一条清晰的学习路径,从C#基础到高级特性,每一站都配有详尽解析和实用示例,旨在帮助你建立坚实的知识体系,并激发你对C#及.NET生态的热情。
目录
第一部分:C#基础——构建你的第一个程序
1. 环境搭建
2. 第一个C#程序
3. 变量、数据类型与控制流
1)变量
2)数据类型
3)控制流
4)条件判断(if语句)
5)循环(for语句)
6)循环(while语句)
7)选择(switch语句)
第二部分:面向对象编程(OOP)——构建模块化的代码世界
1、类 (Class)
2、对象 (Object)
对象的创建与使用
3、构造函数 (Constructor)
4、属性 (Property)
5、方法 (Method)
6、继承 (Inheritance)
7、封装 (Encapsulation)
第三部分:高级特性——解锁更高效、更优雅的编程技巧
1、 泛型与集合
1)泛型类
2)泛型方法
3)泛型约束
4)数组 (Array)
5)列表 (List)
6)队列 (Queue)
7)栈 (Stack)
8)字典 (Dictionary)
9)泛型集合
2、 异常处理
3、Lambda表达式与LINQ
第四部分:并发编程——在多核时代乘风破浪
1、 多线程与并发
1)线程基础
2)线程池
3)任务并行库 (TPL)
4)并行循环
5) 异步编程 (async/await)
2、 并发集合
3、 原子操作
4、委托与事件
5、 线程同步
1)lock 关键字
2) Monitor 类
3) Semaphore 类
第五部分:实战演练——理论到实践的跨越
结语
C#(发音为“See Sharp”)由微软公司精心打造,是一种现代化的面向对象编程语言。它在.NET平台上运行,旨在提供高效、类型安全的开发体验,广泛应用于Windows桌面应用、Web服务、游戏开发(Unity尤为青睐)、以及跨平台解决方案。让我们一起揭开C#的面纱,逐步掌握其精髓。
第一部分:C#基础——构建你的第一个程序
1. 环境搭建
- Visual Studio:微软官方提供的全能IDE,适用于从简单到复杂的所有项目。
- .NET SDK:确保安装最新版,它是运行C#程序的基石。
2. 第一个C#程序
using System;namespace HelloWorld
{class Program{static void Main(string[] args){Console.WriteLine("你好,C#的世界!");}}
}
这行简单的输出,标志着你的C#旅程正式启航。
3. 变量、数据类型与控制流
-
在C#编程语言中,变量、数据类型和控制流是构建程序的基础元素。下面我将详细讲解这些概念,并提供一些示例代码来帮助理解。
1)变量
变量是存储数据的基本单元。在C#中,变量必须先声明后使用,并且需要指定其数据类型。
-
int age = 25; // 声明一个整数型变量age并赋值为25 string name = "Alice"; // 声明一个字符串型变量name并赋值为"Alice" double height = 1.75; // 声明一个双精度浮点型变量height并赋值为1.75
2)数据类型
C#支持多种数据类型,包括基本数据类型和复合数据类型。基本数据类型包括整数类型(如
int
)、浮点类型(如double
)、字符类型(如char
)和布尔类型(如bool
)。int number = 10; // 整数类型 double pi = 3.14159; // 双精度浮点类型 char letter = 'A'; // 字符类型 bool isTrue = true; // 布尔类型
3)控制流
控制流语句用于控制程序的执行流程,包括条件判断和循环操作。常见的控制流语句有
if
、for
、while
和switch
等。 -
4)条件判断(if语句)
if
语句用于根据条件执行不同的代码块。int x = 10; if (x > 5) {Console.WriteLine("x is greater than 5"); } else {Console.WriteLine("x is not greater than 5"); }
5)循环(for语句)
for
语句用于重复执行一段代码,直到满足特定条件为止。for (int i = 0; i < 5; i++) {Console.WriteLine("Iteration " + i); }
6)循环(while语句)
while
语句用于在条件为真时重复执行一段代码。int count = 0; while (count < 5) {Console.WriteLine("Count is " + count);count++; }
7)选择(switch语句)
switch
语句用于根据变量的值执行不同的代码块。int day = 3; switch (day) {case 1:Console.WriteLine("Monday");break;case 2:Console.WriteLine("Tuesday");break;case 3:Console.WriteLine("Wednesday");break;default:Console.WriteLine("Other day");break; }
第二部分:面向对象编程(OOP)——构建模块化的代码世界
C# 是一种面向对象的编程语言,类和对象是其核心概念。类是对象的蓝图或模板,而对象是类的实例。下面我将详细讲解 C# 中的类与对象。
1、类 (Class)
类是用户定义的数据类型,它包含数据成员(字段)和函数成员(方法、属性、事件等)。类定义了对象的结构和行为。
示例:
public class Person
{// 字段private string name;private int age;// 构造函数public Person(string name, int age){this.name = name;this.age = age;}// 属性public string Name{get { return name; }set { name = value; }}public int Age{get { return age; }set { age = value; }}// 方法public void SayHello(){Console.WriteLine($"Hello, my name is {name} and I am {age} years old.");}
}
2、对象 (Object)
对象是类的实例,通过类创建对象的过程称为实例化。对象可以访问类中定义的字段、属性和方法。
对象的创建与使用
示例:
class Program
{static void Main(){// 创建对象Person person = new Person("Alice", 30);// 访问属性Console.WriteLine(person.Name); // 输出: AliceConsole.WriteLine(person.Age); // 输出: 30// 调用方法person.SayHello(); // 输出: Hello, my name is Alice and I am 30 years old.// 修改属性person.Name = "Bob";person.Age = 25;// 再次调用方法person.SayHello(); // 输出: Hello, my name is Bob and I am 25 years old.}
}
3、构造函数 (Constructor)
构造函数是类的一种特殊方法,用于初始化对象。构造函数与类同名,没有返回类型。
示例:
public class Person
{private string name;private int age;// 构造函数public Person(string name, int age){this.name = name;this.age = age;}// 其他成员省略...
}
4、属性 (Property)
属性提供了一种访问和修改字段的机制,它包含 get 和 set 访问器。
示例:
public class Person
{private string name;private int age;public string Name{get { return name; }set { name = value; }}public int Age{get { return age; }set { age = value; }}// 其他成员省略...
}
5、方法 (Method)
方法是类中定义的函数,用于执行特定的操作。
示例:
public class Person
{private string name;private int age;public void SayHello(){Console.WriteLine($"Hello, my name is {name} and I am {age} years old.");}// 其他成员省略...
}
6、继承 (Inheritance)
继承是面向对象编程的一个重要特性,它允许一个类继承另一个类的字段和方法。
示例:
public class Student : Person
{private string studentId;public Student(string name, int age, string studentId) : base(name, age){this.studentId = studentId;}public string StudentId{get { return studentId; }set { studentId = value; }}public void Study(){Console.WriteLine($"{Name} with student ID {studentId} is studying.");}
}class Program
{static void Main(){Student student = new Student("Alice", 20, "12345");student.SayHello(); // 输出: Hello, my name is Alice and I am 20 years old.student.Study(); // 输出: Alice with student ID 12345 is studying.}
}
7、封装 (Encapsulation)
封装是将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节。C# 通过访问修饰符(如 private
、public
、protected
)来实现封装。
示例:
public class Person
{private string name;private int age;public string Name{get { return name; }set { name = value; }}public int Age{get { return age; }set { age = value; }}// 其他成员省略...
}
通过这些示例,你可以看到 C# 中类与对象的基本概念和用法。类是对象的蓝图,而对象是类的实例。类定义了对象的结构和行为,而对象是类的具体实现。继承、封装和多态是面向对象编程的三大特性,它们在 C# 中得到了很好的支持。
第三部分:高级特性——解锁更高效、更优雅的编程技巧
1、 泛型与集合
C# 中的泛型和集合是两个非常重要的概念,它们极大地增强了代码的灵活性和可重用性。下面我将详细讲解这两个概念。
泛型 (Generics)
泛型允许你在定义类、接口、方法或委托时使用类型参数,从而使这些类型或方法可以在不指定具体类型的情况下工作。泛型提高了代码的重用性,增强了类型安全性,并减少了类型转换的需要。
1)泛型类
示例:
public class GenericClass<T>
{private T _value;public GenericClass(T value){_value = value;}public T GetValue(){return _value;}
}class Program
{static void Main(){GenericClass<int> intGeneric = new GenericClass<int>(10);Console.WriteLine(intGeneric.GetValue()); // 输出: 10GenericClass<string> stringGeneric = new GenericClass<string>("Hello");Console.WriteLine(stringGeneric.GetValue()); // 输出: Hello}
}
2)泛型方法
示例:
public class GenericMethod
{public static void Print<T>(T value){Console.WriteLine(value);}
}class Program
{static void Main(){GenericMethod.Print(10); // 输出: 10GenericMethod.Print("Hello"); // 输出: Hello}
}
3)泛型约束
你可以通过泛型约束来限制类型参数必须满足的条件。
示例:
public class GenericClassWithConstraint<T> where T : IComparable<T>
{private T _value;public GenericClassWithConstraint(T value){_value = value;}public T GetValue(){return _value;}public bool IsGreaterThan(T other){return _value.CompareTo(other) > 0;}
}class Program
{static void Main(){GenericClassWithConstraint<int> intGeneric = new GenericClassWithConstraint<int>(10);Console.WriteLine(intGeneric.IsGreaterThan(5)); // 输出: True}
}
集合 (Collections)
C# 提供了多种集合类型,用于存储和操作一组对象。这些集合类型包括数组、列表、队列、栈、字典等。
4)数组 (Array)
数组是最基本的集合类型,它具有固定大小。
示例:
int[] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;foreach (int number in numbers)
{Console.WriteLine(number);
}
5)列表 (List)
列表是一种动态数组,它的大小可以动态调整。
示例:
using System.Collections.Generic;List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
numbers.Add(5);foreach (int number in numbers)
{Console.WriteLine(number);
}
6)队列 (Queue)
队列是一种先进先出 (FIFO) 的数据结构。
示例:
using System.Collections.Generic;Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);while (queue.Count > 0)
{Console.WriteLine(queue.Dequeue());
}
7)栈 (Stack)
栈是一种后进先出 (LIFO) 的数据结构。
示例:
using System.Collections.Generic;Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);while (stack.Count > 0)
{Console.WriteLine(stack.Pop());
}
8)字典 (Dictionary)
字典是一种键值对集合,可以通过键快速查找值。
示例:
using System.Collections.Generic;Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("one", 1);
dictionary.Add("two", 2);
dictionary.Add("three", 3);foreach (var item in dictionary)
{Console.WriteLine($"{item.Key}: {item.Value}");
}
9)泛型集合
泛型集合是 C# 中推荐的集合类型,因为它们提供了类型安全性和性能优势。
示例:
using System.Collections.Generic;List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
Queue<string> queue = new Queue<string>();
queue.Enqueue("first");
queue.Enqueue("second");
Stack<double> stack = new Stack<double>();
stack.Push(1.1);
stack.Push(2.2);
Dictionary<int, string> dictionary = new Dictionary<int, string>
{{ 1, "one" },{ 2, "two" },{ 3, "three" }
};foreach (int number in numbers)
{Console.WriteLine(number);
}while (queue.Count > 0)
{Console.WriteLine(queue.Dequeue());
}while (stack.Count > 0)
{Console.WriteLine(stack.Pop());
}foreach (var item in dictionary)
{Console.WriteLine($"{item.Key}: {item.Value}");
}
通过这些示例,你可以看到泛型和集合在 C# 中的强大功能和灵活性。它们是现代 C# 编程中不可或缺的工具。
2、 异常处理
try
{// 尝试访问数组越界int[] arr = { 1, 2, 3 };Console.WriteLine(arr[3]);
}
catch (IndexOutOfRangeException ex)
{Console.WriteLine("数组越界:" + ex.Message);
}
使用try-catch
捕获并处理异常,增强程序的健壮性。
3、Lambda表达式与LINQ
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{Console.WriteLine(num);
}
Lambda表达式让代码更简洁,LINQ则提供了查询数据的强大工具集。
第四部分:并发编程——在多核时代乘风破浪
1、 多线程与并发
C# 多线程与并发编程技术是现代软件开发中的重要组成部分,它允许开发者创建高效、响应迅速的应用程序。以下是对C#中多线程与并发编程技术的详细介绍:
1)线程基础
在C#中,线程是执行代码的基本单元。可以使用 System.Threading.Thread
类来创建和管理线程。
示例:
using System;
using System.Threading;class Program
{static void Main(){Thread thread = new Thread(new ThreadStart(DoWork));thread.Start();Console.WriteLine("Main thread continues.");}static void DoWork(){Console.WriteLine("Worker thread is running.");}
}
2)线程池
线程池是一种管理线程的机制,它可以重用线程,减少线程创建和销毁的开销。可以使用 ThreadPool
类来使用线程池。
示例:
using System;
using System.Threading;class Program
{static void Main(){ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));Console.WriteLine("Main thread continues.");Thread.Sleep(1000); // 等待工作线程完成}static void DoWork(object state){Console.WriteLine("Worker thread from thread pool is running.");}
}
3)任务并行库 (TPL)
任务并行库 (Task Parallel Library, TPL) 是 .NET Framework 4.0 引入的一个库,它提供了更高级别的抽象来处理并发和并行编程。
示例:
using System;
using System.Threading.Tasks;class Program
{static void Main(){Task task = Task.Run(() => DoWork());Console.WriteLine("Main thread continues.");task.Wait(); // 等待任务完成}static void DoWork(){Console.WriteLine("Task is running.");}
}
4)并行循环
TPL 还提供了并行循环的机制,如 Parallel.For
和 Parallel.ForEach
,它们可以自动并行化循环操作。
示例:
using System;
using System.Threading.Tasks;class Program
{static void Main(){Parallel.For(0, 10, i =>{Console.WriteLine($"Task {i} is running.");});}
}
5) 异步编程 (async/await)
异步编程模型 (async/await) 是 C# 5.0 引入的一种编程模式,它使得异步编程更加简单和直观。
示例:
using System;
using System.Threading.Tasks;class Program
{static async Task Main(){await DoWorkAsync();Console.WriteLine("Main thread continues.");}static async Task DoWorkAsync(){await Task.Delay(1000); // 模拟异步操作Console.WriteLine("Async task is completed.");}
}
2、 并发集合
.NET 提供了一些并发集合类,如 ConcurrentQueue
、ConcurrentStack
和 ConcurrentDictionary
,它们可以在多线程环境下安全地进行操作。
示例:
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;class Program
{static void Main(){ConcurrentQueue<int> queue = new ConcurrentQueue<int>();Task producer = Task.Run(() =>{for (int i = 0; i < 10; i++){queue.Enqueue(i);Console.WriteLine($"Enqueued {i}");}});Task consumer = Task.Run(() =>{int result;while (queue.TryDequeue(out result)){Console.WriteLine($"Dequeued {result}");}});Task.WaitAll(producer, consumer);}
}
3、 原子操作
原子操作是不可分割的操作,可以确保在多线程环境下操作的原子性。Interlocked
类提供了一些原子操作方法。
示例:
using System;
using System.Threading;class Program
{static int counter = 0;static void Main(){for (int i = 0; i < 10; i++){new Thread(IncrementCounter).Start();}}static void IncrementCounter(){int newValue = Interlocked.Increment(ref counter);Console.WriteLine($"Counter: {newValue}");}
}
通过这些技术和工具,C# 开发者可以有效地处理多线程和并发编程,创建高性能、高并发的应用程序。
4、委托与事件
public delegate void MessageHandler(string msg);
public class Publisher
{public event MessageHandler NewMessage;public void Publish(string message){NewMessage?.Invoke(message);}
}
委托机制允许你将方法作为参数传递,事件则是基于委托的通信方式,增强了组件之间的解耦。
5、 线程同步
- lock关键字:防止多个线程同时访问共享资源,避免数据竞争。
- 其他同步工具:如
Monitor
、Semaphore
等,提供了更细致的并发控制手段。1)lock
关键字lock
关键字用于确保在同一时刻只有一个线程可以进入代码的临界区。using System; using System.Threading;class Counter {private int count = 0;private readonly object lockObject = new object();public void Increment(){lock (lockObject){count++;Console.WriteLine($"Count: {count}");}} }class Program {static void Main(){var counter = new Counter();for (int i = 0; i < 10; i++){new Thread(counter.Increment).Start();}} }
在这个示例中,
lock
关键字确保了count
变量的自增操作是线程安全的。2)
Monitor
类Monitor
类提供了与lock
关键字类似的功能,但提供了更多的控制选项,如Wait
和Pulse
方法。using System; using System.Threading;class CounterWithMonitor {private int count = 0;private readonly object lockObject = new object();public void Increment(){Monitor.Enter(lockObject);try{count++;Console.WriteLine($"Count: {count}");}finally{Monitor.Exit(lockObject);}} }class Program {static void Main(){var counter = new CounterWithMonitor();for (int i = 0; i < 10; i++){new Thread(counter.Increment).Start();}} }
在这个示例中,
Monitor.Enter
和Monitor.Exit
方法用于确保count
变量的自增操作是线程安全的。3)
Semaphore
类Semaphore
类用于控制对一个或多个共享资源的并发访问。它可以限制同时访问资源的线程数量。using System; using System.Threading;class SemaphoreExample {private static Semaphore semaphore = new Semaphore(2, 2); // 允许2个线程同时访问public void AccessResource(int threadId){semaphore.WaitOne();try{Console.WriteLine($"Thread {threadId} is accessing the resource.");Thread.Sleep(1000); // 模拟资源访问时间}finally{Console.WriteLine($"Thread {threadId} is releasing the resource.");semaphore.Release();}} }class Program {static void Main(){var semaphoreExample = new SemaphoreExample();for (int i = 0; i < 5; i++){int threadId = i;new Thread(() => semaphoreExample.AccessResource(threadId)).Start();}} }
在这个示例中,
Semaphore
类限制了同时访问资源的线程数量为2个。通过这些示例,你可以看到如何在C#中使用不同的同步工具来确保线程安全。选择合适的同步工具取决于具体的应用场景和需求。
第五部分:实战演练——理论到实践的跨越
选择一个小型项目,如简单的图书管理系统、天气查询应用等,动手实践。从需求分析到编码实现,再到调试部署,每一步都是学习成长的机会。记得利用学到的所有知识:OOP设计、泛型集合、异常处理、多线程等,让理论在实践中开花结果。
结语
C#及其.NET平台是一个广阔且不断演进的技术宇宙。本文仅是入门与进阶的起点,鼓励你持续探索,如C# 10的新特性、Blazor WebAssembly、.NET MAUI跨平台开发等。参加社区讨论,阅读官方文档,不断实践,你将会发现C#不仅仅是一种语言,它是一种强大的工具,助你创造无限可能。现在,带着这份指南,开启你的C#编程征途吧!
相关文章:
C#编程技术指南:从入门到精通的全面教程
无论你是编程新手,还是想要深化.NET技能的开发者,本文都将为你提供一条清晰的学习路径,从C#基础到高级特性,每一站都配有详尽解析和实用示例,旨在帮助你建立坚实的知识体系,并激发你对C#及.NET生态的热情。…...
Redis+定式任务实现简易版消息队列
Redis是一个开源的内存中数据结构存储系统,通常被用作数据库、缓存和消息中间件。 Redis主要将数据存储在内存中,因此读写速度非常快。 支持不同的持久化方式,可以将内存中的数据定期写入磁盘,保证数据持久性。 redis本身就有自己…...
学习在 C# 中使用 Lambda 运算符
在 C# 中,lambda 运算符 > 同时用于 lambda 表达式和表达式体成员。 1. Lambda 表达式 Lambda 表达式是一种简洁的表示匿名方法(没有名称的方法)的方法。它使用 lambda 运算符 >,可以读作“转到”。运算符的左侧指定输入参…...
数据结构和算法,单链表的实现(kotlin版)
文章目录 数据结构和算法,单链表的实现(kotlin版)b站视频链接1.定义接口,我们需要实现的方法2.定义节点,表示每个链表节点。3.push(e: E),链表尾部新增一个节点4.size(): Int,返回链表的长度5.getValue(index: Int): E…...
Jdk17是否有可能代替 Jdk8
JDK发展历史和开源 2006年SUN公司开源JDK,成立OpenJDK组织。2009年Oracle收购SUN,加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致,但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本(LTS)…...
oca和 ocp有什么区别
OCA(Oracle Certified Associate)和OCP(Oracle Certified Professional)在Oracle的认证体系中是两种不同级别的认证,它们之间存在明显的区别。以下是对两者区别的详细解释: 认证级别: OCA&…...

煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答
煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…...
C++中的C++中的虚析构函数的作用和重要性
在C中,虚析构函数(virtual destructor)的作用和重要性主要体现在多态和继承的上下文中。了解这一点之前,我们先简要回顾一下多态和继承的基本概念。 继承与多态 继承:允许我们定义一个基类(也称为父类或超…...
机器学习 - 文本特征处理之 TF 和 IDF
TF(Term Frequency,词频)和IDF(Inverse Document Frequency,逆文档频率)是文本处理和信息检索中的两个重要概念,常用于计算一个词在文档中的重要性。下面是详细解释: TF(…...

因为自己淋过雨所以想给嵌入式撑把伞
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!新手学嵌入式,…...
《C++20设计模式》中单例模式
文章目录 一、前言二、饿汉式1、实现 三、懒汉式1、实现 四、最后 一、前言 单例模式定义: 单例模式(Singleton Pattern)是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点来访问这个实例。…...

前端技术(说明篇)
Introduction ##编写内容:1.前端概念梳理 2.前端技术种类 3.前端学习方式 ##编写人:贾雯爽 ##最后更新时间:2024/07/01 Overview 最近在广州粤嵌进行实习,项目名称是”基于Node实现多人聊天室“,主要内容是对前端界…...

带电池监控功能的恒流直流负载组
EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要,旨在实现最佳精度。作为一家客户至上的公司,我们继续尽我们所能应对供应链挑战,以提供出色的交货时间,大约是行业其他公司的一半。 交流负载组 我…...
关于Disruptor监听策略
Disruptor框架提供了多种等待策略,每种策略都有其适用的场景和特点。以下是这些策略的详细介绍及其适用场景: 1. BlockingWaitStrategy 特点: 使用锁和条件变量进行线程间通信,线程在等待时会进入阻塞状态,释放CPU资…...
大数据面试题之HBase(3)
HBase的预分区 HBase的热点问题 HBase的memstore冲刷条件 HBase的MVCC HBase的大合并与小合并,大合并是如何做的?为什么要大合并 既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase HBase和Phoenix的区别 HBase支…...
c#中赋值、浅拷贝和深拷贝
在 C# 编程中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用于复制对象的两种不同方式,它们在处理对象时有着重要的区别和适用场景。 浅拷贝(Shallow Copy) 浅拷贝是指创建一个新对…...

旧版st7789屏幕模块 没有CS引脚的天坑 已解决!!!
今天解决了天坑一个,大家可能有的人买的是st7789屏幕模块,240x240,1.3寸的 他标注的是老版,没有CS引脚,小崽子长这样: 这熊孩子用很多通用的驱动不吃,死活不显示,网上猛搜ÿ…...

激光粒度分析仪校准步骤详解:提升测量精度的秘诀
在材料科学、环境监测、医药研发等众多领域,激光粒度分析仪以其高精度、高效率的测量性能,成为了不可或缺的测试工具。然而,为了保持其测量结果的准确性和可靠性,定期校准是不可或缺的步骤。 接下来,佰德将为您详细介…...

独一无二的设计模式——单例模式(python实现)
1. 引言 大家好,今天我们来聊聊设计模式中的“独一无二”——单例模式。想象一下,我们在开发一个复杂的软件系统,需要一个全局唯一的配置管理器,或者一个统一的日志记录器;如果每次使用这些功能都要创建新的实例&…...

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!
可转债,全称是“可转化公司债券”,是上市公司为了融资,向社会公众所发行的一种债券,具有股票和债券的双重特点,投资者可以选择按照发行时约定的价格将债券转化成公司一般股票,也可作为债券持有到期后收取本…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...