C# 序列化与反序列化 当对象数据需在应用间移动或跨会话持久化时,序列化与反序列化必不可少。C# 中序列化将对象状态写入存储介质(常为文件),反序列化从存储表示重建对象。 以简单类 Tutorial 为例,包含 ID 和 Name 两属性。将实例序列化到文件,稍后读取文件重建对象,原始数据完好保留。 如何在 C# 中序列化对象 下面分步演示控制台应用中的过程。 创建带 ID 和 Name 属性的 Tutorial 类。 实例化类,赋值 ID = 1、Name = .Net。 将对象序列化到 Example.txt。 从文件反序列化对象并在控制台显示值。 将以下代码粘贴到 Program.
在 C# 文件 I/O 中,流作为应用程序与底层文件系统的中介。它们以内存高效方式读写文件,尤其处理大数据集时。 不将整个 100 MB 文件加载到内存(导致应用冻结),流将数据分块处理。这种方式保持性能平滑、防止崩溃。 下面通过简明示例演示如何使用 StreamReader 和 StreamWriter 读写文件。按分步说明将这些模式集成到你的项目中。 StreamReader – 读取文件 StreamReader 类逐行读取文本文件,数据经缓冲区传递给应用处理。 假设 D 盘有 Example.txt,包含两行: Guru99 – .Net Guru99 – C# 创建控制台应用,
C# 文件操作实战指南 在 C# 和 .NET 中处理文件是常见需求。无论验证文件存在、读取内容、管理文件复制,System.IO.File 类提供直观、线程安全的方法。下面给出简明解释和遵循最佳实践及微软官方指导的示例代码。 基本文件操作 读取 – 从现有文件检索数据。 写入 – 用新内容覆盖整个文件(默认行为)。 追加 – 在不删除现有内容情况下向文件末尾添加数据。 覆盖的关键方法 File.Exists – 检查文件是否存在。 File.ReadAllLines – 将所有行加载到字符串数组。 File.ReadAllText – 将整个文件加载为单个字符串。 File.Cop
数据库操作是 C# 开发者核心技能。本指南演示如何连接 Microsoft SQL Server、执行查询并将数据绑定到 Windows Forms 控件。 数据库连接基础 无论使用 Oracle、MySQL、MongoDB 还是 Microsoft SQL Server,连接、查询、插入、更新、删除数据的流程一致。本教程聚焦 SQL Server,使用免费 SQL Server Express 版。 连接字符串 – 包含服务器名、数据库名、凭据。 凭据 – 拥有必要权限的用户名和密码。 可选参数 – 如连接超时、加密等。 C# 中的 SQL 命令 SqlCommand 类向数据库发送
C# Windows Forms 开发实战教程 掌握控制台应用后,下一步是使用 Visual Studio 的 Windows Forms 创建丰富桌面体验。本指南带你完成每个阶段——从项目设置到添加控件、连接事件,甚至引入 TreeView 和 PictureBox 等高级组件。 Windows Forms 基础 Windows Forms 应用原生运行在桌面机器上。包含可视化布局和一组控件(标签、文本框、列表框等)供用户交互。 下面是一个用 C# 创建的简单登录窗体: 示例关键元素: 描述相邻文本框的标签控件。 用户名和密码输入的文本框。 触发认证逻辑的按钮。 C# Hello
什么是 C# Hashtable? Hashtable 是非泛型集合,以键值对存储数据。不同于数组或列表每个索引仅存单值,哈希表允许通过唯一键直接检索值,提供 O(1) 平均查找时间。 典型条目如下: { 001, .Net } { 002, C# } { 003, ASP.Net } 此处键为 001、002、003,对应值为 .Net、C#、ASP.Net。 下面深入讲解 Hashtable 最常用操作。 声明 Hashtable 用 Hashtable 类型和 new 关键字实例化: Hashtable ht = new Hashtable(); 添加元素 用 Add 方法插入键值对
什么是 C# Queue? Queue 实现先进先出(FIFO)原则,如同等公交车的人行队列。最先添加的元素最先被处理或移除。 在 C# 中,队列定义在 System.Collections 命名空间,提供 Enqueue 和 Dequeue 方法镜像现实队列行为。 声明 Queue 用 Queue 类型和 new 关键字实例化队列: Queue qt = new Queue(); 添加元素(Enqueue) 用 Enqueue 将项追加到队列尾部: qt.Enqueue(1); 移除元素(Dequeue) Dequeue 方法移除并返回队列前端项: var first = qt.Deq
什么是 C# Stack? 栈是遵循后进先出(LIFO)原则的集合。想象一摞书:只能拿走最顶上的书。.NET Stack 类同理——用 Push 在顶部添加元素,用 Pop 从顶部移除元素。 声明 Stack 用 new 关键字实例化栈并赋给变量。 Stack st = new Stack(); 添加元素 – Push Push 方法将新元素放在栈顶。 st.Push(1); 移除元素 – Pop Pop 方法移除并返回栈顶元素。 var top = st.Pop(); 其他常用操作 Count – 获取栈中项目数。int total = st.Count; Contains – 检
什么是 C# ArrayList? ArrayList 集合属于 System.Collections,行为类似传统数组但支持动态调整大小。与静态数组不同,无需预先声明固定大小;可随时添加或移除元素。 声明 ArrayList 用 new 关键字实例化 ArrayList 并赋给变量。该变量成为访问和操作集合的句柄。 ArrayList a1 = new ArrayList(); 添加元素 Add 方法向列表追加任意对象,无论是 int、string、bool 还是自定义类型。 ArrayList.Add(element) 示例: a1.Add(1); – 添加整数。 a1.Add(Ex
前一教程已学习 C# 数组用法。快速回顾:数组用于对一组相关对象分组。可创建整数数组,通过单一变量名访问。 什么是 C# 集合? 集合与数组相似,提供更灵活的方式操作对象组。 数组需在声明时预先定义元素数量。但集合无需预定义大小,可随时添加或移除元素。本章聚焦 C# 中不同集合的使用。 System.Collections 类 集合说明 ArrayList类似 C# 数组,最大区别在于动态特性 Stack后进先出(LIFO)概念的特殊集合 Queue先进先出(FIFO)概念的特殊集合 Hashtable存储键值对的特殊集合 SortedList默认按键升序存储键值对的集合 BitA
什么是 C# 接口? 接口 在 C# 中是一份契约,定义一组成员——方法、属性、事件或索引器——类或结构体必须实现。它规定做什么而非怎么做,允许不同类型暴露相同操作集,同时隐藏实现细节。 接口促进松耦合、启用多态、支持类型定义的多重继承,是编写可测试、可维护代码的关键。 具体示例 下面是一个最小控制台程序,演示接口声明、实现和使用。 tutorialName; static void Main(string[] args) { var tutor = new Guru99Tutorial(); tutor.SetTutoria
什么是 C# 抽象类? 抽象类 作为其他类的蓝图。它永远不能直接实例化,标记为 abstract 关键字。抽象类通常包含一个或多个 abstract 或 virtual 方法,期望子类实现或重写。它们提供通用契约,同时允许具体子类提供特定行为。 考虑以下示例。我们先定义通用 Animal 类,不知动物是狗、猫还是其他。Description 方法是占位符,将由派生类特化。 当具体动物类型已知时,创建继承自 Animal 的子类如 Dog。Dog 类不能改变基类 Description 方法;而是提供自己的实现或添加如 DogDescription 的新方法。这演示了 C# 抽象类的核心概念:
什么是 C# 继承? 继承 是 C# 面向对象设计的基石。它让子类自动获得父类的字段和方法,同时允许子类覆盖或扩展这些行为。这促进代码复用、简化维护、建立清晰层级。 定义父类和子类。 子类继承父类成员。 子类可修改继承行为。 子类可添加自身成员。 C# 继承示例 下面分步演示如何实现继承并使用受保护成员。 步骤 1 – 修改基类 打开 Tutorial.cs 将 Tutorial 类的关键字段改为 protected: 使用 protected 确保仅派生类可直接访问这些字段。 步骤 2 – 创建派生类 在 Tutorial.cs 基类定义后追加以下代码: 说明: 用冒号(:)
什么是 C# 访问修饰符? 访问修饰符——控制类型和类型成员可见性的关键字——是 C# 封装的基石。它们决定哪些代码可以引用类、属性或方法,确保只有程序预期部分能与内部实现细节交互。 C# 提供六种访问修饰符: Private Public Protected Internal Protected Internal Private Protected 本教程你将学习: 访问修饰符是什么及其重要性 Private、Public、Protected、Internal 修饰符深度解析 构造函数如何初始化类字段 Private 访问修饰符 将成员标记为 private 将其用法限制在包含类内
C# 建立在 C++ 强大的面向对象基础之上。其内置的类和对象支持让开发者能用整洁、可维护的代码建模现实实体。 假设一个管理员工记录的应用。Employee 类将存储 ID 和 Name 等属性,并暴露添加或更新记录的方法。 本指南将教你: 理解类与对象的概念 在 Visual Studio 中创建类并实例化对象 使用字段、属性和方法 什么是类和对象? 类是封装数据(字段或属性)和行为(方法)的蓝图。对象是该蓝图的实例,持有字段的具体值。 在类中: 字段或属性描述类持有的数据。 方法定义可对这些数据执行的操作。 用一个简单例子说明。假设有 Tutorial 类表示学习模块。 类包含:
C# 中的数组是什么? 在 C# 中,数组是存储固定大小元素集合的数据结构,所有元素共享相同数据类型。 例如,整数数组可能包含 [1, 2, 3, 4],共存储四个元素。 当需要单个变量管理一组同类型值,而非为每个项声明单独变量时,数组是理想选择。 下面通过简单控制台应用演示整数数组的声明、初始化和使用。所有代码片段针对 Program.cs 文件。 步骤 1 – 声明数组 首先声明数组类型和名称。方括号表示数组秩(可容纳元素数量)。 代码解析 数据类型(Int32)指定元素类型。 方括号([])定义数组秩。 标识符(values)是数组变量名。 步骤 2 – 初始化数组 指定数组将
流程控制与条件语句 在现代编程语言中,流程控制结构决定代码块执行顺序。C# 中最常用的机制是 if、switch、while 和 for。熟练使用这些语句是编写整洁、可维护代码的关键。 本教程通过真实示例和简明解释逐一讲解。所有代码片段可直接粘贴到 Program.cs 运行。 你将学到: if 条件执行 switch 多路分支选择 while 迭代处理 for 受控重复 1) If 语句 if 语句求值布尔表达式。表达式为真时执行一块代码,否则执行另一块。这是最常见的分支逻辑方式。 示例:检查值是否小于 10 并打印相应消息。 using System; namespace Demo
C# 变量 C# 中变量是存储特定数据类型值的命名存储位置。数据类型决定内存布局及可对变量执行的操作。 例如,声明为 string 的变量存储文本数据,而 int 存储整数。理解类型对高效编码和避免运行时错误至关重要。 下面简例声明两个不同类型变量并显示其值: using System; namespace DemoApplication { class Program { static void Main(string[] args) { string message = The value is ; int val
C# 枚举 枚举(enum)让你在 C# 中定义一组命名常量。它们非常适合表示星期、月份、状态码等离散值。 下面通过一个简单的真实示例,演示如何声明枚举、赋值并在代码中使用。 using System; namespace DemoApplication { class Program { enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat } static void Main(string[] args) { Console.WriteLine(Days.Sun);
C# 中的数据类型是什么? C# 提供一组基本数据类型,构成应用程序的基石。这些类型定义变量可容纳的值类型,并决定运行时如何处理它们。下面通过清晰可运行的示例讲解最常用的类型——int、double、bool 和 string。 1) 整型 (int) int(Int32)存储整数,范围 –2,147,483,648 到 2,147,483,647。它是计数、索引和算术运算最常用的数值类型。 using System; namespace DemoApplication { class Program { static void Main(string[] args
C语言