C#基础知识

0 C#介绍

  1. 定义与背景

    • C#(发音为C - sharp)是微软公司开发的一种高级编程语言。它是专门为构建在微软的.NET平台上运行的各种应用程序而设计的。在2000年左右推出,目的是结合当时编程语言的优点,如C++的强大功能和Java的简单性与安全性,来满足开发人员对高效、安全、面向对象编程的需求。
  2. 语法结构

    • 基础语法规则
      • C#的代码以语句为基本单位,语句以分号“;”结尾。例如,Console.WriteLine("Hello");这一语句用于在控制台输出“Hello”,最后的分号是必须的。
      • 代码块通过花括号“{ }”来界定范围。比如在定义一个方法或者一个控制结构(如if - else语句)时,花括号内包含的是属于该结构的代码部分。
    • 变量与数据类型
      • C#是强类型语言,这意味着每个变量都必须有明确的类型声明。常见的数据类型有整数类型(如int,用于表示整数,如int num = 5;)、浮点类型(如floatdouble,用于表示带有小数的数字)、字符类型(char,如char letter = 'A';)和字符串类型(string,如string name = "John";)。
      • 变量的命名需要遵循一定的规则,通常以字母或下划线开头,后面可以跟字母、数字或下划线,并且区分大小写。
  3. 面向对象特性

    • 类与对象
      • 类是C#中面向对象编程的核心概念。它是一种数据结构,用于封装数据成员(字段)和方法成员。例如,定义一个简单的“Person”类:
      class Person
      {public string Name;public int Age;public void SayHello(){Console.WriteLine($"我叫{Name},今年{Age}岁。");}
      }
      
      • 对象是类的实例。可以通过new关键字来创建对象。例如,Person p = new Person(); p.Name = "Alice"; p.Age = 20; p.SayHello();,这里创建了一个“Person”类的对象p,设置了它的姓名和年龄属性,并调用了SayHello方法。
    • 继承与多态
      • 继承允许一个类(派生类)继承另一个类(基类)的属性和方法。例如,定义一个“Student”类继承自“Person”类:
      class Student : Person
      {public string School;public void Study(){Console.WriteLine($"{Name}{School}学习。");}
      }
      
      • 多态是指不同类的对象对同一消息做出不同响应的能力。在C#中,可以通过方法重写来实现。例如,在基类中有一个虚方法,在派生类中重写这个方法,当通过基类引用调用这个方法时,会根据对象的实际类型(是基类对象还是派生类对象)来执行相应的方法。
  4. 应用场景

    • 桌面应用开发
      • C#与Windows Forms或Windows Presentation Foundation(WPF)结合可以开发出功能丰富的桌面应用程序。Windows Forms提供了一种简单的方式来创建具有传统Windows风格的用户界面,而WPF则侧重于提供更灵活、更具视觉效果的界面设计,通过XAML(可扩展应用程序标记语言)和C#代码的结合来构建界面。
    • Web应用开发
      • 与ASP.NET技术配合,C#用于开发Web应用程序。ASP.NET提供了多种开发模式,如Web Forms和MVC(Model - View - Controller)。在MVC模式下,C#主要用于编写控制器(Controller)中的业务逻辑,处理用户请求并返回数据给视图(View)进行展示。
    • 游戏开发
      • 在游戏开发领域,C#与Unity游戏引擎配合紧密。Unity允许开发者使用C#编写游戏脚本,包括游戏角色的行为控制、场景切换、用户交互等各个方面的内容,能够开发出跨平台的2D和3D游戏。

1 基本语法

1.1. 变量、类型和方法名称

  • C#是区分大小写的语言。这意味着变量名、类型名和方法名等标识符的大小写不同会被视为不同的实体。
  • 例如,定义一个变量int myVariable;,如果在其他地方尝试访问myvariable(小写的v),编译器会认为这是一个未定义的标识符,从而产生错误。同样,对于类型,如stringString(在C#中,stringSystem.String类型的别名,它们是等价的,但要注意大小写一致),如果在代码中混淆使用,也会导致错误。对于方法名也是如此,MyMethod()mymethod()是不同的方法名。

1.2. 关键字

  • C#的关键字是固定的,并且也是区分大小写的。例如,if是一个关键字,用于条件判断,如果写成IF,编译器会将其视为普通的标识符,而不是条件判断关键字,从而导致语法错误。其他关键字如forwhileclassnamespace等都遵循这个规则。

1.3. 字符串内容与字符内容

  • 在字符串(string类型)和字符(char类型)内容中,大小写是有意义的。例如,字符串"Hello""hello"是不同的内容。在比较字符串是否相等或者进行字符串操作时,大小写会影响结果。可以使用string的方法,如Equals方法(str1.Equals(str2, StringComparison.OrdinalIgnoreCase)可以忽略大小写比较两个字符串是否相等)或者ToUpper(将字符串转换为大写)和ToLower(将字符串转换为小写)方法来处理大小写敏感的问题。对于字符也是一样,字符'A''a'是不同的。

1.4 命名

在C#中,变量命名需要遵循一定的规则和约定,以确保代码的可读性、可维护性以及符合编程语言的语法要求。以下是详细的C#变量命名规则:

语法规则

必须以字母、下划线(_)或 @ 符号开头
  • 变量名的第一个字符可以是字母(包括英文字母和Unicode字符)、下划线或@符号。例如:
    int _count; // 以下划线开头
    string @name; // 以@符号开头,常用于与关键字冲突的情况
    char letter; // 以字母开头
    
后续字符可以是字母、数字、下划线
  • 变量名的第一个字符之后,可以包含字母、数字和下划线。例如:
    int myVariable1;
    string user_name;
    
区分大小写
  • C#是区分大小写的语言,因此myVariableMyVariable是不同的变量名。例如:
    int myVariable = 10;
    int MyVariable = 20; // 这是一个不同的变量
    
不能使用C#关键字作为变量名(除非使用 @ 符号)
  • C#有许多保留关键字,如intstringiffor等,不能直接用作变量名。但如果确实需要使用关键字作为变量名,可以在关键字前加上@符号。例如:
    int @int = 5; // 使用@符号来使用关键字作为变量名
    
不能包含空格或其他特殊字符(除了下划线和 @ 符号)
  • 变量名中不能包含空格、标点符号等特殊字符(下划线和@符号除外)。例如,my variable是不合法的变量名,而my_variable是合法的。

命名约定

遵循驼峰命名法
  • 小驼峰命名法(camelCase):对于局部变量、方法参数等,通常使用小驼峰命名法,即第一个单词的首字母小写,后续单词的首字母大写。例如:
    int myVariable;
    void CalculateArea(int baseLength, int height);
    
  • 大驼峰命名法(PascalCase):对于类名、属性名等,通常使用大驼峰命名法,即每个单词的首字母都大写。例如:
    class MyClass
    {public int MyProperty { get; set; }
    }
    
命名要有意义
  • 变量名应该能够清晰地表达其用途和含义。避免使用过于简单或无意义的变量名,如abx等,除非在非常简单的示例或临时变量中。例如,使用studentName而不是sn来表示学生的姓名。
避免使用缩写(除非是广泛认可的缩写)
  • 尽量使用完整的单词来命名变量,避免使用难以理解的缩写。但对于一些广泛认可的缩写,如id(identifier)、num(number)等,可以使用。例如,使用customerId而不是cid
常量命名使用全大写,单词间用下划线分隔
  • 对于常量(使用const关键字声明的变量),通常使用全大写字母,单词之间用下划线分隔。例如:
    const int MAX_VALUE = 100;
    

遵循这些变量命名规则和约定可以使代码更易于阅读、理解和维护,同时也有助于团队协作和代码的一致性。

2 VS2022操作

在C#中建立新的类可以通过以下几种常见的方式,下面会结合示例详细介绍。

1. 在同一项目文件中直接定义新类

  • 步骤
    1. 打开Visual Studio(这里以Visual Studio 2022为例),创建一个新的C#项目(如控制台应用程序)。
    2. 在解决方案资源管理器中,找到要添加类的项目,展开项目节点。
    3. 通常,项目会有一个默认的代码文件(如Program.cs),你可以直接在这个文件中或者新建一个代码文件(如MyClass.cs)来定义新类。
  • 示例代码(在MyClass.cs文件中定义一个简单的类)
// 定义一个新的类,类名为 MyClass
public class MyClass
{// 类的成员变量private string name;// 类的构造函数public MyClass(string inputName){name = inputName;}// 类的方法public void PrintName(){Console.WriteLine("Name: " + name);}
}
  • 使用这个类的示例(在Program.cs中)
using System;class Program
{static void Main(){// 创建 MyClass 类的对象MyClass myObject = new MyClass("John");// 调用 MyClass 类的方法myObject.PrintName();}
}

2. 使用Visual Studio的添加新项功能来创建类

  • 步骤
    1. 在解决方案资源管理器中,右键单击项目名称,选择“添加” -> “新建项”。
    2. 在弹出的“添加新项”对话框中,选择“类”模板。
    3. 在“名称”文本框中输入类的名称(如NewClass.cs),然后点击“添加”按钮。
    4. Visual Studio会自动生成一个新的类文件,其中包含一个基本的类定义,你可以在这个文件中编辑类的成员和方法。
  • 自动生成的类文件示例(NewClass.cs
using System;namespace YourNamespace // 这里的命名空间会根据项目设置自动生成
{public class NewClass{// 这里可以添加类的成员变量和方法}
}

3. 定义嵌套类(在一个类内部定义另一个类)

  • 示例代码
public class OuterClass
{// 外部类的成员变量private int outerValue;// 外部类的构造函数public OuterClass(int value){outerValue = value;}// 定义一个嵌套类public class InnerClass{// 嵌套类的方法public void PrintOuterValue(OuterClass outer){Console.WriteLine("Outer value: " + outer.outerValue);}}
}// 使用嵌套类的示例
class Program
{static void Main(){OuterClass outerObject = new OuterClass(10);// 创建嵌套类的对象OuterClass.InnerClass innerObject = new OuterClass.InnerClass();// 调用嵌套类的方法innerObject.PrintOuterValue(outerObject);}
}

4. 定义抽象类

  • 示例代码
// 定义一个抽象类
public abstract class Shape
{// 抽象方法,没有具体实现,需要在派生类中实现public abstract double CalculateArea();
}// 派生类继承自抽象类
public class Circle : Shape
{private double radius;public Circle(double r){radius = r;}// 实现抽象方法public override double CalculateArea(){return Math.PI * radius * radius;}
}// 使用抽象类和派生类的示例
class Program
{static void Main(){Circle circle = new Circle(5);double area = circle.CalculateArea();Console.WriteLine("Circle area: " + area);}
}

以上就是在C#中建立新类的几种常见方式和相关示例,你可以根据具体的需求选择合适的方式来定义类。

在WinForm中改变窗体的字体,可通过设计器和代码两种方式实现,以下是具体的操作方法:

Winform改变字体

1. 使用设计器改变窗体字体

步骤:
  • 打开Visual Studio并加载你的WinForm项目。
  • 在解决方案资源管理器中,双击要更改字体的窗体文件(通常是 Form1.cs),打开窗体设计器。
  • 在窗体设计器中,右键单击窗体空白处,选择“属性”,或者直接按 F4 键打开属性窗口。
  • 在属性窗口中,找到 Font 属性,点击其右侧的省略号(...)按钮,打开“字体”对话框。
  • 在“字体”对话框中,选择你想要的字体、字号和样式(如加粗、倾斜等),然后点击“确定”按钮。

2. 使用代码改变窗体字体

步骤:
  • 打开窗体的代码文件(如 Form1.cs)。
  • 在窗体的构造函数或其他合适的方法中,使用以下代码来更改窗体的字体:
using System;
using System.Drawing;
using System.Windows.Forms;namespace WinFormFontChangeExample
{public partial class Form1 : Form{public Form1(){InitializeComponent();// 创建一个新的字体对象Font newFont = new Font("微软雅黑", 12, FontStyle.Regular);// 将新字体应用到窗体this.Font = newFont;}}
}
代码解释:
  • Font 类用于表示字体,通过 new Font("微软雅黑", 12, FontStyle.Regular) 创建了一个新的字体对象,其中 "微软雅黑" 是字体名称,12 是字号,FontStyle.Regular 表示常规样式(不加粗、不倾斜)。
  • this.Font = newFont; 将新创建的字体对象应用到当前窗体。

3. 批量改变窗体上所有控件的字体

如果需要同时改变窗体上所有控件的字体,可以使用递归方法遍历窗体上的所有控件,并设置它们的字体:

using System;
using System.Drawing;
using System.Windows.Forms;namespace WinFormFontChangeExample
{public partial class Form1 : Form{public Form1(){InitializeComponent();// 创建一个新的字体对象Font newFont = new Font("微软雅黑", 12, FontStyle.Regular);// 调用方法改变窗体及所有控件的字体ChangeFont(this, newFont);}private void ChangeFont(Control control, Font newFont){// 设置当前控件的字体control.Font = newFont;// 遍历当前控件的所有子控件foreach (Control childControl in control.Controls){// 递归调用ChangeFont方法,改变子控件的字体ChangeFont(childControl, newFont);}}}
}
代码解释:
  • ChangeFont 方法接受一个 Control 类型的参数和一个 Font 类型的参数,用于递归地改变控件及其子控件的字体。
  • Form1 的构造函数中,调用 ChangeFont 方法并传入当前窗体和新字体对象,从而实现批量改变字体的效果。

通过以上方法,你可以在WinForm中方便地改变窗体及其控件的字体。

Label添加

在Visual Studio 2022中,“标签(Label)”通常是指WinForm设计器中的Label控件,如果你想问的是在WinForm设计器中如何添加Label控件,或者是如何调出显示属性等相关窗口,以下是具体介绍:

调出Label控件进行添加

  1. 打开WinForm设计器

    • 首先确保你已经创建了一个Windows Forms应用程序项目。在解决方案资源管理器中,双击.cs窗体文件(例如Form1.cs),打开WinForm设计器界面。
  2. 找到工具箱

    • 通常,工具箱会默认停靠在Visual Studio界面的左侧。如果没有显示,可以通过“视图”菜单,选择“工具箱”来将其显示出来。
  3. 添加Label控件

    • 在工具箱中,展开“所有Windows窗体”或“公共控件”分组(具体名称可能因版本和设置略有不同),找到Label控件。
    • 点击并按住Label控件,然后将其拖动到WinForm设计器的窗体上你想要放置的位置,松开鼠标即可添加一个Label控件到窗体上。

调出Label控件的属性窗口

  1. 选中Label控件

    • 在WinForm设计器中,点击你之前添加的Label控件,使其处于选中状态(控件周围会出现蓝色的边框)。
  2. 打开属性窗口

    • 一般情况下,属性窗口会默认停靠在Visual Studio界面的右侧。如果没有显示,可以通过以下两种方式调出:
      • 使用快捷键F4,可以快速打开或切换到属性窗口。
      • 通过“视图”菜单,选择“属性窗口”来显示属性窗口。
  3. 查看和修改Label控件的属性

    • 在属性窗口中,可以看到Label控件的各种属性,如Text(用于设置显示的文本内容)、Font(用于设置字体)、ForeColor(用于设置文本颜色)等。你可以根据需要修改这些属性的值。

调出Label控件的事件窗口(如果需要处理事件)

  1. 选中Label控件

    • 同样在WinForm设计器中,点击选中Label控件。
  2. 打开事件窗口

    • 可以通过以下两种方式打开事件窗口:
      • 使用快捷键Shift + F4
      • 通过“视图”菜单,选择“事件窗口”。
  3. 处理Label控件的事件

    • 在事件窗口中,可以看到Label控件支持的各种事件,如Click(点击事件)、MouseEnter(鼠标进入事件)等。双击你想要处理的事件名称,Visual Studio会自动在代码文件中生成相应的事件处理方法的框架,你可以在其中编写具体的代码逻辑。

3 函数

3.1 输出Console.Write

在C#中,Console.WriteLineConsole.Write都是用于向控制台输出信息的方法,但它们之间有一些重要的区别。

1. 输出后是否换行

  • Console.WriteLine
    • Console.WriteLine方法在输出完指定的信息后,会自动在输出的末尾添加一个换行符,将光标移动到下一行的开头。
    • 示例代码:
Console.WriteLine("第一行");
Console.WriteLine("第二行");
  • 输出结果:
第一行
第二行
  • Console.Write
    • Console.Write方法仅输出指定的信息,不会在输出的末尾添加换行符,光标会停留在输出内容的末尾。
    • 示例代码:
Console.Write("第一行");
Console.Write("第二行");
  • 输出结果:
第一行第二行

2. 重载方法的功能

  • Console.WriteLine
    • Console.WriteLine有多个重载方法,除了可以输出字符串,还可以直接输出各种基本数据类型(如整数、浮点数等),并且会自动调用这些数据类型的ToString方法将其转换为字符串输出,同时在末尾添加换行符。
    • 示例代码:
int number = 123;
Console.WriteLine(number);
  • 输出结果:
123
  • Console.Write
    • Console.Write同样有多个重载方法,可以输出各种基本数据类型,它会将这些数据类型转换为字符串输出,但不会添加换行符。
    • 示例代码:
int number1 = 123;
int number2 = 456;
Console.Write(number1);
Console.Write(number2);
  • 输出结果:
123456

3.2 Console.ReadKey

在C#中,Console.ReadKey 是一个用于从控制台读取用户按下的下一个字符或功能键的方法,它属于 System.Console 类。如果后面没有代码,则自动退出调试。

以下是关于 Console.ReadKey 的详细介绍:

方法重载

Console.ReadKey 有两个重载形式:

  1. public static ConsoleKeyInfo ReadKey ();

    • 这个重载会读取用户按下的下一个字符或功能键,并将其作为 ConsoleKeyInfo 对象返回,同时显示按下的字符(如果是可显示字符)。
  2. public static ConsoleKeyInfo ReadKey (bool intercept);

    • 此重载方法接受一个布尔类型的参数 intercept。当 intercepttrue 时,用户按下的键不会显示在控制台中;当 interceptfalse 时,用户按下的键会显示在控制台中。

返回值

Console.ReadKey 方法返回一个 ConsoleKeyInfo 类型的对象,该对象包含以下重要属性:

  • Key:一个 ConsoleKey 枚举值,表示用户按下的键,如 ConsoleKey.EnterConsoleKey.Escape 等。
  • KeyChar:一个 char 类型的值,表示用户按下的键对应的字符(如果该键有对应的字符)。对于功能键(如 F1F2 等),KeyChar 可能是 \u0000
  • Modifiers:一个 ConsoleModifiers 枚举值,表示用户按下的修饰键(如 ShiftCtrlAlt 等)的组合。

示例代码

以下是几个使用 Console.ReadKey 的示例:

基本用法
using System;class Program
{static void Main(){Console.WriteLine("请按任意键继续...");ConsoleKeyInfo keyInfo = Console.ReadKey();Console.WriteLine(); // 换行Console.WriteLine($"你按下的键是:{keyInfo.Key}");Console.WriteLine($"对应的字符是:{keyInfo.KeyChar}");}
}

在这个示例中,程序会等待用户按下一个键,然后输出用户按下的键的信息。

使用 intercept 参数
using System;class Program
{static void Main(){Console.WriteLine("请输入密码(输入时不显示字符):");string password = "";ConsoleKeyInfo keyInfo;do{keyInfo = Console.ReadKey(true); // 不显示输入的字符if (keyInfo.Key != ConsoleKey.Enter){password += keyInfo.KeyChar;}} while (keyInfo.Key != ConsoleKey.Enter);Console.WriteLine(); // 换行Console.WriteLine($"你输入的密码是:{password}");}
}

在这个示例中,通过将 intercept 参数设置为 true,实现了在用户输入密码时不显示字符的效果。

根据用户输入的键执行不同操作
using System;class Program
{static void Main(){Console.WriteLine("请选择操作:");Console.WriteLine("1. 显示信息");Console.WriteLine("2. 退出");ConsoleKeyInfo keyInfo = Console.ReadKey();switch (keyInfo.KeyChar){case '1':Console.WriteLine(); // 换行Console.WriteLine("你选择了显示信息。");break;case '2':Console.WriteLine(); // 换行Console.WriteLine("程序退出。");return;default:Console.WriteLine(); // 换行Console.WriteLine("无效的选择。");break;}}
}

在这个示例中,根据用户按下的键执行不同的操作。

注意事项

  • Console.ReadKey 方法会阻塞当前线程,直到用户按下一个键。
  • 在某些情况下,Console.ReadKey 可能会受到控制台的输入模式、缓冲区设置等因素的影响。
  • 在使用 Console.ReadKey 时,要注意处理不同的键和修饰键组合,以确保程序的健壮性。

3.3 ///

在C#中,/// 是一种特殊的注释语法,用于生成XML文档注释。这些注释可以被Visual Studio等开发工具解析,用于生成代码的文档信息,帮助开发者更好地理解代码的功能和使用方法。以下是关于 /// 注释的详细介绍:

基本功能

当在代码中使用 /// 开始一行注释时,编译器会将这些注释作为XML格式的文档信息进行处理。这些注释通常用于描述类、方法、属性、字段等代码元素的用途、参数、返回值等信息。

使用场景和示例

类的文档注释
/// <summary>
/// 表示一个人的基本信息类。
/// 该类包含人的姓名和年龄信息,并提供了相应的属性进行访问。
/// </summary>
public class Person
{/// <summary>/// 获取或设置人的姓名。/// </summary>public string Name { get; set; }/// <summary>/// 获取或设置人的年龄。/// </summary>public int Age { get; set; }/// <summary>/// 构造函数,用于初始化人的姓名和年龄。/// </summary>/// <param name="name">人的姓名。</param>/// <param name="age">人的年龄。</param>public Person(string name, int age){Name = name;Age = age;}/// <summary>/// 打印人的基本信息。/// </summary>public void PrintInfo(){Console.WriteLine($"姓名:{Name},年龄:{Age}");}
}
方法的文档注释

在上述示例中,Person 类的构造函数和 PrintInfo 方法都使用了 /// 注释。对于方法,通常会使用 <summary> 标签来描述方法的功能,使用 <param> 标签来描述方法的参数,使用 <returns> 标签(如果方法有返回值)来描述方法的返回值。

XML文档注释标签

以下是一些常用的XML文档注释标签:

  • <summary>:用于提供对代码元素(如类、方法、属性等)的简要描述。
  • <param>:用于描述方法的参数,需要指定参数的名称。
  • <returns>:用于描述方法的返回值。
  • <remarks>:用于提供额外的详细说明。
  • <example>:用于提供代码示例,展示如何使用该代码元素。
  • <exception>:用于描述方法可能抛出的异常。

生成文档

在Visual Studio中,可以通过以下步骤生成XML文档:

  1. 右键单击项目,选择“属性”。
  2. 在“生成”选项卡中,勾选“XML文档文件”,并指定文档文件的输出路径和名称。
  3. 编译项目后,会在指定的路径生成一个XML文档文件,其中包含了代码中的文档注释信息。

查看文档

生成的XML文档可以通过Visual Studio的智能感知功能查看。当你在代码中使用某个类或方法时,鼠标悬停在上面,就可以看到相应的文档注释信息。

综上所述,/// 注释在C#中用于生成XML文档注释,帮助开发者编写更易于理解和维护的代码。

3.3 region

在C#中,#region#endregion 是预处理器指令,用于在代码中创建可折叠的代码区域。这两个指令主要用于组织和管理代码,提高代码的可读性和可维护性,特别是在处理大型代码文件时非常有用。

基本语法

#region 区域名称
// 这里是代码区域的内容
#endregion

功能和用途

代码组织和折叠
  • 使用 #region#endregion 可以将一段相关的代码块分组,并为这个代码块指定一个名称(区域名称)。在Visual Studio等集成开发环境(IDE)中,这些代码区域可以被折叠起来,只显示区域的名称,从而减少代码的视觉复杂度,让开发者能够更方便地浏览和管理代码。
示例
using System;namespace RegionExample
{class Program{static void Main(){#region 初始化变量int number1 = 10;int number2 = 20;string message = "Hello, World!";#endregion#region 计算和输出int sum = number1 + number2;Console.WriteLine(message);Console.WriteLine($"两数之和: {sum}");#endregion}}
}

在上述示例中,代码被分为两个区域:“初始化变量”和“计算和输出”。在Visual Studio中,你可以点击区域名称旁边的减号(-)来折叠该区域的代码,只显示区域名称,这样可以更清晰地看到代码的整体结构。

嵌套使用

#region 指令还可以嵌套使用,即在一个 #region 代码块中可以包含另一个 #region 代码块。例如:

#region 外层区域// 外层区域的代码#region 内层区域// 内层区域的代码#endregion
#endregion

注意事项

  • #region#endregion 指令只是用于代码的组织和显示,不会影响代码的编译和运行。编译器在编译代码时会忽略这些指令,只处理实际的代码内容。
  • 区域名称可以是任何有效的字符串,但为了提高代码的可读性,建议使用描述性的名称来准确反映该区域的代码功能。
  • 虽然 #region#endregion 可以提高代码的可读性,但不要过度使用。过多的区域划分可能会使代码结构变得复杂,反而降低代码的可读性。一般来说,应该在逻辑上相关的代码块之间使用这些指令。

总之,#region#endregion 是C#中用于代码组织和管理的有用工具,可以帮助开发者更好地组织和浏览大型代码文件。

3.4 Convert

在C#中,System.Convert类提供了一组静态方法,用于将一个数据类型转换为另一个数据类型。这些方法可以处理各种基本数据类型之间的转换,并且在转换过程中会进行必要的验证和格式化。以下是Convert类的一些常见用法:

基本数据类型之间的转换

整数类型转换
// 将字符串转换为整数
string strNumber = "123";
int intValue = Convert.ToInt32(strNumber);
Console.WriteLine(intValue); // 输出: 123// 将长整型转换为整数
long longValue = 123456789L;
int convertedInt = Convert.ToInt32(longValue);
Console.WriteLine(convertedInt); // 输出: 123456789
浮点类型转换
// 将字符串转换为双精度浮点数
string strDouble = "3.14";
double doubleValue = Convert.ToDouble(strDouble);
Console.WriteLine(doubleValue); // 输出: 3.14// 将双精度浮点数转换为单精度浮点数
double doubleNum = 3.1415926;
float floatValue = Convert.ToSingle(doubleNum);
Console.WriteLine(floatValue); // 输出: 3.141593
字符类型转换
// 将字符转换为整数(字符的Unicode码值)
char charValue = 'A';
int charCode = Convert.ToInt32(charValue);
Console.WriteLine(charCode); // 输出: 65// 将整数转换为字符(根据Unicode码值)
int code = 66;
char newChar = Convert.ToChar(code);
Console.WriteLine(newChar); // 输出: B
布尔类型转换
// 将字符串转换为布尔值
string strBool = "true";
bool boolValue = Convert.ToBoolean(strBool);
Console.WriteLine(boolValue); // 输出: True// 将整数转换为布尔值(非零值为true,零值为false)
int intBool = 1;
bool convertedBool = Convert.ToBoolean(intBool);
Console.WriteLine(convertedBool); // 输出: True

日期和时间类型转换

// 将字符串转换为日期时间类型
string strDate = "2023-10-01";
DateTime dateValue = Convert.ToDateTime(strDate);
Console.WriteLine(dateValue); // 输出: 2023/10/1 0:00:00// 将日期时间类型转换为字符串
string dateString = Convert.ToString(dateValue);
Console.WriteLine(dateString); // 输出: 2023/10/1 0:00:00

处理转换异常

在使用Convert类进行类型转换时,如果输入的字符串无法正确转换为目标类型,会抛出异常。例如,将一个非数字的字符串转换为整数时,会抛出FormatException异常。因此,在实际应用中,建议使用异常处理机制来捕获并处理这些异常。

try
{string invalidStr = "abc";int result = Convert.ToInt32(invalidStr);Console.WriteLine(result);
}
catch (FormatException ex)
{Console.WriteLine("输入的字符串不是有效的数字格式: " + ex.Message);
}

与其他类型转换方法的比较

Convert类的方法在进行类型转换时会尝试进行一些额外的处理,如将字符串转换为数字时会考虑不同的数字格式。相比之下,强制类型转换(如(int))只进行简单的二进制转换,不会进行格式验证。例如:

string str = "123";
int num1 = Convert.ToInt32(str); // 使用Convert类,会进行格式验证
double doubleNum = 3.14;
int num2 = (int)doubleNum; // 强制类型转换,直接截断小数部分

总之,Convert类提供了一种方便的方式来进行各种基本数据类型之间的转换,但在使用时要注意异常处理,以确保程序的健壮性。

4 变量与数据类型

4.1 变量

在C#中,变量是用于存储数据的命名内存位置,而基本数据类型则定义了变量可以存储的数据的种类。以下是关于C#变量与基本数据类型的详细介绍:

变量的声明与初始化

声明变量

在C#中,声明变量需要指定变量的类型和名称。语法如下:

<数据类型> <变量名>;

例如:

int age;
string name;
double salary;
初始化变量

变量声明后,可以通过赋值语句对其进行初始化。例如:

age = 25;
name = "John";
salary = 5000.50;

也可以在声明变量的同时进行初始化:

int age = 25;
string name = "John";
double salary = 5000.50;

4.2 数据类型

基本数据类型

整数类型
  • int(System.Int32):用于表示32位有符号整数,取值范围大约是 -2,147,483,648 到 2,147,483,647。这是最常用的整数类型。
    int number = 10;
    
  • short(System.Int16):16位有符号整数,取值范围是 -32,768 到 32,767。
    short smallNumber = 100;
    
  • long(System.Int64):64位有符号整数,取值范围非常大,大约是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。在处理大整数时使用。
    long bigNumber = 100000000000L; // 注意后缀L表示这是一个long类型的常量
    
  • byte(System.Byte):8位无符号整数,取值范围是 0 到 255,常用于处理二进制数据。
    byte binaryData = 200;
    
浮点类型
  • float(System.Single):32位单精度浮点数,用于表示小数。在声明float类型的变量或常量时,需要在数字后面加上fF后缀。
    float pi = 3.14f;
    
  • double(System.Double):64位双精度浮点数,是默认的小数类型,精度比float更高。
    double morePrecisePi = 3.14159265358979;
    
字符类型
  • char(System.Char):用于表示单个字符,用单引号括起来。char类型实际上是一个16位的Unicode字符。
    char letter = 'A';
    
布尔类型
  • bool(System.Boolean):用于表示布尔值,只有两个可能的值:truefalse,常用于条件判断。
    bool isTrue = true;
    bool isFalse = false;
    
字符串类型
  • string(System.String):用于表示文本,是一个不可变的字符序列,用双引号括起来。
    string message = "Hello, World!";
    

类型转换

隐式类型转换

当把一个较小范围的数据类型赋值给一个较大范围的数据类型时,会自动进行隐式类型转换。例如:

int num = 10;
long bigNum = num; // 隐式类型转换,int可以自动转换为long
显式类型转换

当把一个较大范围的数据类型赋值给一个较小范围的数据类型时,需要进行显式类型转换,使用强制类型转换运算符()。例如:

long bigNum = 1000;
int num = (int)bigNum; // 显式类型转换,需要注意可能会发生数据丢失

常量

在C#中,使用const关键字来声明常量。常量的值在声明时必须初始化,并且在程序运行期间不能更改。例如:

const int MAX_VALUE = 100;

总之,C#提供了丰富的基本数据类型来满足不同的编程需求,同时通过变量和常量来存储和管理数据。在使用变量和数据类型时,需要注意类型的选择和类型转换的问题,以确保程序的正确性和性能。

4.3 字符串+

在C#中,+ 运算符用于连接两个字符串,这种操作被称为字符串拼接。以下是关于C#中使用 + 连接两个字符串的详细介绍:

基本用法

连接字符串字面量

可以直接使用 + 运算符将两个字符串字面量连接起来。例如:

string str1 = "Hello";
string str2 = " World";
string result = str1 + str2;
Console.WriteLine(result); // 输出: Hello World
连接字符串变量和字面量

也可以将字符串变量和字符串字面量混合使用进行连接。例如:

string name = "John";
string greeting = "Hello, " + name + "!";
Console.WriteLine(greeting); // 输出: Hello, John!

注意事项

类型转换

当使用 + 运算符连接字符串和其他数据类型时,其他数据类型会自动转换为字符串类型。例如:

int age = 25;
string message = "My age is " + age;
Console.WriteLine(message); // 输出: My age is 25

在这个例子中,整数 age 会自动转换为字符串,然后与其他字符串进行连接。

性能考虑

在循环中多次使用 + 运算符进行字符串连接时,会产生性能问题。因为每次使用 + 运算符进行字符串连接时,都会创建一个新的字符串对象,这会导致频繁的内存分配和垃圾回收。在这种情况下,建议使用 System.Text.StringBuilder 类来进行字符串的拼接,它的性能更高。例如:

// 使用 + 运算符在循环中拼接字符串
string result = "";
for (int i = 0; i < 1000; i++)
{result += i.ToString();
}// 使用 StringBuilder 类在循环中拼接字符串
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < 1000; i++)
{sb.Append(i);
}
string result2 = sb.ToString();

在上述示例中,使用 StringBuilderAppend 方法进行字符串拼接的性能要比使用 + 运算符高得多,尤其是在循环次数较多的情况下。

空字符串的处理

当连接的字符串中有一个或多个为空字符串时,空字符串会被视为普通字符串进行连接。例如:

string str1 = "Hello";
string str2 = "";
string result = str1 + str2;
Console.WriteLine(result); // 输出: Hello

总之,在C#中使用 + 运算符可以方便地连接两个字符串,但在处理大量字符串拼接时,要注意性能问题。

5 WinForm

在C#中,Windows 窗体(WinForm)是一种用于创建桌面应用程序用户界面的技术。它是.NET Framework的一部分,提供了丰富的控件和工具,使开发者能够轻松地构建具有图形用户界面(GUI)的应用程序。以下是关于C#中WinForm的详细介绍:

1. 基本概念

窗体(Form)
  • 窗体是WinForm应用程序的主要容器,类似于窗口。每个WinForm应用程序至少包含一个主窗体。可以在窗体上添加各种控件,如按钮、文本框、标签等,来实现与用户的交互。
控件(Control)
  • 控件是WinForm中用于显示信息或接收用户输入的组件。例如,Button控件用于触发操作,TextBox控件用于输入文本,Label控件用于显示文本信息等。

2. 创建WinForm应用程序

使用Visual Studio创建项目
  • 打开Visual Studio,选择“创建新项目”。
  • 在模板列表中,选择“Windows 窗体应用(.NET Framework)”或“Windows 窗体应用(.NET Core)”(根据需要选择合适的.NET版本)。
  • 输入项目名称和位置,然后点击“创建”按钮。Visual Studio会自动生成一个包含主窗体的WinForm项目。

3. 窗体设计

设计视图
  • 在Visual Studio的解决方案资源管理器中,双击Form1.cs(默认的主窗体文件),会打开窗体设计器。在设计器中,可以通过拖放控件的方式来设计窗体的布局。
属性窗口
  • 选中一个控件后,在属性窗口中可以设置控件的各种属性,如大小、位置、颜色、字体等。例如,要更改按钮的文本,可以在属性窗口中找到Text属性并进行修改。

4. 事件处理

事件驱动编程
  • WinForm应用程序是基于事件驱动的,即当用户执行某个操作(如点击按钮、输入文本等)时,会触发相应的事件,开发者可以编写代码来处理这些事件。
事件处理示例
  • 以下是一个简单的示例,当用户点击按钮时,在消息框中显示一条信息:
using System;
using System.Windows.Forms;namespace WinFormExample
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){MessageBox.Show("你点击了按钮!");}}
}
  • 在这个示例中,button1_Click方法是按钮的点击事件处理程序。当用户点击按钮时,会自动调用这个方法,显示一个消息框。

5. 常用控件及用法

1. 按钮(Button)
  • 用途:用于触发特定的操作或事件,当用户点击按钮时,可以执行相应的代码逻辑。
  • 示例代码
private void button1_Click(object sender, EventArgs e)
{MessageBox.Show("按钮被点击了!");
}
  • 使用场景:在登录界面中,“登录”按钮用于验证用户输入的用户名和密码;在文件操作界面中,“保存”按钮用于保存用户编辑的文件内容。
2. 标签(Label)
  • 用途:用于显示文本信息,通常作为提示或说明文字,不能接收用户输入。
  • 示例代码
label1.Text = "请输入用户名:";
  • 使用场景:在表单中,用于提示用户输入信息;在显示数据的界面中,用于标注数据的含义。
3. 文本框(TextBox)
  • 用途:用于接收用户输入的文本信息,可以是单行或多行输入。
  • 示例代码
string userInput = textBox1.Text;
  • 使用场景:在登录界面中,用于输入用户名和密码;在搜索框中,用于输入搜索关键词。
4. 复选框(CheckBox)
  • 用途:用于提供一个或多个选项供用户选择,用户可以选择多个复选框。
  • 示例代码
if (checkBox1.Checked)
{MessageBox.Show("复选框被选中了!");
}
  • 使用场景:在设置界面中,用于选择多个功能选项;在调查问卷中,用于选择多个答案。
5. 单选按钮(RadioButton)
  • 用途:用于提供一组互斥的选项供用户选择,用户只能选择其中一个。
  • 示例代码
if (radioButton1.Checked)
{MessageBox.Show("选项1被选中了!");
}
  • 使用场景:在性别选择中,用户只能选择“男”或“女”;在答题界面中,用户只能选择一个正确答案。
6. 列表框(ListBox)
  • 用途:用于显示一个列表,用户可以选择其中的一个或多个项目。
  • 示例代码
listBox1.Items.Add("选项1");
listBox1.Items.Add("选项2");
string selectedItem = listBox1.SelectedItem.ToString();
  • 使用场景:在文件选择界面中,显示文件列表供用户选择;在商品列表界面中,显示商品信息供用户选择。
7. 组合框(ComboBox)
  • 用途:类似于下拉列表,用户可以从预定义的选项中选择一个值,也可以手动输入文本。
  • 示例代码
comboBox1.Items.Add("选项1");
comboBox1.Items.Add("选项2");
string selectedValue = comboBox1.SelectedValue.ToString();
  • 使用场景:在选择城市的界面中,用户可以从下拉列表中选择城市名称;在选择日期的界面中,用户可以从下拉列表中选择日期。
8. 图片框(PictureBox)
  • 用途:用于显示图片,可以加载本地图片或从网络获取图片。
  • 示例代码
pictureBox1.Image = Image.FromFile("image.jpg");
  • 使用场景:在用户头像显示界面中,显示用户的头像图片;在产品展示界面中,显示产品的图片。
9. 进度条(ProgressBar)
  • 用途:用于显示任务的进度,通常用于长时间运行的任务,如文件下载、数据处理等。
  • 示例代码
progressBar1.Value = 50; // 设置进度为50%
  • 使用场景:在文件下载界面中,显示文件的下载进度;在数据备份界面中,显示数据备份的进度。
10. 数据网格视图(DataGridView)
  • 用途:用于显示和编辑表格数据,支持数据的排序、筛选和编辑。
  • 示例代码
DataTable dataTable = new DataTable();
dataTable.Columns.Add("姓名");
dataTable.Columns.Add("年龄");
dataTable.Rows.Add("张三", 20);
dataGridView1.DataSource = dataTable;
  • 使用场景:在数据管理界面中,显示和编辑数据库中的数据;在报表界面中,显示统计数据。

以上是WinForm中一些常用的控件,通过组合使用这些控件,可以创建出各种功能丰富的桌面应用程序。

6. 布局管理

布局管理器
  • WinForm提供了多种布局管理器,如FlowLayoutPanelTableLayoutPanelDockPanel等,用于自动调整控件的位置和大小,以适应窗体的大小变化。
使用布局管理器
  • 可以将控件添加到布局管理器中,然后设置布局管理器的属性来控制控件的排列方式。例如,使用FlowLayoutPanel可以使控件按照水平或垂直方向依次排列。

7. 数据绑定

数据绑定概念
  • 数据绑定是将控件与数据源(如数据库、集合等)关联起来,使控件能够自动显示数据源中的数据,并在数据发生变化时自动更新。
数据绑定示例
  • 以下是一个简单的数据绑定示例,将一个ListBox控件与一个字符串列表绑定:
using System;
using System.Collections.Generic;
using System.Windows.Forms;namespace WinFormDataBindingExample
{public partial class Form1 : Form{public Form1(){InitializeComponent();// 创建一个字符串列表List<string> fruits = new List<string> { "苹果", "香蕉", "橙子" };// 将列表绑定到ListBox控件listBox1.DataSource = fruits;}}
}

总之,C#中的WinForm是一种强大的桌面应用程序开发技术,通过使用窗体、控件、事件处理、布局管理和数据绑定等功能,可以创建出功能丰富、用户友好的桌面应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Revit二次开发 自适应族添加放样融合

大多数博客给出的方案都是如何在有自适应族的情况下进行修改定位点或是将数据传入自适应族,如何直接在族文件中创建自适应模型并将点转换为自适应点,连接自适应点成为自适应路径这种方式没有文章介绍. 下面的代码中给出了如何在自适应族文件中创建参照点并转换为自适应点连接…

基于VMware的ubuntu与vscode建立ssh连接

1.首先安装openssh服务 sudo apt update sudo apt install openssh-server -y 2.启动并检查ssh服务状态 到这里可以按q退出 之后输入命令 &#xff1a; ip a 红色挡住的部分就是我们要的地址&#xff0c;这里就不展示了哈 3.配置vscode 打开vscode 搜索并安装&#xff1a;…

解决SetWindowCompositionAttribute使控件文本透明的问题

用以下参数调用该API&#xff0c;能实现类似Aero的模糊透明效果。 参数具体含义见 https://zhuanlan.zhihu.com/p/569258181 http://www.memotech.de/WindowComposition/Text.txt http://www.memotech.de/WindowComposition/WindowComposition.zip DWORD accent[4] { 3,0,0,0 …

使用 DeepSeek-R1 与 AnythingLLM 搭建本地知识库

一、下载地址Download Ollama on macOS 官方网站&#xff1a;Ollama 官方模型库&#xff1a;library 二、模型库搜索 deepseek r1 deepseek-r1:1.5b 私有化部署deepseek&#xff0c;模型库搜索 deepseek r1 运行cmd复制命令&#xff1a;ollama run deepseek-r1:1.5b 私有化…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附&#xff1a;Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…

TensorFlow简单的线性回归任务

如何使用 TensorFlow 和 Keras 创建、训练并进行预测 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 8.完整代码 1. 数据准备与预处理 我们将使用一个简单的线性回归问题&#xff0c;其中输入特征 x 和标…

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…

《苍穹外卖》项目学习记录-Day10订单状态定时处理

利用Cron表达式生成器生成Cron表达式 1.处理超时订单 查询订单表把超时的订单查询出来&#xff0c;也就是订单的状态为待付款&#xff0c;下单的时间已经超过了15分钟。 //select * from orders where status ? and order_time < (当前时间 - 15分钟) 遍历集合把数据库…

解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题

macOS 系统中如何开启“任何来源”以解决安装报错问题&#xff1f; 大家好&#xff01;今天我们来聊聊在使用 macOS 系统 时&#xff0c;遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时&#xff0c;因为 macOS 会默认阻止不明开发者的…

【FreeRTOS 教程 六】二进制信号量与计数信号量

目录 一、FreeRTOS 二进制信号量&#xff1a; &#xff08;1&#xff09;二进制信号量作用&#xff1a; &#xff08;2&#xff09;二进制信号量与互斥锁的区别&#xff1a; &#xff08;3&#xff09;信号量阻塞时间&#xff1a; &#xff08;4&#xff09;信号量的获取与…

C++模板编程——可变参函数模板之折叠表达式

目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开&#xff0c;这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念&#xff0c;引入折叠表达式的目的是为了…

DeepSeek回答禅宗三重境界重构交易认知

人都是活在各自心境里&#xff0c;有些话通过语言去交流&#xff0c;还是要回归自己心境内在的&#xff0c;而不是靠外在映射到股票和技术方法&#xff1b;比如说明天市场阶段是不修复不接力节点&#xff0c;这就是最高视角看整个市场&#xff0c;还有哪一句话能概括&#xff1…

数据结构【链栈】

基于 C 实现链表栈&#xff1a;原理、代码与应用 一、引言 栈就是一个容器&#xff0c;可以当场一个盒子&#xff0c;只能一个一个拿&#xff0c;一个一个放&#xff0c;而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】&#xff0c;所以我们这里只…

成绩案例demo

本案例较为简单&#xff0c;用到的知识有 v-model、v-if、v-else、指令修饰符.prevent .number .trim等、computed计算属性、toFixed方法、reduce数组方法。 涉及的功能需求有&#xff1a;渲染、添加、删除、修改、统计总分&#xff0c;求平均分等。 需求效果如下&#xff1a…

C++:抽象类习题

题目内容&#xff1a; 求正方体、球、圆柱的表面积&#xff0c;抽象出一个公共的基类Container为抽象类&#xff0c;在其中定义一个公共的数据成员radius(此数据可以作为正方形的边长、球的半径、圆柱体底面圆半径)&#xff0c;以及求表面积的纯虚函数area()。由此抽象类派生出…

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

AI智慧社区--百度地图

数据库&#xff1a; 前端实现 页面代码 <template><div class"app-container"><baidu-map class"bm-view" :center"center" :zoom"zoom" ready"initMap"><!-- 定位 --><bm-geolocation anchor…

WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载

Windows中安装wsl2&#xff0c;wsl2里安装ubuntu。 1. Wsl启动后 1&#xff09;Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…