C# 多线程
在 C# 中,多线程编程允许你同时执行多个线程,使得程序能够更有效地利用计算资源。C# 提供了多种方式来实现多线程,其中包括使用 Thread 类、ThreadPool、Task Parallel Library(TPL)等。以下是使用 Thread 类创建和管理线程的基本示例:using System;using System.Threading;class Program{ static void Main() { // 创建一个新线程并启动 Thread thread = new Thread(new ThreadStart(ThreadMethod)); thread.Start(); // 主线程的操作 for (int i = 0; i < 5; i++) { Console.WriteLine("Main Thread: " + i); Thread.Sleep(1000); // 休眠1秒,模拟其他耗时操作...
C# 不安全代码
在 C# 中,"不安全代码" 是一种允许直接使用指针和绕过一些安全检查的编码模式。使用不安全代码可以提高性能,但也增加了代码的复杂性和潜在的安全风险。通常情况下,C# 是一种类型安全的语言,但不安全代码块允许开发者在需要的情况下绕过这些类型安全的特性。以下是使用不安全代码的基本示例:using System;class Program{ static unsafe void Main() { int x = 10; // 使用不安全代码块 unsafe { int* p = &x; Console.WriteLine("Value at address {0}: {1}", (int)p, *p); // 修改内存中的值 *p = 20; Console.WriteLine("Updated value at address {0}: {1}"...
C# 匿名方法
C# 中的匿名方法是一种允许你在没有显式定义方法的情况下创建方法体的方式。它通常用于委托(Delegate)的实例化和传递,尤其是在事件处理和异步编程方面。匿名方法在 C# 2.0 中引入,后来被 Lambda 表达式所取代。以下是使用匿名方法的基本示例:using System;public delegate void MyDelegate(string message);class Program{ static void Main() { // 使用匿名方法实例化委托 MyDelegate myDelegate = delegate(string msg) { Console.WriteLine("Anonymous Method: " + msg); }; // 调用委托 myDelegate("Hello, Anonymous Method!"); }}在上述例子中,我们定义了一个匿名方法,该方法与委托的签名相匹配...
C# 泛型(Generic)
在 C# 中,泛型(Generic)是一种强类型参数化的编程特性,允许你编写具有通用性的代码,而不必在编写代码时指定具体的数据类型。泛型提供了更灵活、类型安全和可重用的代码。以下是 C# 泛型的基本概念和用法:1. 泛型类(Generic Class):public class GenericClass<T>{ private T genericField; public GenericClass(T value) { genericField = value; } public T GetValue() { return genericField; }}在上述例子中,GenericClass<T> 是一个泛型类,T 是类型参数。通过使用 T,你可以创建一个可以用于不同类型的字段和方法的通用类。2. 泛型方法(Generic Method):public T GenericMethod<T>(T value){ // 执行一些操作 return value;}在上述例子...
C# 集合(Collection)
在C#中,集合(Collection)是一组对象的容器,用于存储、检索和操作数据。C# 提供了多种内置的集合类型,每种类型都有其特定的用途和性能特性。以下是一些常用的C#集合类型:1. 数组(Array):数组是一种最简单的集合类型,用于存储固定大小的元素序列。int[] numbers = new int[] { 1, 2, 3, 4, 5 };2. 列表(List):List<T> 是动态数组,可以根据需要动态调整大小。List<int> numberList = new List<int> { 1, 2, 3, 4, 5 };3. 集合(Collection):Collection<T> 是一个抽象基类,可以派生出各种集合类型,如 List<T>。Collection<int> numberCollection = new Collection<int> { 1, 2, 3, 4, 5 };4. 字典(Dictionary):Dictionary<TKey, TValue> 是一种键值...
C# 事件(Event)
在C#中,事件(Event)是一种特殊的委托,用于实现基于发布-订阅模式的通信机制。事件提供了一种在类之间进行松耦合通信的方式,允许一个类(发布者)通知其他类(订阅者)发生了某个特定的动作。以下是关于C#事件的基本概念和用法:1. 定义事件:// 声明事件的委托public delegate void MyEventHandler(object sender, EventArgs e);// 声明包含事件的类public class MyClass{ // 定义事件 public event MyEventHandler MyEvent; // 触发事件的方法 protected virtual void OnMyEvent() { MyEvent?.Invoke(this, EventArgs.Empty); } // 其他类可以调用这个方法来触发事件 public void DoSomething() { // 做一些事情... // 触发事件 OnMyEvent(); ...
C# 委托(Delegate)
C# 中的委托(Delegate)是一种类型,用于表示对方法的引用。它可以用于将方法作为参数传递给其他方法,或者用于定义和调用回调函数。委托是一种类型安全的函数指针。以下是一些基本的委托概念和用法:1. 定义委托:// 定义一个委托public delegate void MyDelegate(string message);// 委托的方法签名需要与被引用的方法相匹配2. 实例化委托:// 实例化委托并与方法关联MyDelegate myDelegate = new MyDelegate(MyMethod);3. 定义委托引用的方法:// 被委托引用的方法static void MyMethod(string message){ Console.WriteLine("MyMethod: " + message);}4. 调用委托:// 通过委托调用方法myDelegate("Hello, Delegate!");5. 多播委托(Multicast Delegate):// 可以将多个方法添加到同一个委托上,形成多播委托myDelegate...
C# 索引器(Indexer)
C# 中的索引器(Indexer)允许你通过类的实例使用类似数组的语法来访问对象的元素。索引器允许类的实例像数组一样进行索引,但是它们可以定义自己的索引规则。索引器在类中使用 this 关键字定义,并且可以具有一个或多个参数,用于指定索引的位置。下面是一个简单的例子,演示如何在C#中使用索引器:using System;class MyCollection{ private string[] data = new string[5]; // 定义索引器 public string this[int index] { get { if (index >= 0 && index < data.Length) return data[index]; else return "Index out of bounds"; } set { ...
C# 属性(Property)
C# 中的属性(Property)是一种特殊的类成员,用于封装一个类的字段(field)或计算得出的值。属性通常用于访问对象的状态或行为。在C#中,属性可以分为只读属性(只有 get 访问器)和读写属性(同时包含 get 和 set 访问器)。下面是一个简单的例子,展示如何在C#中定义和使用属性:using System;class Person{ // 私有字段 private string name; // 属性定义 public string Name { get { return name; } set { name = value; } } // 自动属性(简化写法,不需要私有字段) public int Age { get; set; } // 只读属性 public string Introduction { get { return $"My name is {Name} and I am {Age} years old."; } }}c...
C# 反射(Reflection)
在C#中,反射(Reflection)是一种强大的机制,允许在运行时获取程序集、模块、类型和成员的信息,并且可以创建、调用和操作对象,以及在运行时动态地检查和修改代码。以下是一些关于C#反射的基本概念:获取类型信息:using System;class Program{ static void Main() { // 获取类型信息 Type type = typeof(MyClass); // 输出类型的名称 Console.WriteLine("Type Name: " + type.FullName); // 获取类型的成员信息 foreach (var memberInfo in type.GetMembers()) { Console.WriteLine("Member: " + memberInfo.Name); } }}class MyClass{ public int MyPr...
C# 特性(Attribute)
在C#中,特性(Attribute)是一种声明性标记,用于为程序中的元素(如类、方法、属性等)提供元数据。特性可以用于提供有关程序结构和元素的额外信息,这些信息可以在运行时或设计时用于不同的目的。以下是一些关于C#特性的基本概念:创建和使用特性:using System;// 自定义特性类[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class MyCustomAttribute : Attribute{ public string Description { get; } public MyCustomAttribute(string description) { Description = description; }}// 使用特性[MyCustom("This is a class with a custom attribute")]class MyClass{ [MyC...
C# 文件的输入与输出
在C#中,文件的输入和输出通常涉及到 System.IO 命名空间中的类和方法。以下是一些基本的文件输入和输出操作:文件写入(File Output):使用 StreamWriter 类可以方便地向文件中写入数据。以下是一个简单的文件写入示例:using System;using System.IO;class Program{ static void Main() { // 指定文件路径 string filePath = "example.txt"; // 使用 StreamWriter 写入文件 using (StreamWriter writer = new StreamWriter(filePath)) { writer.WriteLine("Hello, World!"); writer.WriteLine("This is a C# file write example."); ...
C# 异常处理
在C#中,异常处理是一种机制,用于在程序执行过程中检测和响应错误。异常处理使得程序能够优雅地处理错误情况,而不是直接中断程序执行。以下是C#中异常处理的基本概念:1. 抛出异常(Throwing Exceptions): 当在程序中发生错误或异常情况时,可以使用 throw 语句抛出一个异常。通常,异常是 Exception 类或其派生类的实例。 throw new Exception("This is an example exception.");2. 捕获异常(Catching Exceptions): 使用 try-catch 语句块来捕获并处理异常。在 try 块中编写可能引发异常的代码,然后在 catch 块中指定处理异常的代码。 try { // 有可能引发异常的代码 } catch (Exception ex) { // 处理异常的代码 Console.WriteLine("Exception caught: " + ex.Message); }3. finally ...
C# 正则表达式
在C#中,正则表达式是一种用于匹配、查找和替换字符串的强大工具。System.Text.RegularExpressions 命名空间提供了正则表达式的支持。以下是一些基本的正则表达式操作:1. 创建正则表达式对象: using System; using System.Text.RegularExpressions; class Program { static void Main() { // 创建正则表达式对象 Regex regex = new Regex(@"\d+"); // 匹配字符串 Match match = regex.Match("12345"); // 输出匹配结果 if (match.Success) { Console.WriteLine("Match: " + match.Value); ...
C# 预处理器指令
在C#中,预处理器指令是一种用于在编译时处理源代码的指令。这些指令以 # 符号开头,用于控制编译过程中的一些条件和行为。以下是一些常用的C#预处理器指令:1. #define 和 #undef: 用于定义和取消定义符号。 #define DEBUG #undef DEBUG2. #if、#elif、#else 和 #endif: 用于条件编译,根据指定的条件决定是否包含或排除代码块。 #if DEBUG Console.WriteLine("Debug version"); #elif RELEASE Console.WriteLine("Release version"); #else Console.WriteLine("Undefined version"); #endif3. #warning 和 #error: 分别用于生成警告和错误消息。 #warning This is a warning message #error This is an er...
C# 命名空间(Namespace)
在C#中,命名空间(Namespace)是用于组织和管理代码的一种机制。它允许开发者将相关的类、接口、结构体等组织到一起,以避免命名冲突,并提供更好的代码结构和可维护性。以下是一个简单的C#命名空间的示例:using System;// 命名空间的声明namespace MyNamespace{ // 类的声明在命名空间内 public class MyClass { public void PrintMessage() { Console.WriteLine("Hello from MyNamespace.MyClass"); } } // 嵌套的命名空间 namespace SubNamespace { // 嵌套命名空间中的类 public class MySubClass { public void PrintMessage() { Con...
C# 接口(Interface)
在C#中,接口(Interface)是一种用于定义一组相关方法和属性的抽象类型。接口为类提供了一种实现特定功能的契约,类通过实现接口来表明它们具有某些行为。以下是一个简单的C#接口的示例:using System;// 定义一个简单的接口public interface IShape{ // 接口的方法 void Draw(); // 接口的属性 string Name { get; set; }}// 实现接口的类public class Circle : IShape{ // 实现接口的方法 public void Draw() { Console.WriteLine("Drawing a circle"); } // 实现接口的属性 public string Name { get; set; }}public class Square : IShape{ // 实现接口的方法 public void Draw() { Console.WriteLine(...
C# 运算符重载
在C#中,运算符重载是一种机制,允许用户定义类或结构的实例在使用内置运算符时执行自定义的操作。通过运算符重载,可以使自定义类型的对象支持与内置类型相似的语法和行为。以下是一个简单的C#运算符重载的示例:using System;// 自定义复数类public class Complex{ // 复数的实部和虚部 public double Real { get; set; } public double Imaginary { get; set; } // 构造函数 public Complex(double real, double imaginary) { Real = real; Imaginary = imaginary; } // 重载 + 运算符 public static Complex operator +(Complex a, Complex b) { return new Complex(a.Real + b.Real, a.Imaginary + b.Imagin...
C# 多态性
在C#中,多态性是面向对象编程的一个重要概念,它允许不同类的对象对相同的消息(方法调用)作出不同的响应。多态性有两种形式:编译时多态性(静态多态性,也称为早期绑定)和运行时多态性(动态多态性,也称为晚期绑定)。以下是一个简单的C#多态性的示例:using System;// 基类public class Shape{ // 虚方法 public virtual void Draw() { Console.WriteLine("Drawing a shape"); }}// 派生类1public class Circle : Shape{ // 重写基类的方法 public override void Draw() { Console.WriteLine("Drawing a circle"); }}// 派生类2public class Square : Shape{ // 重写基类的方法 public override void Draw() { ...
C# 继承
在C#中,继承是一种面向对象编程的重要概念,允许一个类(派生类)从另一个类(基类)继承属性和方法。派生类可以重用基类的代码,并添加、修改或扩展其功能。以下是一个简单的C#继承的示例:using System;// 基类public class Animal{ // 基类的字段 protected string name; // 基类的构造函数 public Animal(string n) { name = n; } // 基类的方法 public void Eat() { Console.WriteLine($"{name} is eating."); } // 基类的虚方法 public virtual void MakeSound() { Console.WriteLine($"{name} makes a generic sound."); }}// 派生类public class Dog : Animal{ ...