当前位置: 首页 > news >正文

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是一种强大的桌面应用程序开发技术,通过使用窗体、控件、事件处理、布局管理和数据绑定等功能,可以创建出功能丰富、用户友好的桌面应用程序。

相关文章:

C#基础知识

0 C#介绍 定义与背景 C#&#xff08;发音为C - sharp&#xff09;是微软公司开发的一种高级编程语言。它是专门为构建在微软的.NET平台上运行的各种应用程序而设计的。在2000年左右推出&#xff0c;目的是结合当时编程语言的优点&#xff0c;如C的强大功能和Java的简单性与安全…...

Kafka中文文档

文章来源&#xff1a;https://kafka.cadn.net.cn 什么是事件流式处理&#xff1f; 事件流是人体中枢神经系统的数字等价物。它是 为“永远在线”的世界奠定技术基础&#xff0c;在这个世界里&#xff0c;企业越来越多地使用软件定义 和 automated&#xff0c;而软件的用户更…...

Tyrant(暴君):反向Shell-后门注入与持久化控制的渗透测试工具

Tyrant Tyrant 是一款用于渗透测试和远程控制持久化的恶意工具&#xff0c;具备以下功能&#xff1a; 反向Shell&#xff1a;允许攻击者通过指定用户UID进行反弹对应权限的Shell会话。后门注入与持久化&#xff1a;在目标系统中注入后门并确保即使重启后依然能恢复控制。Tyran…...

leetcode刷题-贪心04

代码随想录贪心算法part04|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间 452. 用最少数量的箭引爆气球435. 无重叠区间763.划分字母区间 今天的三道题目&#xff0c;都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#…...

系统学习算法: 专题八 二叉树中的深搜

深搜其实就是深度优先遍历&#xff08;dfs&#xff09;&#xff0c;与此相对的还有宽度优先遍历&#xff08;bfs&#xff09; 如果学完数据结构有点忘记&#xff0c;如下图&#xff0c;左边是dfs&#xff0c;右边是bfs 而二叉树的前序&#xff0c;中序&#xff0c;后序遍历都可…...

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题2)-网络部分解析-附详细代码

目录 附录1:拓扑图​编辑 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.EG1 14.EG2 15.AP2 16.AP3 附录1:拓扑图 附录2:地址规划表...

笔试-业务逻辑4

应用 小明在玩一个数字加减游戏&#xff0c;输入4个正整数&#xff1a;s、t、a、b&#xff0c;其中s>1&#xff0c;b<105&#xff0c;a!b。只使用加法或者减法&#xff0c;使得st。 每回合&#xff0c;小明用当前的数字&#xff0c;加上或减去一个数字&#xff1b;目前有…...

冷启动+强化学习:DeepSeek-R1 的原理详解——无需监督数据的推理能力进化之路

本文基于 DeepSeek 官方论文进行分析,论文地址为:https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf 有不足之处欢迎评论区交流 原文翻译 在阅读和理解一篇复杂的技术论文时,逐字翻译是一个重要的步骤。它不仅能帮助我们准确把握作者的原意,还能为后续…...

ubuntu22安装issac gym记录

整体参考&#xff1a;https://blog.csdn.net/Yakusha/article/details/144306858 安装完成后的整体版本信息 ubuntu&#xff1a;22.04内核&#xff1a;6.8.0-51-generic显卡&#xff1a;NVIDIA GeForce RTX 3050 OEM显卡驱动&#xff1a;535.216.03cuda&#xff1a;12.2cudnn&…...

Docker小游戏 | 使用Docker部署2048网页小游戏

Docker小游戏 | 使用Docker部署2048网页小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署2048网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问2048网页小游戏五、总结前言 在当今快速发展的技术世…...

C基础寒假练习(2)

一、输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身 #include <stdio.h>// 函数声明 int isPerfectNumber(int num);int main() {printf("3-100以内的完美数有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…...

传输层协议 UDP 与 TCP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 前置复盘&#x1f98b; 传输层&#x1f98b; 再谈端口号&#x1f98b; 端口号范围划分&#x1f98b; 认识知名端口号 (Well-Know Port Number) 二&#xf…...

Vue06

目录 一、声明式导航-导航链接 1.需求 2.解决方案 3.通过router-link自带的两个样式进行高亮 二、声明式导航的两个类名 1.router-link-active 2.router-link-exact-active 三、声明式导航-自定义类名&#xff08;了解&#xff09; 1.问题 2.解决方案 3.代码演示 四…...

AJAX笔记进阶篇

黑马程序员视频地址&#xff1a; AJAX-Day04-01.同步代码和异步代码https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p47 同步代码和异步代码 回调函数地狱与解决方法 回调函数地狱…...

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 循环类型】

文章目录 一、Shell 循环类型二、Shell while 循环三、Shell for 循环四、Shell until 循环五、Shell select 循环六、总结 一、Shell 循环类型 循环是一个强大的编程工具&#xff0c;使您能够重复执行一组命令。在本教程中&#xff0c;您将学习以下类型的循环 Shell 程序&…...

【Redis】安装配置Redis超详细教程 / Linux版

Linux安装配置Redis超详细教程 安装redis依赖安装redis启动redis停止redisredis.conf常见配置设置redis为后台启动修改redis监听地址设置工作目录修改密码监听的端口号数据库数量设置redis最大内存设置日志文件设置redis开机自动启动 学习视频&#xff1a;黑马程序员Redis入门到…...

S4 HANA明确税金汇差科目(OBYY)

本文主要介绍在S4 HANA OP中明确税金汇差科目(OBYY)相关设置。具体请参照如下内容&#xff1a; 1. 明确税金汇差科目(OBYY) 以上配置点定义了在外币挂账时&#xff0c;当凭证抬头汇率和税金行项目汇率不一致时&#xff0c;造成的差异金额进入哪个科目。此类情况只发生在FB60/F…...

Nginx反向代理 笔记250203

Nginx反向代理 Nginx 是一个高性能的 HTTP 服务器和反向代理服务器。反向代理是指客户端请求资源时&#xff0c;Nginx 作为中间层&#xff0c;将请求转发到后端服务器&#xff0c;并将后端服务器的响应返回给客户端。通过反向代理&#xff0c;可以实现负载均衡、缓存、SSL 终端…...

【ChatGPT:开启人工智能新纪元】

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒体界,还是咱们普通人的日常聊天里,都能听到它的大名。好多人都在讨论,这 ChatGPT 到底是个啥 “神器”,能让大家这么着迷?今天咱就好好唠唠。 ChatGPT,全称是 Chat Generative Pre-trained Trans…...

OpenAI 实战进阶教程 - 第六节: OpenAI 与爬虫集成实现任务自动化

爬虫与 OpenAI 模型结合&#xff0c;不仅能高效地抓取并分析海量数据&#xff0c;还能通过 NLP 技术生成洞察、摘要&#xff0c;极大提高业务效率。以下是一些实际工作中具有较高价值的应用案例&#xff1a; 1. 电商价格监控与智能分析 应用场景&#xff1a; 电商企业需要监控…...

49【服务器介绍】

服务器和你的电脑可以说是一模一样的&#xff0c;只不过用途不一样&#xff0c;叫法就不一样了 物理服务器和云服务器的区别 整台设备眼睛能够看得到的&#xff0c;我们一般称之为物理服务器。所以物理服务器是比较贵的&#xff0c;不是每一个开发者都能够消费得起的。 …...

docker pull Error response from daemon问题

里面填写 里面解决方案就是挂代理。 以虚拟机为例&#xff0c;将宿主机配置端口设置&#xff0c;https/http端口设为7899 配置虚拟机的http代理&#xff1a; vim /etc/systemd/system/docker.service.d/http-proxy.conf里面填写&#xff0c;wq保存 [Service] Environment…...

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…...

C++ Primer 标准库vector

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Mac本地部署DeekSeek-R1下载太慢怎么办?

Ubuntu 24 本地安装DeekSeek-R1 在命令行先安装ollama curl -fsSL https://ollama.com/install.sh | sh 下载太慢&#xff0c;使用讯雷&#xff0c;mac版下载链接 https://ollama.com/download/Ollama-darwin.zip 进入网站 deepseek-r1:8b&#xff0c;看内存大小4G就8B模型 …...

kamailio-ACC_JSON模块详解【后端语言go】

要确认 ACC_JSON 模块是否已经成功将计费信息推送到消息队列&#xff08;MQueue&#xff09;&#xff0c;以及如何从队列中取值&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 确认 ACC_JSON 已推送到队列 1.1 配置 ACC_JSON 确保 ACC_JSON 模块已正确配置并启用。以下…...

利用Python高效处理大规模词汇数据

在本篇博客中&#xff0c;我们将探讨如何使用Python及其强大的库来处理和分析大规模的词汇数据。我们将介绍如何从多个.pkl文件中读取数据&#xff0c;并应用一系列算法来筛选和扩展一个核心词汇列表。这个过程涉及到使用Pandas、Polars以及tqdm等库来实现高效的数据处理。 引…...

安装hami的笔记

k3s环境下安装hami提示如下错误&#xff1a; "failed to “StartContainer” for “kube-scheduler” with InvalidImageName: "Failed to apply default image tag “registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.31.2k3s1”: 没有Inva…...

2024美团春招硬件开发笔试真题及答案解析

目录 一、选择题 1、在 Linux,有一个名为 file 的文件,内容如下所示: 2、在 Linux 中,关于虚拟内存相关的说法正确的是() 3、AT89S52单片机中,在外部中断响应的期间,中断请求标志位查询占用了()。 4、下列关于8051单片机的结构与功能,说法不正确的是()? 5、…...

HTML 字符实体

HTML 字符实体 在HTML中,字符实体是一种特殊的表示方式,用于在文档中插入那些无法直接通过键盘输入的字符。字符实体在网页设计和文档编写中扮演着重要的角色,尤其是在处理特殊字符、符号和数学公式时。以下是关于HTML字符实体的详细解析。 字符实体概述 HTML字符实体是一…...

FPGA|生成jic文件固化程序到flash

1、单击file-》convert programming files 2、flie type中选中jic文件&#xff0c;configuration decive里根据自己的硬件选择&#xff0c;单击flash loader选择右边的add device选项 3、选择自己的硬件&#xff0c;单击ok 4、选中sof选项&#xff0c;单机右侧的add file 5、选…...

Java | CompletableFuture详解

关注&#xff1a;CodingTechWork CompletableFuture 概述 介绍 CompletableFuture是 Java 8 引入的一个非常强大的类&#xff0c;属于 java.util.concurrent 包。它是用于异步编程的一个工具&#xff0c;可以帮助我们更方便地处理并发任务。与传统的线程池或 Future 对比&…...

高阶开发基础——快速入门C++并发编程6——大作业:实现一个超级迷你的线程池

目录 实现一个无返回的线程池 完全代码实现 Reference 实现一个无返回的线程池 实现一个简单的线程池非常简单&#xff0c;我们首先聊一聊线程池的定义&#xff1a; 线程池&#xff08;Thread Pool&#xff09; 是一种并发编程的设计模式&#xff0c;用于管理和复用多个线程…...

deep generative model stanford lecture note3 --- latent variable

1 Introduction 自回归模型随着gpt的出现取得很大的成功&#xff0c;还是有很多工程上的问题并不是很适合使用自回归模型&#xff1a; 1&#xff09;自回归需要的算力太大&#xff0c;满足不了实时性要求&#xff1a;例如在自动驾驶的轨迹预测任务中&#xff0c;如果要用纯自回…...

【PDF提取局部内容改名】批量获取PDF局部文字内容改名 基于QT和百度云api的完整实现方案

应用场景 1. 档案管理 在企业或机构的档案管理中,常常会有大量的 PDF 格式的文件,如合同、报告、发票等。这些文件的原始文件名可能没有明确的标识,不利于查找和管理。通过批量获取 PDF 局部文字内容并改名,可以根据文件中的关键信息(如合同编号、报告标题等)为文件重新…...

吴恩达深度学习——卷积神经网络基础

本文来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 矩阵和张量边缘检测计算方式检测原理 Valid卷积和Same卷积卷积步长三维卷积单层卷积网络总结符号定义输入输出维度其他参数维度 举例 池化层示例输入层第一层卷积 - 池化第二层卷…...

MySQL锁详解

MySQL锁详解 数据库的锁机制锁的分类行级锁与表级锁行级锁之共享锁与排他锁乐观锁与悲观锁悲观锁乐观锁 Innodb存储引擎的锁机制行级锁与表级锁的使用区分三种行锁的算法死锁的问题多版本并发控制MVCC 数据库的锁机制 什么是锁&#xff1f;锁是一种保障数据的机制 为何要用锁…...

快速提升网站收录:利用网站用户反馈机制

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/59.html 利用网站用户反馈机制是快速提升网站收录的有效策略之一。以下是一些具体的实施步骤和建议&#xff1a; 一、建立用户反馈机制 多样化反馈渠道&#xff1a; 设立在线反馈表、邮件…...

初五,很棒

20元一瓶的水见过没&#xff1f;配料只有水和维C&#xff0c;养生佳品&#xff1f;除非我疯了。 今晚和大姨爹等人探讨成家问题。没错&#xff0c;我变成最应该成家的人了。 的确&#xff0c;从年龄上&#xff0c;发展阶段上&#xff0c;也是应该成家啦。 难道我不知道嘛。 人…...

Vue指令v-html

目录 一、Vue中的v-html指令是什么&#xff1f;二、v-html指令与v-text指令的区别&#xff1f; 一、Vue中的v-html指令是什么&#xff1f; v-html指令的作用是&#xff1a;设置元素的innerHTML&#xff0c;内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…...

ubuntu磁盘扩容

ubuntu磁盘扩容 描述先在虚拟机设置里面扩容进入Ubuntu 配置使用命令行工具parted进行分区输出如下完成 描述 执行命令,查看 fs 类型是什么 lsblk -o NAME,FSTYPE,MOUNTPOINT将60G扩容到100G&#xff0c;其中有些操作我也不知道什么意思&#xff0c;反正就是成功了&#xff0…...

BFS(广度优先搜索)——搜索算法

BFS&#xff0c;也就是广度&#xff08;宽度&#xff09;优先搜索&#xff0c;二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS&#xff08;深度优先搜索&#xff09;。从字面意思也很好理解&#xff0c;DFS就是一条路走到黑&#xff0c;BFS则是一层一层地展开。…...

SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求(定期开票)

上两章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…...

string例题

一、字符串最后一个单词长度 题目解析&#xff1a;由题输入一段字符串或一句话找最后一个单词的长度&#xff0c;也就是找最后一个空格后的单词长度。1.既然有空格那用我们常规的cin就不行了&#xff0c;我们这里使用getline,2.读取空格既然是最后一个空格后的单词&#xff0c;…...

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

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

浏览器模块化难题

CommonJS 的工作原理 当使用 require(模块路径) 导入一个模块时&#xff0c;node会做以下两件事情&#xff08;不考虑模块缓存&#xff09;&#xff1a; 通过模块路径找到本机文件&#xff0c;并读取文件内容将文件中的代码放入到一个函数环境中执行&#xff0c;并将执行后 m…...

详细介绍:网站背景更换功能

目录 1. HTML 部分 2. JavaScript 部分 3. 完整流程 4. 总结 5. 适用场景 本文将介绍如何通过文件上传实现网站背景图片的更换。通过使用 JavaScript 和 Axios&#xff0c;我们可以允许用户上传图片文件并将其作为网站的背景图片。上传的图片 URL 会保存在浏览器的 localSt…...

w190工作流程管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

Linux——文件系统

一、从硬件出发 1&#xff09;磁盘的主要构成 通常硬盘是由盘片、主轴、磁头、摇摆臂、马达、永磁铁等部件组成&#xff0c;其中一个硬盘中有多块盘片和多个磁头&#xff0c;堆叠在一起&#xff0c;工作时由盘片旋转和摇摆臂摇摆及逆行寻址从而运作&#xff0c;磁头可以对盘片…...

傅里叶分析之掐死教程

https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复杂了&#xff0c;所以很多…...