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

C#面向对象之访问限制,类基础,继承

文章目录

  • 1 访问限制
    • 1.1 简介
  • 2 类基础讲解
    • 2.1 类定义
    • 2.2 构造函数
      • 2.2.1 构造函数
      • 2.2.2 静态构造函数
      • 2.2.3 初始化顺序
      • 2.2.4 对象初始化器
    • 2.3 析构函数
    • 2.4 类的静态成员
    • 2.5 匿名对象
      • 2.5.1 定义
      • 2.5.2 匿名对象的创建
  • 3 继承
    • 3.1 基类和派生类
    • 3.2 基类初始化
    • 3.3 Partial类
      • 3.3.1 定义
      • 3.3.2 partial 类
      • 3.3.3 partial 方法

1 访问限制

1.1 简介

C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。
一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:

  • public:所有对象都可以访问;
    允许一个类将其成员变量和成员函数暴露给其他的函数和对象
  • private:对象本身在对象内部可以访问;
    允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员
  • protected:只有该类对象及其子类对象可以访问
    允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承
  • internal:同一个程序集(即:一个项目内)的对象可以访问;
    允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有 internal 访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
  • protected internal:访问限于当前程序集或派生自包含类的类型。
    访问修饰符允许在本类,派生类或者包含该类的程序集中访问。这也被用于实现继承
    即:不仅限于当前程序集内的类型和成员,还包括所有继承自该类型的子类,无论子类是否在同一个程序集内
  • fileC# 11 中引入了一个新的关键字 file,用于声明文件作用域的成员。这意味着被标记为 file 的成员只能在声明它们的文件中访问,主要用于限制代码的可见性,确保某些类或成员只在当前文件中使用,提高模块化和封装性
    private 区别:
    • private:是限制在类或结构体内,可以应用于类、结构体的成员(字段、方法、属性等)
    • file:限制在文件内,可以应用于类、结构体、接口、枚举、委托等顶级声明。

在这里插入图片描述

2 类基础讲解

2.1 类定义

类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。下面是类定义的一般形式:

<access specifier> class  class_name
{// member variables<access specifier> <data type> variable1;<access specifier> <data type> variable2;...<access specifier> <data type> variableN;// member methods<access specifier> <return type> method1(parameter_list){// method body}<access specifier> <return type> method2(parameter_list){// method body}...<access specifier> <return type> methodN(parameter_list){// method body}
}

注意:

  • 访问标识符 <access specifier> 指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private
  • 数据类型 <data type> 指定了变量的类型,返回类型 <return type> 指定了返回的方法返回的数据类型。
  • 如果要访问类的成员,要使用点(.)运算符。点运算符链接了对象的名称和成员的名称。

2.2 构造函数

2.2.1 构造函数

类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行。
构造函数的名称类的名称完全相同,它没有任何返回类型

默认的构造函数没有任何参数。但是如果需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。可以在创建对象的同时给对象赋初始值

using System;
namespace LineApplication
{class Line{private double length;   // 线条的长度public Line(double len)  // 参数化构造函数{Console.WriteLine("对象已创建,length = {0}", len);length = len;}public void setLength( double len ){length = len;}public double getLength(){return length;}static void Main(string[] args){Line line = new Line(10.0);Console.WriteLine("线条的长度: {0}", line.getLength());// 设置线条长度line.setLength(6.0);Console.WriteLine("线条的长度: {0}", line.getLength());Console.ReadKey();}}
}

2.2.2 静态构造函数

C# 中存在一种叫做静态构造函数(static constructor)的特殊构造函数,虽然它与实例构造函数不同,但依然被称为构造函数,且可以使用 static 修饰。静态构造函数用于初始化静态成员,并在类被加载时自动执行一次。
静态构造函数静态方法或字段类似,属于类本身,而不属于类实例
静态构造函数的特点:

  • 只能被定义一次:每个类只能有一个静态构造函数。
  • 无访问修饰符:静态构造函数不能有访问修饰符(如 public、private 等),因为它的访问是由系统控制的。
  • 不能带参数:静态构造函数不接受参数。
  • 自动调用:静态构造函数在类的静态成员首次被访问时,或类的实例被首次创建时自动调用,仅执行一次。
  • 执行时机:在类的静态成员首次被访问时或类的第一个实例被创建时自动执行
using System;
public class MyClass
{// 静态字段public static int StaticValue;// 静态构造函数static MyClass(){Console.WriteLine("静态构造函数被调用");StaticValue = 42; // 初始化静态字段}// 实例构造函数public MyClass(){Console.WriteLine("实例构造函数被调用");}
}
public class Program
{public static void Main(){Console.WriteLine("第一次创建对象");MyClass obj1 = new MyClass();Console.WriteLine("第二次创建对象");MyClass obj2 = new MyClass();   Console.WriteLine($"StaticValue = {MyClass.StaticValue}");}
}
结果:
第一次创建对象
静态构造函数被调用
实例构造函数被调用
第二次创建对象
实例构造函数被调用
StaticValue = 42

2.2.3 初始化顺序

C# 中,静态初始化和继承的初始化遵循一定的顺序。对于有继承关系的类,在初始化时遵循以下规则:

  • 静态构造函数与实例构造函数的执行顺序
    在一个继承层次结构中:
    • 静态构造函数优先于实例构造函数执行。
    • 静态构造函数只会在该类的任何成员首次被访问时执行一次。
    • 父类的静态构造函数会先于子类的静态构造函数执行。
  • 执行顺序概述
    • 基类的静态构造函数 (只执行一次,且在第一次访问时)。
    • 子类的静态构造函数 (只执行一次,且在第一次访问时)。
    • 基类的实例构造函数 (每次实例化时都执行)。
    • 子类的实例构造函数 (每次实例化时都执行)。

注意:

  • 静态构造函数无访问修饰符:静态构造函数没有访问修饰符,且不能带参数。
  • 控制静态构造的执行时机:静态构造函数在类的任何静态成员实例成员首次被调用时执行。
  • 子类静态成员不会触发父类的实例构造函数:只有当实例化类时才会触发实例构造函数
using System;public class BaseClass
{// 静态构造函数static BaseClass(){Console.WriteLine("BaseClass: 静态构造函数");}// 实例构造函数public BaseClass(){Console.WriteLine("BaseClass: 实例构造函数");}
}public class DerivedClass : BaseClass
{// 静态构造函数static DerivedClass(){Console.WriteLine("DerivedClass: 静态构造函数");}// 实例构造函数public DerivedClass(){Console.WriteLine("DerivedClass: 实例构造函数");}
}public class Program
{public static void Main(){Console.WriteLine("第一次创建 DerivedClass 对象");DerivedClass obj1 = new DerivedClass();Console.WriteLine("\n第二次创建 DerivedClass 对象");DerivedClass obj2 = new DerivedClass();}
}
结果:
第一次创建 DerivedClass 对象
BaseClass: 静态构造函数
DerivedClass: 静态构造函数
BaseClass: 实例构造函数
DerivedClass: 实例构造函数第二次创建 DerivedClass 对象
BaseClass: 实例构造函数
DerivedClass: 实例构造函数

2.2.4 对象初始化器

new 关键字后使用大括号 {} 进行对象初始化。这种方式称为对象初始化器(object initializer),允许在创建对象时直接初始化其属性或字段。使用对象初始化器的语法简洁、方便,特别适合在构造函数之外进行属性的直接赋值

对象初始化器的特点:

  • 无需构造函数:对象初始化器不要求类提供特定的构造函数,且允许在对象实例化时直接为公开的属性或字段赋值。
  • 与默认构造函数兼容:它只会调用类的默认构造函数,但依然允许在构造函数完成后进一步初始化属性。
  • 集合初始化器C# 还支持集合初始化器,这是一种对象初始化器的扩展,用于初始化集合类型的元素。

适用场景:

  • 简单赋值:适合在对象创建时进行基本的属性赋值。
  • 更清晰的代码:将对象创建与属性初始化合并到一起,使代码更加简洁明了。
  • 避免重复代码:尤其适合在不需要复杂初始化逻辑的场景下,省去了显式调用设置方法或构造函数的代码。

对象示例:

public class Person
{public string Name { get; set; }public int Age { get; set; }
}public class Program
{public static void Main(){// 使用对象初始化器创建并初始化对象Person person = new Person{Name = "Alice",Age = 30};Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");}
}

集合示例:

using System;
using System.Collections.Generic;public class Person
{public string Name { get; set; }public int Age { get; set; }
}public class Program
{public static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 35 }};foreach (var person in people){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");}}
}

2.3 析构函数

类的 析构函数 是类的一个特殊的成员函数,当类的对象超出范围时执行。
析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数
析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载

using System;
namespace LineApplication
{class Line{private double length;   // 线条的长度public Line()  // 构造函数{Console.WriteLine("对象已创建");}~Line() //析构函数{Console.WriteLine("对象已删除");}public void setLength( double len ){length = len;}public double getLength(){return length;}static void Main(string[] args){Line line = new Line();// 设置线条长度line.setLength(6.0);Console.WriteLine("线条的长度: {0}", line.getLength());          }}
}

2.4 类的静态成员

我们可以使用 static 关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。

关键字 static 意味着类中只有一个该成员的实例。静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。静态变量可在成员函数或类的定义外部进行初始化。也可以在类的定义内部初始化静态变量。
也可以把一个成员函数声明为 static。这样的函数只能访问静态变量。静态函数在对象被创建之前就已经存在。

using System;
namespace StaticVarApplication
{class StaticVar{public static int num;public void count(){num++;}public static int getNum(){return num;}}class StaticTester{static void Main(string[] args){StaticVar s = new StaticVar();s.count();s.count();s.count();                  Console.WriteLine("变量 num: {0}", StaticVar.getNum());Console.ReadKey();}}
}

2.5 匿名对象

2.5.1 定义

C# 中,匿名对象(anonymous type)是一种没有明确定义类名称的对象,通常在不需要为对象创建完整的类定义时使用。匿名对象的典型场景是临时存储数据,特别是在查询结果和临时数据封装时使用。

匿名对象的特点:

  • 只读属性:匿名对象的所有属性都是只读的,一旦创建,属性值就不能更改。
  • 类型安全:虽然是匿名对象,但它具有静态类型安全,编译器会自动生成类型。
  • 自动推断属性类型:编译器根据初始化的值自动推断属性类型。
  • 仅在本地作用域使用:匿名对象通常用于临时场景,例如查询结果、局部范围的数据传递等,不适合作为类成员或方法返回类型。
  • 不可变性:匿名对象的每个属性在初始化后不能更改,匿名对象本身也是不可变的。

使用场景:

  • LINQ 查询:在 LINQ 查询中,匿名对象常用于封装查询结果。
  • 数据转换:可以将不同数据源的数据转换为简单结构的匿名对象,便于局部范围的数据传递。

注意:

  • 只读特性:匿名对象的属性是只读的,适合用于不需要修改的临时数据。
  • 作用范围:匿名对象最好仅在方法或局部范围中使用,因为其类型名称是由编译器生成的,无法在类或接口中返回匿名类型。

2.5.2 匿名对象的创建

匿名对象使用 new 关键字创建,属性名和属性值直接在大括号 {} 中指定。因为匿名对象没有类名,所以只能通过属性名访问其数据成员。

示例

var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");

在上面的代码中,person 是一个匿名对象,包含两个属性 Name 和 Age。使用 var 关键字声明匿名对象的变量类型,因为匿名类型没有显式的类型名称。

LINQ 查询示例

using System;
using System.Collections.Generic;
using System.Linq;public class Program
{public static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 35 }};// 使用 LINQ 查询生成匿名对象列表var selectedPeople = from p in peoplewhere p.Age > 28select new { p.Name, p.Age };foreach (var person in selectedPeople){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");}}
}public class Person
{public string Name { get; set; }public int Age { get; set; }
}

3 继承

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。
继承的思想实现了 属于(IS-A) 关系

3.1 基类和派生类

一个类可以继承自另一个类,被称为基类(父类)派生类(子类)
C# 不支持类的多重继承,但支持接口的多重继承,一个类可以实现多个接口。
概括来说:一个类可以继承多个接口,但只能继承自一个类。

派生类会继承基类的成员(字段、方法、属性等),除非它们被明确地标记为私有(private)。
派生类可以通过关键字base来调用基类的构造函数和方法。

class BaseClass
{public void SomeMethod(){// Method implementation}
}class DerivedClass : BaseClass
{public void AnotherMethod(){// Accessing base class methodbase.SomeMethod();       // Method implementation}
}

3.2 基类初始化

派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。可以在成员初始化列表中进行父类的初始化。
含有父类的初始化语法:public SonClass(string str) : base(s)

using System;
namespace RectangleApplication
{class Rectangle{// 成员变量protected double length;protected double width;public Rectangle(double l, double w){length = l;width = w;}public double GetArea(){return length * width;}public void Display(){Console.WriteLine("长度: {0}", length);Console.WriteLine("宽度: {0}", width);Console.WriteLine("面积: {0}", GetArea());}}//end class Rectangle  class Tabletop : Rectangle{private double cost;public Tabletop(double l, double w) : base(l, w){ }public double GetCost(){double cost;cost = GetArea() * 70;return cost;}public void Display(){base.Display();Console.WriteLine("成本: {0}", GetCost());}}class ExecuteRectangle{static void Main(string[] args){Tabletop t = new Tabletop(4.5, 7.5);t.Display();Console.ReadLine();}}
}

3.3 Partial类

3.3.1 定义

partial 关键字用于将一个结构方法的定义拆分到多个文件中。通过这种方式,多个开发者可以同时在不同文件中对同一个类进行扩展,而不需要合并代码到一个文件中。partial 提供了灵活性和可维护性,尤其适合复杂项目和自动生成代码的场景,可以减少派生类

partial的用途:

  • 分离类定义:允许一个类的代码分布在多个文件中。
  • 自动生成代码的支持:通常用于工具或框架自动生成部分代码,而开发者可以在另一个文件中扩展该类。
  • 逻辑分离:将不同功能的实现分布到多个文件,便于代码组织。
  • 分工协作:多个开发者可以同时对同一个类进行开发,而不需要合并代码。

使用规则:

  • 类、结构或方法可以被标记为 partial
  • 必须在相同的命名空间中定义。
  • 必须具有相同的访问修饰符(如 public、private 等)。
  • 所有部分必须组合为一个完整的类型,最终编译为一个类、结构或方法
  • partial 方法不能有访问修饰符(默认为 private)。
  • 不能声明为 static、virtual、abstract、override
  • 不能定义为 extern 方法。
  • 只能出现在 partial 类型中。

3.3.2 partial 类

假设你有一个类 Person,可以将其定义拆分到两个文件中。

文件 1: Person.Part1.cs

namespace MyApplication
{public partial class Person{public string FirstName { get; set; }public string LastName { get; set; }}
}

文件 2: Person.Part2.cs

namespace MyApplication
{public partial class Person{public string GetFullName(){return $"{FirstName} {LastName}";}}
}

使用代码:

using MyApplication;class Program
{static void Main(){Person person = new Person{FirstName = "John",LastName = "Doe"};Console.WriteLine(person.GetFullName());}
}
输出:
John Doe

3.3.3 partial 方法

除了类和结构,C# 还支持 partial 方法,允许方法声明和实现分开。

文件 1: PartialMethodExample.Part1.cs

public partial class PartialMethodExample
{partial void OnAction(); // 声明部分方法public void TriggerAction(){OnAction(); // 调用部分方法}
}

文件 2: PartialMethodExample.Part2.cs

public partial class PartialMethodExample
{partial void OnAction() // 实现部分方法{Console.WriteLine("Partial method executed.");}
}

使用代码:

class Program
{static void Main(){PartialMethodExample example = new PartialMethodExample();example.TriggerAction();}
}
输出:Partial method executed.

注意:

  • 如果没有提供 partial 方法的实现,调用该方法时会被编译器优化掉,不会产生任何影响。
  • partial 方法必须是 void 类型,不能有返回值。

相关文章:

C#面向对象之访问限制,类基础,继承

文章目录 1 访问限制1.1 简介 2 类基础讲解2.1 类定义2.2 构造函数2.2.1 构造函数2.2.2 静态构造函数2.2.3 初始化顺序2.2.4 对象初始化器 2.3 析构函数2.4 类的静态成员2.5 匿名对象2.5.1 定义2.5.2 匿名对象的创建 3 继承3.1 基类和派生类3.2 基类初始化3.3 Partial类3.3.1 定…...

科研小白成长记41——享受大起大落

一直内心对自己的定位是喜欢安安静静生活的人&#xff0c;但是朋友提醒我我的生活一直都是出于各种冒险之中&#xff0c;从GAP申博&#xff0c;到GAP找工作&#xff0c;都不是一个乐于安于现状的人会做出来的。仔细想想不无道理&#xff0c;既然如此&#xff0c;那就如享受安静…...

正则表达式笔记

一、基本正则 常见元字符 元字符说明^以某个字符开头$以某个字符结尾.匹配任意单字符*对前一项进行0次或者多次重复匹配{m,n}将前一项字符重复m-n次&#xff0c;{m,},{,n},{m&#xff0c;n}[]对方括号内的单字符进行匹配[^]不匹配方括号内的单字符^[]匹配以某个字符开头的行(…...

解决本地运行SuperPoint_SLAM报错ERROR: flag ‘flagfile‘ was defined more than once

解决本地运行SuperPoint_SLAM报错ERROR: flag flagfile was defined more than once 起因使用LD_DEBUG排查链接过程用ldd查看各自链接的库解决办法问题解决 起因 在之前本地编译了opencv-3.4.2&#xff0c;当时因为contrib模块需要gflags&#xff0c;重新下载了一个gflags在本…...

springboot信息化在线教学平台的设计与实现(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息化在线教学平台的方案。文章介绍了信息化在线教…...

maxun爬虫工具docker搭建

思路来源开源无代码网络数据提取平台Maxun 先把代码克隆到本地&#xff08;只有第一次需要&#xff09; git clone https://github.com/getmaxun/maxun.git 转到maxun目录 cd maxun 启动容器 docker-compose --env-file .env up -d 成功启动六个容器 网址 http://local…...

高效 Python Web 开发:FastAPI 入门与实践

高效 Python Web 开发&#xff1a;FastAPI 入门与实践 目录 ✨ 1. 安装与环境配置 &#x1f4e6; 安装 FastAPI 和 Uvicorn&#x1f5c2;️ 项目目录结构和初始化&#x1f680; 创建一个简单的 FastAPI 项目 &#x1f6e0;️ 2. FastAPI 路由与请求处理 &#x1f6e3;️ 基本…...

C++中的函数重载

函数重载是指在同一个作用域&#xff08;通常是一个类或者一个命名空间&#xff09;内&#xff0c;可以有多个同名函数&#xff0c;但是这些同名函数的参数列表&#xff08;参数的个数、类型或者顺序&#xff09;不同。当调用这个函数名时&#xff0c;编译器会根据传入的实际参…...

达梦数据库常用指令都是工作中常用的

达梦数据库连接配置文件名称 cd /etc/dm_svc.conf查询 sql 日志记录是否开启&#xff1a;0 关闭&#xff0c;1/2/3开启); select SF_GET_PARA_VALUE(1,SVR_LOG)union ALL select SF_GET_PARA_VALUE(2,SVR_LOG);关闭 sql 日志记录功能 call SP_SET_PARA_VALUE(1,SVR_LOG,0);开…...

【2024最新】基于Springboot+Vue的就业信息管理系统Lw+PPT

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…...

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本&#xff1a; 脚本已和当前文章绑定&#xff0c;请移步下载&#xff08;免费&#xff01;免费&#xff01;免费&#xff01;&#xff09; &#xff08;单纯的分享&#xff01;&#xff09; 步骤&#xff1a; 将文件/内容上传到终端中 …...

修改MySQL数据库密码报1290

修改MySQL数据库密码报1290 错误 如下&#xff1a; alter user ‘root’‘localhost’ identified by ‘root’; ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 需要刷新下配置 flush privileg…...

OpenCV4.8 开发实战系列专栏之 17 - 图像直方图

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;领学习资料(Free) & 进专栏答疑群&#xff0c; VX&#xff1a; OpenCVXueTang_Asst 本文关键知识点&#xff1a;图…...

Linux下如何安装JDK

在Linux系统上安装JDK&#xff08;Java Development Kit&#xff09;&#xff0c;通常包括下面步骤&#xff1a; 下载JDK安装包解压安装包配置环境变量等 在介绍安装之前&#xff0c;先厘清一些常用问题。 Linux 下Java 安装到哪个目录比较好&#xff1f; 在Linux系统下&am…...

实时数据开发|Flink如何实现不同数据源输入--DataSource模块

DataStream 编程模型 Flink定义DataStream API让用户灵活且高效的编写流式应用。主要分为3部分&#xff1a;DataSource模块&#xff0c;Transformation模块以及DataSink模块。 DataSource模块&#xff0c;主要定义了数据接入功能&#xff0c;将外部数据接入至flink&#xff0…...

使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet

文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中&#xff0c;我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG&#xff08;检索增强生成&#xff09;应用 这个效果确实很差。 我们一起来看看&#xff0c;该怎么改进。 今天我们就尝试一下&…...

GPT模型:改变世界的AI魔法师

目录 一、什么是GPT&#xff1f;它是怎么来的&#xff1f; 二、GPT能干啥&#xff1f;&#xff08;它简直无所不能&#xff01;&#xff09; 三、想用GPT&#xff1f;这点开发技巧你一定要知道&#xff01; 第一步&#xff1a;用OpenAI API搭建自己的GPT服务 第二步&#x…...

初识ProtoBuf以及环境搭建(Win和Ubuntu)

初始ProtoBuf 序列化和反序列化的概念 序列化&#xff1a;把对象转换为字节序列的过程 称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化和反序列化&#xff1f; 存储数据&#xff1a;当你想把的内存中的对象状…...

H3C OSPF实验

实验拓扑 实验需求 按照图示配置 IP 地址按照图示分区域配置 OSPF &#xff0c;实现全网互通为了路由结构稳定&#xff0c;要求路由器使用环回口作为 Router-id&#xff0c;ABR 的环回口宣告进骨干区域 实验解法 一、配置IP地址 [R1]int l0 [R1-LoopBack0]ip add 1.1.1.1 32 […...

【Spark源码分析】基于Spark3.4.2源码分析SparkSQL执行过程

基于Spark3.4.2源码分析SparkSQL执行过程 文章目录 基于Spark3.4.2源码分析SparkSQL执行过程基本执行流程Unresolved逻辑计划树相关类RuleExector相关类 详细代码SparkSessionAbstractSqlParserDatasetQueryExecutionAnalyzerRuleExecutorCheckAnalysis 附录CTE简述SQL解析器Qu…...

centos8:Could not resolve host: mirrorlist.centos.org

【1】错误消息&#xff1a; [rootcentos211 redis-7.0.15]# yum update CentOS Stream 8 - AppStream …...

超详细ensp配置VRRP和MSTP协议

一、简介 1、什么是VRRP&#xff1a; &#xff08;1&#xff09;VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;的概念&#xff1a; VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;指的是一种实现路由器冗余备份的协议&#xff0c;常用于…...

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口&#xff08;由 window assigner 定义&#xff09;何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要&#xff0c;你可以在 trigger(…) 调用中指定自定义的 tr…...

为啥不推荐使用数据库外键

为啥不推荐使用数据库外键 前言 在阿里开发手册中写道&#xff1a;不得使用外键与级联&#xff0c;一切外键概念必须在应用层解决。 说明&#xff1a;&#xff08;概念解释&#xff09;学生表中的 student_id 是主键&#xff0c;那么成绩表中的 student_id 则为外键。如果更…...

C# 13 中的新增功能

C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C&#xff03;7.0中有哪些新特性&#xff1f;C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...

sunshine+moonlight

参考自 b站视频 电脑端&#xff08;发送端&#xff09; 去 sunshine github 下载 https://github.com/LizardByte/Sunshine/releases/tag/v2024.1127.551下载后打开&#xff0c;创建用户名和密码修改配置选项&#xff0c;启用 UPnP&#xff0c;IP 地址族使用 IPv4IPv6 平板端…...

Python练习题合集

目录 一. 请编程输出其中 “超过平均身高” 的那些值。 二. 字典处理&#xff1a; 三. 求斐波那契数列的前若干项 四. 编程输出最长字符串的长度。 五. 去掉一个最高分&#xff0c;去掉一个最低分&#xff0c;其余分求平均作为最终分数。 六. 打印小九九乘法表 七.…...

frp 内网穿透

文章目录 前言使用自己的服务器搭建frp 这里服务器是linux centos 7 宝塔&#xff0c;client是 windows10 https://github.com/fatedier/frp/releases/tag/v0.53.2 版本下载分客户端与服务端 一、frp是什么&#xff1f;二、使用步骤1.部署服务器端2.客户端 前言 使用自己的服务…...

Vue3 子路由vue如何调用父路由vue中的方法?

1. router -> index.ts 文件&#xff1a; import { createRouter, createWebHistory } from vue-router import DefaultView from /views/default/index.vue import ParentView from /views/parent/index.vue import ChildView from /views/child/index.vueconst router …...

Docker 清理镜像策略详解

文章目录 前言一、删除 Docker 镜像1. 查看当前镜像2. 删除单个镜像3. 删除多个镜像4. 删除所有未使用的镜像5. 删除悬空的 Docker 镜像6. 根据模式删除镜像7. 删除所有镜像 二、删除 Docker 容器1. 查找容器2. 删除一个或多个特定容器3. 退出时删除容器4. 删除所有已退出的容器…...

Qt自定义 Qt Designer 插件

创建 Qt Designer 插件项目 Qt 提供两种设计插件的 API&#xff0c;可以用于扩展 Qt 的功能。高级 API 用于设计插件以扩展 Qt 的功能&#xff0c;例如定制数据库驱动、图像格式、文本编码、定制样式等。Qt Designer 里大量采用了插件&#xff0c;点击 Qt Creator 的“Help”-…...

【C语言】扫雷游戏(一)

我们先设计一个简单的9*9棋盘并有10个雷的扫雷游戏。 1&#xff0c;可以用数组存放&#xff0c;如果有雷就用1表示&#xff0c;没雷就用0表示。 2&#xff0c;排查(2,5)这个坐标时&#xff0c;我们访问周围的⼀圈8个位置黄色统计周围雷的个数是1。排查(8,6)这个坐标时&#xf…...

ESP32-S3模组上跑通ES8388(12)

接前一篇文章&#xff1a;ESP32-S3模组上跑通ES8388&#xff08;11&#xff09; 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第5段代码&#xff0c;本回继续往下解析。为了便于理解和回顾&#xff0c;再次贴出es8388_init函数源码&#xff0c;在…...

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球…...

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: A Token-level Contrastiv…...

多线程篇-9--锁的使用及分类(可重入锁,读写锁,锁降级,死锁,LockSupport,乐观锁,悲观锁,分段锁等)

1、锁的概述 Java 中&#xff0c;锁是一种用于控制多线程并发访问共享资源的机制。合理的锁机制可以确保线程安全&#xff0c;避免数据竞争和不一致的问题。 Java 提供了多种锁机制&#xff0c;包括内置锁&#xff08;即 synchronized 关键字&#xff09;、显式锁&#xff08;…...

提升阅读体验,Balabolka让文字跃然“声”上

作为一个专业的语音合成工具&#xff0c;Balabolka为用户提供了全方位的文本朗读解决方案。这款软件不仅可以将各类文本实时转换为清晰的语音输出&#xff0c;还能将转换后的音频内容导出为多种主流格式。它强大的兼容性使其能够处理各类电子书和文档格式&#xff0c;让用户可以…...

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…...

嵌入式C编程:宏定义与typedef的深入对比与应用

目录 一、宏定义&#xff08;Macro Definition&#xff09; 1.1. 特点与应用 1.1.1 定义常量 1.1.2 定义函数式宏 1.1.3 条件编译 1.2. 作用范围和生命周期方面 1.3. 应用注意事项 二、typedef 2.1. 特点与应用 2.1.1 简化类型声明 2.1.2 提高代码可读性 2.1.3 实现…...

算法复杂度

目录&#xff1a; 算法的效率时间复杂度 1.算法的效率 1.1旋转数组习题分析 如何衡量一个算法的好坏呢&#xff1f; 案例&#xff1a;旋转数组&#xff08;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;&#xff09; 思路&#xff1a;循环k次将所有元素向后移动一…...

时序约束进阶六:Set_Clock_Groups详解

目录 一、前言 二、时钟间关系 2.1 时钟关系分类 2.2 时钟关系查看 三、set_clock_groups设置 3.1 使用格式 3.2 优先级 3.3 约束设置示例 3.4 约束效果查看 四、Exclusive差异说明 4.1 Asynchronous 4.2 Logically_exclusive与Physically_exclusive 4.3 logical…...

《运放秘籍》第二部:仪表放大器专项知识点总结

一、差分放大器与仪表放大器的讨论 1.1. 仪放的前世今生——差分放大器原理&#xff1f; 1.2. 差分放大的原理 1.3. 差分放大器检测电流 1.4. 差分放大器端一&#xff1a;输入阻抗 1.5. 差分放大器端二&#xff1a;共模抑制比 1.6. 为什么关注输入阻抗&#xff1f;共模抑…...

JavaSE——异常

一、异常的概念 在Java中&#xff0c;将程序执行中发生的不正常行为称为"异常"&#xff0c;开发过程中的语法错误和逻辑错误不是异常。 主要分为以下两大类&#xff1a; Error(错误)&#xff1a;Java虚拟机无法解决的严重问题&#xff0c;是严重错误&#xff0c;程序…...

HormonyOS: 图形变换之Rotate

官网地址&#xff1a;rotate 1. 概述 rotate是鸿蒙系统为组件提供的旋转属性&#xff0c;通过rotate属性&#xff0c;可实现组件的旋转效果 2. rotate属性 2.1. 语法参数 rotate(value: RotateOptions) 参数&#xff1a; 参数名 类型 必填 说明 value RotateOptions…...

【Solidity】入门指南:智能合约开发基础

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Solidity入门指南&#xff1a;智能合约开发基础引言1. 开发环境搭建1.1 Remix I…...

HTMLHTML5革命:构建现代网页的终极指南 - 3. 开发工具选择

HTML&HTML5革命&#xff1a;构建现代网页的终极指南 3. 开发工具选择 大家好&#xff0c;我是莫离老师。 前两节课我们学习了 HTML 的基础概念和 HTML5 的主要特性&#xff0c;为接下来的实际开发奠定了理论基础。 今天&#xff0c;我们将讨论开发工具的选择问题。 选择合…...

智能设备安全隐患:五项关键解决措施

目前&#xff0c;我们的智能设备越来越多&#xff0c;而背后的物联网&#xff08;IoT&#xff09;安全像一面隐形的盾牌&#xff0c;默默地守护着我们周围那些复杂连网的设备。 为了让大家更加明白这些安全协议和操作是如何高效运作的&#xff0c;我们有必要深入探讨物联网安全…...

Android NDK开发 JNI 基础

在android 系统开发中 ndk开发是很重要的内容。ndk开发中 jni 是基础。 目录 一&#xff0e;什么是JNI 二. 如何使用JNI 1.Java 代码如何调用 c/c 代码 2. c/c如何调用 java 函数 一&#xff0e;什么是JNI JNI——Java Native Interface&#xff0c;它是Java平台的一个特…...

嵌入式linux之文件系统管理

嵌入式Linux文件系统的管理涉及多个方面&#xff0c;包括文件系统的创建、配置、维护以及优化。以下是一些关键点和实践技巧&#xff1a; 文件系统的创建与配置 选择合适的文件系统&#xff1a;根据应用需求&#xff08;如读写频率、存储介质类型等&#xff09;选择最合适的文…...

Y20030029 微信+SPRINGBOOT+MYSQL+LW+传统文化展示小程序的设计与实现 源代码 配置 文档

传统文化展示小程序 1.项目描述2. 课题开发的背景与意义3.项目功能4.界面展示5.源码获取 1.项目描述 基于微信小程序的传统文化展示小程序是一个集合了多种传统文化元素与现代化技术的创新平台。它充分利用了微信小程序的便捷性和普及性&#xff0c;为广大用户提供了一个深入了…...