C# Dictionary(字典)的用法
在C#中,Dictionary<TKey, TValue> 类是一个常用的泛型集合,用于存储键值对。以下是Dictionary的一些基本用法:1. 创建和初始化:Dictionary<string, int> ageDictionary = new Dictionary<string, int>();// 或者使用初始化器Dictionary<string, string> countryCapitalDictionary = new Dictionary<string, string>{ {"USA", "Washington, D.C."}, {"India", "New Delhi"}, {"France", "Paris"}};2. 添加和访问元素:// 添加元素ageDictionary.Add("John", 25);ageDictionary["A...
c#随机数生成方法
在C#中,生成随机数的常用方法是使用 Random 类。以下是使用 Random 类生成随机数的几种方式:1. 使用 Random.Next 方法:Random.Next 方法用于生成一个非负的随机整数。Random random = new Random();// 生成一个介于0和Int32.MaxValue之间的随机整数int randomNumber = random.Next();Console.WriteLine(randomNumber);如果需要生成指定范围内的随机整数,可以使用重载的 Next 方法:// 生成一个介于1和100之间的随机整数int randomNumberInRange = random.Next(1, 101);Console.WriteLine(randomNumberInRange);2. 使用 Random.NextDouble 方法:Random.NextDouble 方法用于生成一个介于0.0(包括)和1.0(不包括)之间的随机浮点数。double randomDouble = random.NextDouble();Console.Wri...
C#四舍五入的几种方法
在C#中,有几种方法可以进行四舍五入。以下是其中一些常见的方法:1. Math.Round 方法:Math.Round 方法用于将一个数字舍入到最接近的整数或指定小数位数的值。默认情况下,它使用“银行家舍入法”(Round Half To Even),也就是四舍六入五成双。double number = 3.14159;double roundedNumber = Math.Round(number, 2); // 将小数保留两位Console.WriteLine(roundedNumber); // 输出: 3.142. 使用自定义方法:如果需要手动实现四舍五入,可以使用自定义的方法,例如将小数加上0.5后进行取整:double number = 3.14159;double roundedNumber = CustomRound(number, 2); // 将小数保留两位Console.WriteLine(roundedNumber); // 输出: 3.14static double CustomRound(double value, int decimalPlaces){ ...
c#进度条实现方法
在C#中,实现进度条通常需要使用UI库(如WinForms、WPF)来创建界面,并使用相应的控件来表示进度条。以下是两个简单的示例,分别基于WinForms和WPF:1. 使用 WinForms:using System;using System.Threading;using System.Windows.Forms;public class MainForm : Form{ private ProgressBar progressBar; private Button startButton; public MainForm() { InitializeComponents(); } private void InitializeComponents() { progressBar = new ProgressBar { Minimum = 0, Maximum = 100, Dock = DockStyle.Top }...
C#递归算法计算阶乘的方法
递归是一种通过调用自身的函数来解决问题的方法。计算阶乘是一个经典的递归问题,下面是一个使用C#编写的计算阶乘的递归算法示例:using System;class Program{ static void Main() { int n = 5; // 要计算阶乘的数 // 调用递归函数计算阶乘 long result = Factorial(n); Console.WriteLine($"阶乘 {n} 的结果是: {result}"); Console.ReadLine(); } // 递归函数计算阶乘 static long Factorial(int n) { // 基本情况:0的阶乘为1 if (n == 0) return 1; // 递归情况:n的阶乘为n乘以(n-1)的阶乘 return n * Factorial(n - 1); }}在上述代码中,Factorial ...
C#读取Excel的方法总结
在C#中,读取Excel文件的方法有多种,其中一些常见的方法包括使用OLEDB、EPPlus库和Microsoft.Office.Interop.Excel库。以下是对这些方法的简要总结:1. 使用 OLEDB 提供程序(适用于 .xls 和 .xlsx): 使用 ADO.NET 中的 OLEDB 提供程序可以读取 Excel 文件。这种方法适用于 .xls 和 .xlsx 文件。 using System.Data.OleDb; string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=YourExcelFile.xlsx;Extended Properties='Excel 12.0'"; using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); OleDbCommand ...
C# 多线程
在C#中,多线程编程是一种处理并发任务和提高程序性能的重要技术。C# 提供了多种方式来实现多线程编程,其中最常见的包括使用 Thread 类、ThreadPool、Task Parallel Library (TPL) 和 async/await 异步编程模型。1. 使用 Thread 类:using System;using System.Threading;class Program{ static void Main() { // 创建并启动新线程 Thread newThread = new Thread(WorkerMethod); newThread.Start(); // 主线程继续执行其他工作 for (int i = 0; i < 5; i++) { Console.WriteLine("Main Thread: " + i); Thread.Sleep(1000); } Co...
C# 不安全代码
在C#中,通常情况下,代码是类型安全的,这意味着编译器会强制执行类型规则,以防止访问无效的内存区域或进行不安全的操作。但是,有时候需要执行一些底层的操作,例如直接操作指针或使用未经验证的代码,这就需要使用不安全代码块。以下是一些使用不安全代码的情况:1. 指针操作: unsafe { int x = 10; int* ptr = &x; Console.WriteLine(*ptr); // 访问指针指向的值 }2. 固定语句: unsafe { int[] array = { 1, 2, 3, 4, 5 }; fixed (int* ptr = array) { // 在此处使用指针 ptr Console.WriteLine(ptr[0]); } }3. 使用 stackalloc 分配栈上内存: unsafe { int* buffer = stackalloc int[100]; // 在此处...
C# 匿名方法
在C#中,匿名方法是一种没有显式声明的方法,通常用于传递给委托或事件处理程序。匿名方法在需要一个简单的代码块时很有用,尤其是在委托中使用。匿名方法允许你在使用时内联定义一个方法而不必提前声明。以下是一个使用匿名方法的简单示例:using System;public delegate void MyDelegate(string message);class Program{ static void Main() { // 使用匿名方法初始化委托 MyDelegate myDelegate = delegate (string msg) { Console.WriteLine("匿名方法输出: " + msg); }; // 调用委托 myDelegate("Hello, World!"); Console.ReadLine(); }}在上面的例子中,MyDelegate 是一个接受字符串参数的委托。通过使用 d...
C# 泛型(Generic)
在C#中,泛型(Generic)是一种强类型编程的机制,允许你在编写代码时指定方法、类或接口的参数和返回值的类型,而不是在运行时指定。泛型提供了更高的代码重用性和类型安全性。以下是一些C#中泛型的基本用法和示例:1. 泛型方法:public class GenericMethods{ // 泛型方法 public T Display<T>(T value) { Console.WriteLine(value); return value; }}class Program{ static void Main() { GenericMethods genericMethods = new GenericMethods(); // 调用泛型方法,传递不同类型的参数 int intValue = genericMethods.Display(42); string stringValue = genericMethods.Display("...
C# 集合(Collection)
在C#中,集合(Collection)是一组对象的容器,用于存储、检索和操作数据。C#提供了多种集合类型,每种类型都有其独特的用途和特性。以下是一些常见的C#集合类型:1. List<T>(列表): - List<T> 是一个动态数组,可以动态增加或减少元素。 - 例子: List<int> numbers = new List<int>(); numbers.Add(1); numbers.Add(2);2. Dictionary<TKey, TValue>(字典): - Dictionary<TKey, TValue> 表示键值对的集合,通过键来检索值。 - 例子: Dictionary<string, int> ages = new Dictionary<string, int>(); ages["Alice"] = 25; ages["Bob"] = 30;3. HashSet&l...
C# 事件(Event)
C# 中的事件(Event)是一种特殊的委托(delegate)类型,用于实现发布者-订阅者模式。它允许一个类在特定的情况下通知其他类或对象,以便它们可以执行相应的操作。以下是一个简单的示例,演示了如何在 C# 中使用事件:using System;// 定义事件发布者类public class Publisher{ // 定义委托类型 public delegate void MyEventHandler(object sender, EventArgs e); // 声明事件 public event MyEventHandler MyEvent; // 触发事件的方法 public void RaiseEvent() { Console.WriteLine("触发事件"); // 检查是否有订阅者,并调用事件 MyEvent?.Invoke(this, EventArgs.Empty); }}// 定义事件订阅者类public class Subscriber{ /...
C# 委托(Delegate)
在 C# 中,委托(Delegate)是一种类型安全的对象,它引用一个或多个方法,并允许你调用这些方法。委托提供了一种方式来引用方法,使得可以将方法作为参数传递给其他方法或存储对方法的引用。以下是关于 C# 委托的基本知识:定义委托// 定义一个委托类型public delegate void MyDelegate(string message);class Program{ static void Main() { // 创建委托实例并关联方法 MyDelegate myDelegate = new MyDelegate(PrintMessage); // 调用委托,实际上调用了关联的方法 myDelegate("Hello, delegates!"); } static void PrintMessage(string message) { Console.WriteLine(message); }}在上述例子中,MyDelegate 是一个委托类型,它可以...
C# 索引器(Indexer)
C# 索引器(Indexer)是一种特殊的成员,允许类或结构定义类似数组的访问方式。索引器允许你通过类似数组下标的方式访问对象的元素。以下是关于 C# 索引器的基本知识:基本索引器class MyCollection{ private string[] data = new string[10]; // 索引器 public string this[int index] { get { return data[index]; } set { data[index] = value; } }}class Program{ static void Main() { MyCollection collection = new MyCollection(); // 使用索引器设置值 collection[0] = "Item 1"; // 使用索引器获取值 string value = collection[0]; Con...
C# 属性(Property)
在C#中,属性(Property)是一种特殊的成员,它允许在类中定义用于访问对象的值的成员。属性通常用于封装类的字段(Field)或提供计算得到的值,以便以一致的方式访问和修改数据。以下是关于 C# 属性的一些基本知识:基本属性class Person{ private string name; // 属性 public string Name { get { return name; } set { name = value; } }}在这个例子中,Person 类有一个 Name 属性,它对私有字段 name 进行了封装,允许通过 get 和 set 方法访问和修改 name 的值。自动属性class Person{ // 自动属性 public string Name { get; set; }}自动属性是一种简化的语法,它不需要显式地定义私有字段,编译器会在背后自动生成一个匿名的字段。只读属性class Circle{ private double radius; // 只读属性 publi...
C# 反射(Reflection)
反射(Reflection)是 C# 中一种强大的机制,允许在运行时检查和操纵程序集、类型和对象。通过反射,你可以动态地获取类型信息、调用方法、创建对象,以及访问和修改成员等。以下是一些基本的反射用法:1. 获取类型信息: using System; class Program { static void Main() { Type type = typeof(string); // 获取类型信息 Console.WriteLine("Type: " + type.FullName); // 获取类型的成员信息 foreach (var memberInfo in type.GetMembers()) { Console.WriteLine("Member: " + memberInfo.Name); } } }2. 创建对象: using Sy...
C# 特性(Attribute)
在C#中,特性(Attributes)是一种声明式的信息,用于添加元数据(metadata)到程序的源代码中。特性可以应用于程序元素(如类、方法、属性等),并且可以在运行时通过反射来检索这些信息。特性通常用于提供关于代码的附加信息,以及在运行时进行自定义处理。以下是一些关于 C# 特性的基本知识:1. 定义特性: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class MyCustomAttribute : Attribute { public string Description { get; set; } public MyCustomAttribute(string description) { Description = description; } } 在上述例子中,MyCustomAttribute 是一个自定义特性类,它继承自 Attribute 类。2. 应用特性: [MyCu...
C# 高级教程
C# 是一门多范式、面向对象的编程语言,具有强类型、静态类型的特性。下面是一些 C# 的高级主题,可以帮助你深入了解和使用该语言的一些更高级的功能:1. 异步编程(Asynchronous Programming): - C# 5.0 引入了 async 和 await 关键字,用于简化异步编程。这使得编写异步代码更加清晰和易于理解。 async Task<string> DownloadDataAsync() { HttpClient client = new HttpClient(); string result = await client.GetStringAsync("https://example.com"); return result; }2. LINQ(Language-Integrated Query): - LINQ 是一种在 C# 中进行数据查询的语言集成查询技术。它允许你使用类似 SQL 的查询语法来查询对象、集合和其他数据源。 var query = from stu...
C# 文件的输入与输出
在C#中进行文件的输入和输出通常使用 System.IO 命名空间下的类。以下是一些基本的文件输入输出操作:文件写入(Output)使用 StreamWriter 写入文本文件:using System;using System.IO;class Program{ static void Main() { string filePath = "example.txt"; using (StreamWriter writer = new StreamWriter(filePath)) { writer.WriteLine("Hello, world!"); writer.WriteLine("This is a new line."); } }}文件读取(Input)使用 StreamReader 读取文本文件:using System;using System.IO;class Program{ stat...
C# 异常处理
在C#中,异常处理是通过使用try、catch、finally和throw关键字来实现的。以下是基本的异常处理结构:1. try-catch 块: try { // 代码块,可能会引发异常 int result = Divide(10, 0); } catch (DivideByZeroException ex) { // 捕获 DivideByZeroException 异常 Console.WriteLine("Error: " + ex.Message); } catch (Exception ex) { // 捕获所有其他类型的异常 Console.WriteLine("Error: " + ex.Message); }2. finally 块: try { // 代码块,可能会引发异常 } catch (Exception ex) { // 异常处理 } finally { ...