C# 结构体
总目录
前言
在 C# 编程中,结构体(struct)是一种非常重要的数据结构,它为我们提供了一种轻量级的存储和操作数据的方式。本教程将带你深入了解结构体的概念、特点、使用方法,以及一些使用结构体的最佳实践。
一、什么是结构体(struct)?
1. 基本概念
-
结构体(struct)是一种可封装数据和相关功能的值类型,使用 struct 关键字定义结构体。
-
它可以包含多个不同类型的成员,如字段、属性、方法、索引器和构造函数等
-
与类(class)不同,结构体存储在栈(stack)上,而不是堆(heap)上,这使得它们在某些场景下具有更高的性能优势,特别是对于小型数据的存储和操作。
-
通常,可以使用结构类型来设计以数据为中心的较小类型,这些类型只有很少的行为或没有行为。 例如,.NET 使用结构类型来表示数字(整数和实数)、布尔值、Unicode 字符以及时间实例。 如果侧重于类型的行为,请考虑定义一个类。
-
由于结构类型具有值语义,因此建议定义不可变的结构类型。
2. 定义结构体
结构体的定义使用struct关键字,后面跟着结构体的名称。你可以在结构体中定义各种成员,包括字段、属性、方法和构造函数。如下所示:
public struct Point
{public int X { get; set; }public int Y { get; set; }public Point(int x, int y){X = x;Y = y;}public void Print(){Console.WriteLine($"Point: ({X}, {Y})");}
}public struct Rectangle
{// 字段public int Width;public int Height;// 属性public int Perimeter{get { return 2 * (Width + Height); }}// 构造函数public Rectangle(int width, int height){Width = width;Height = height;}// 方法public int Area(){return Width * Height;}
}
3. 使用结构体
使用结构体与使用类类似,但由于结构体是值类型,它们的行为有所不同:
class Program
{static void Main(){// 实例化结构体Point point = new Point();//一旦创建了结构体实例,就可以像访问类成员一样访问其字段和方法:point.X = 10;point.Y = 20;Console.WriteLine($"Point: ({point.X}, {point.Y})");// 使用结构体的构造函数Rectangle rectangle = new Rectangle(5, 3);//一旦创建了结构体实例,就可以像访问类成员一样访问其字段和方法:Console.WriteLine($"Rectangle Area: {rectangle.Area()}");Console.WriteLine($"Rectangle Perimeter: {rectangle.Perimeter}");}
}
使用default
初始化 结构体
Point point3 = default(Point); // C# 7.1 及以上版本
二、结构体详解
1. 构造函数
1)默认构造函数
结构体有一个隐式的默认构造函数,它会将所有字段初始化为它们的默认值。你也可以显式地定义构造函数,但不能同时有默认构造函数和无参数的构造函数:
struct Person
{public string Name;public int Age;public Person(string name, int age){Name = name;Age = age;}
}
在C# 7.3版本中 是不可以不能同时有默认构造函数和无参数的构造函数
在C# 10.0 版本中,可以同时有默认构造函数和无参数的构造函数
2)构造函数参数
结构体的构造函数必须为所有字段赋值,因为结构体的成员不能在声明时初始化:
struct Circle
{public double Radius;public Circle(double radius){Radius = radius;}
}
在C# 7.3版本
在C# 10.0 版本
2. 属性
你可以在结构体中定义属性,就像在类中一样。属性可以用来封装结构体的字段,提供更好的访问控制:
struct Temperature
{private double _celsius;public double Celsius{get { return _celsius; }set { _celsius = value; }}public double Fahrenheit{get { return _celsius * 9 / 5 + 32; }set { _celsius = (value - 32) * 5 / 9; }}
}
3. 方法
结构体可以包含方法,这些方法可以操作结构体的成员:
struct Vector
{public double X;public double Y;public double Magnitude(){return Math.Sqrt(X * X + Y * Y);}
}
3. 比较操作
结构体支持隐式的相等比较操作符 (== 和 !=),但为了自定义比较逻辑,您可以重写这些操作符或实现 IEquatable 接口:
public struct Point : IEquatable<Point>
{public int X { get; set; }public int Y { get; set; }public bool Equals(Point other){return X == other.X && Y == other.Y;}public override bool Equals(object obj){if (obj is Point point){return Equals(point);}return false;}public override int GetHashCode(){return HashCode.Combine(X, Y);}public static bool operator ==(Point left, Point right){return left.Equals(right);}public static bool operator !=(Point left, Point right){return !(left == right);}
}
4. 结构体的特点
1)值类型
结构体是值类型,这意味着当你将一个结构体变量赋值给另一个结构体变量时,会进行值的复制,而不是引用的复制。例如:
Point point1 = new Point { X = 1, Y = 2 };
Point point2 = point1; // 复制值,而不是引用
point2.X = 5;
Console.WriteLine($"point1: ({point1.X}, {point1.Y})"); // 输出 (1, 2)
Console.WriteLine($"point2: ({point2.X}, {point2.Y})"); // 输出 (5, 2)
值类型 vs 引用类型
- 值类型:如 int, float, bool 和 struct,当它们被赋值给另一个变量时会创建副本。
- 引用类型:如 class, interface, array,当它们被赋值时只是复制了引用,两个变量指向同一个对象。
由于 struct 是值类型,因此每次传递或赋值时都会创建一个新副本,这对于小规模的数据结构来说效率较高且更安全。但是,对于较大的结构体,频繁复制可能会带来性能开销。
2)存储位置
结构体通常存储在栈上,对于小型数据结构,这可以提高性能,因为栈的访问速度比堆更快。但是,当结构体作为引用类型的成员时,它会被存储在堆上。
3)不能被继承
- 结构体不能被继承,因为它们隐式地密封(sealed)。这意味着你不能创建一个继承自结构体的新类型。也不能作为类的基础类型。
- 结构体不能继承自其他类型,也不能被其他类型继承。
- 结构成员不能指定为 abstract、virtual 或 protected。
4)包含成员
它可以包含多个不同类型的成员,如字段、属性、方法、索引器、运算符方法、事件和构造函数等
5)可实现接口
结构体可实现一个或多个接口。
// 定义接口
public interface IDistanceCalculable
{double DistanceTo(Point other);
}// 实现接口的结构体
public struct Point : IDistanceCalculable
{public double X { get; }public double Y { get; }public Point(double x, double y){X = x;Y = y;}// 实现接口中的方法public double DistanceTo(Point other){return Math.Sqrt(Math.Pow(other.X - X, 2) + Math.Pow(other.Y - Y, 2));}public override string ToString(){return $"({X}, {Y})";}
}// 使用示例
class Program
{static void Main(string[] args){var p1 = new Point(0, 0);var p2 = new Point(3, 4);Console.WriteLine($"Distance between {p1} and {p2}: {p1.DistanceTo(p2)}");}
}
6)不能在结构体中声明终结器
- 结构体不能有析构函数,因为它们存储在栈上,析构函数通常用于释放堆上的资源。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
7)必须初始化
在 C# 11 之前,结构体的构造函数必须初始化该类型的所有实例字段。
当你实例化一个结构体时,必须为其成员赋值,要么通过构造函数,要么通过属性或字段的赋值:
// 正确
Point p1 = new Point { X = 1, Y = 2 };
// 正确
Point p2 = new Point(3, 4);
// 错误,未初始化成员
// Point p3;
8)箱装与拆箱
当值类型(如 struct)被分配给引用类型的变量时会发生箱装(boxing),反之则发生拆箱(unboxing)。这个过程涉及到内存分配和数据复制,因此应当尽量避免不必要的转换以提高性能。
object boxedPoint = point1; // 箱装
Point unboxedPoint = (Point)boxedPoint; // 拆箱
三、结构体的使用场景
1. 表示小型数据结构
结构体非常适合表示小型的数据结构,如点、向量、矩形等,因为它们的存储和操作成本相对较低。
2. 提高性能
对于频繁创建和销毁的对象,使用结构体可以避免堆分配的开销,提高性能。
3. 不可变数据
为了确保结构体的安全性和线程安全性,通常建议设计为不可变类型,即一旦创建后就不能修改其状态。这可以通过只读字段或只读属性来实现:
public struct ImmutablePoint
{public readonly int X;public readonly int Y;public ImmutablePoint(int x, int y){X = x;Y = y;}public void Print(){Console.WriteLine($"Immutable Point: ({X}, {Y})");}
}
为什么建议定义不可变的结构类型
- 避免副作用
由于结构类型传递的是副本,如果结构是可变的,在方法中修改结构的副本可能会给调用者带来混淆。例如,当一个可变结构作为参数传递给方法时,方法内部对该结构的修改不会影响原始结构,但调用者可能会误以为会影响。而不可变结构可以避免这种副作用,因为其状态不能被修改,调用者可以明确知道传递的结构不会被方法改变。- 线程安全
在多线程环境中,可变的结构类型可能会引发线程安全问题。多个线程同时访问和修改同一个结构的不同副本时,可能会导致数据不一致。而不可变结构类型天生就是线程安全的,因为它们的状态不能被修改,多个线程可以安全地共享同一个不可变结构的副本,无需进行额外的同步操作。- 提高代码的可维护性和可预测性
不可变结构的状态在创建后就固定不变,这使得代码的行为更加可预测。开发者在阅读和理解代码时,不需要担心结构的状态会在某个地方被意外修改,从而降低了代码的复杂性,提高了可维护性。综上所述,由于结构类型具有值语义,为了避免副作用、保证线程安全以及提高代码的可维护性和可预测性,建议定义不可变的结构类型。
四、结构体与类的区别
特性 | 结构体 | 类(class) |
---|---|---|
类型 | 值类型 | 引用类型 |
默认值 | 根据字段类型初始化 | null |
复制行为 | 赋值时创建副本 | 赋值时仅复制引用 |
继承 | 不能从其他结构体继承,但可以实现接口 | 支持继承和多接口实现 |
性能 | 对于小规模数据结构更高效 | 对于大规模复杂对象更灵活 |
五、总结
结构体是 C# 中一种强大的值类型数据结构,适合表示小型数据结构和需要高性能的场景。它们具有值类型的特点,存储在栈上,不能被继承,并且可以包含各种成员,如字段、属性和方法。通过合理使用结构体,可以提高代码的性能和可读性。在选择使用结构体还是类时,要考虑数据的大小、使用场景以及性能需求,以确保做出最佳选择。
结语
回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
结构类型(C# 参考)
相关文章:
C# 结构体
总目录 前言 在 C# 编程中,结构体(struct)是一种非常重要的数据结构,它为我们提供了一种轻量级的存储和操作数据的方式。本教程将带你深入了解结构体的概念、特点、使用方法,以及一些使用结构体的最佳实践。 一、什么…...
C++小病毒-1.0勒索(更新次数:1)
内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码!,病毒带来后果自负! 使用时请删除在main()里的注释,并修改位置至C:\\(看我代码注释)//可以改成WIN Main() #include <iostream> #i…...
RabbitMQ---面试题
常见面试题 1.MQ的作用及应用场景 类似问题:项目什么情况下用到了MQ,为什么要用MQ MQ的主要应用场景,消息队列的应用场景,为什么说消息队列可以削峰 首先MQ是一种用来接收和转发消息的队列,常见的应用常见如下&…...
CSS中相对定位和绝对定位详解
文章目录 CSS中相对定位和绝对定位详解一、引言二、相对定位1、相对定位的概念1.1、代码示例 三、绝对定位1、绝对定位的概念1.1、代码示例 四、相对定位与绝对定位的区别五、使用示例六、总结 CSS中相对定位和绝对定位详解 一、引言 在CSS布局中,定位是一种强大的…...
【深度学习基础】多层感知机 | 权重衰减
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
[cg] 使用snapgragon 对UE5.3抓帧
最近想要抓opengl 的api,renderdoc在起应用时会闪退(具体原因还不知道),试了下snapgraon, 还是可以的 官网需要注册登录后下载,官网路径:Developer | Qualcomm 为了方便贴上已经下载好的exe安装包&#x…...
Java 集合框架介绍
Java学习资料 Java学习资料 Java学习资料 在 Java 编程中,集合框架是一个强大且常用的工具,它为存储和操作一组对象提供了统一的体系结构。通过集合框架,我们能够高效地管理数据,提升程序的灵活性和可维护性。 一、集合框架的概…...
【博客之星】2024年度创作成长总结 - 面朝大海 ,春暖花开!
没关系的,大家都会做错选择,会 莫名其妙掉眼泪,走在路上会突然崩溃, 但这并不影响我们去看看晚霞, 再次爱上这个世界。 面朝大海 ,春暖花开! about meReviewLife about me 现在我是一名24级计算机类的…...
windows11关闭系统更新详细操作步骤
文章目录 1.打开注册表2.修改注册表内容2.1 新建文件2.2 修改值 3.修改设置 1.打开注册表 winR输入regedit(如下图所示) 2.修改注册表内容 进HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 2.1 新建文件 右侧界面右键即可 2.2 修改值 重命名为如下…...
医学图像分析工具09.1:Brainstorm安装教程
1. 安装前准备 **官方安装包和数据:**https://neuroimage.usc.edu/bst/download.php **官方安装教程:**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求: 有 Matlab: R2009b (7.9) 或更高版本没有 Matlab&…...
蚁群算法 (Ant Colony Optimization) 算法详解及案例分析
蚁群算法 (Ant Colony Optimization) 算法详解及案例分析 目录 蚁群算法 (Ant Colony Optimization) 算法详解及案例分析1. 引言2. 蚁群算法 (ACO) 算法原理2.1 蚂蚁觅食行为2.2 算法步骤2.3 数学公式3. 蚁群算法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案例1: 旅行商…...
鸿蒙next 自定义日历组件
效果图预览 20250124-113957 使用说明 1.选择日期左右箭头,实现每月日历切换,示例中超出当前月份,禁止进入下一月,可在代码更改 2.日历中显示当前选择的日期,选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…...
Android BitmapShader简洁实现马赛克,Kotlin(二)
Android BitmapShader简洁实现马赛克,Kotlin(二) 这一篇 Android BitmapShader简洁实现马赛克,Kotlin(一)-CSDN博客 遗留一个问题,xml定义的MyView为wrap_content的宽高,如果改成其…...
MATLAB编写遗传算法【Genetic Algorithm(GA)】求解函数最大值
一、遗传算法基础知识 来自B站视频的笔记: 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程(结合理论基础)_哔哩哔哩_bilibili 1、遗传算法 使用“适者生存”的原则,在遗传算法的每一代中,…...
remove和delete应用场景
"Remove" 和 "delete" 都有“移除、去除”的意思,但它们在使用时有一些细微的区别,通常根据上下文来决定使用哪一个。以下是它们的主要区别: 1. Remove "Remove" 是一个相对通用的词,指的是从某个…...
Redis 详解
简介 Redis 的全称是 Remote Dictionary Server,它是一个基于内存的 NoSQL(非关系型)数据库,数据以 键值对 存储,支持各种复杂的数据结构 为什么会出现 Redis? Redis 的出现是为了弥补传统数据库在高性能…...
亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘
解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal,选择版本后点击“install”执行安装...
Java 设计模式 二 单例模式 (Singleton Pattern)
单例模式 (Singleton Pattern) 是一种常见的设计模式,属于创建型模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景,比如配置管理、日志系统、数据库连接池等。 1. 单例模式的…...
golang网络编程
socket编程 socket图解 Socket是BSD UNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网…...
kotlin内联函数——takeIf和takeUnless
1.takeIf 当对一个对象调用takeIf时,如果对象满足给定的判断条件,则返回该对象;否则,返回null。因此,takeIf是对单个对象进行过滤的函数。例如, class User {var name: String? nullvar age 99fun set…...
计算机网络 (54)系统安全:防火墙与入侵检测
前言 计算机网络系统安全是确保网络通信和数据不受未经授权访问、泄露、破坏或篡改的关键。防火墙和入侵检测系统(IDS)是维护网络系统安全的两大核心组件。 一、防火墙 定义与功能 防火墙是一种用来加强网络之间访问控制的特殊网络互联设备,它…...
第38周:猫狗识别 (Tensorflow实战第八周)
目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 六、模型评估 七、预测 总结 前言…...
【力扣Hot 100】矩阵1
矩阵置零:1. 开两个数组判断该行/该列是否有0;2. 用第0行/第0列分别判断该列/该行是否有0 螺旋矩阵:记录方向,一直按某方向前进,遇到障碍方向就变一下 1. 矩阵置零 给定一个 *m* x *n* 的矩阵,如果一个元…...
量子编程语言:Qiskit 与 Cirq
在量子计算的领域,开发者已经可以使用一些专门为量子计算设计的编程语言和框架。其中,Qiskit 和 Cirq 是两个非常流行的选择,它们为不同的量子计算机提供编程接口,帮助开发者理解量子电路的设计和执行。 1. Qiskit Qiskit 是 IBM…...
leetcode 124. 二叉树中的最大路径和
题目:124. 二叉树中的最大路径和 - 力扣(LeetCode) 定义一个节点的“最大单向路径和”是single,single有以下几种情况: 只有该节点该节点左儿子的single该节点右儿子的single 设答案是节点 node 为根节点࿰…...
程序员转型测试:解锁漏洞挖掘新旅程
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 程序…...
基于Springboot用axiospost请求接收字符串参数为null的解决方案
问题 今天在用前端 post 请求后端时发现,由于是以 Json对象的形式传输的,后端用两个字符串形参无法获取到对应的参数值 前端代码如下: axios.post(http://localhost:8083/test/postParams,{a: 1, b:2} ,{Content-Type: application/jso…...
# AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析
AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析 在现代AI绘图和深度学习中,涉及了多个复杂的概念和技术,这些技术在图像生成、训练加速以及多模态学习等方面起着至关重要的作用。在这篇博客中,我们将讨论几个关键概念&…...
警企联动齐发力、共筑反诈“防护墙”
2025年1月10日是第五个中国人民警察节,南通移动联合南通公安反诈中心,深入社区商圈,开展防范电信网络诈骗宣传活动,进一步增强广大人民群众的反诈意识和能力,全力守护好群众的“钱袋子”。 当日,活动现场一大早就呈现出一片忙碌景象,工作人员支起摊位,将各类精心制作的反诈宣传…...
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求 Node.js 的 http 模块是 Node.js 核心模块之一,它允许你创建 HTTP 服务器和客户端。以下是一些关键知识点和代码示例: 1. 创建 HTTP 服务器 使用 http.createServer() 方法可以创建…...
Alibaba Spring Cloud 十七 Sentinel熔断降级
概述 在微服务架构中,熔断与降级是保证系统稳定性的重要机制,能有效防止故障蔓延或雪崩效应。当某个服务出现异常、延迟过高或错误率过高时,触发熔断保护,将该服务“隔离”一段时间,避免影响整体系统的吞吐和可用性。 …...
linux——网络基础
文章目录 目录 文章目录 踏入网络世界:探索 Linux 网络的无垠天地 一、网络发展 早期单机处理模式 网络发展的需求催生 网络发展后的优势对比 二、局域网or广域网 典型局域网架构 广域网连接多个局域网 二者关系 三、协议 语言层与汉语协议 通信设备层与电话机协议 …...
Spring Boot 集成 WebClient 实战教程 实现同步、异步请求处理以及响应式编程、响应式流、响应式Mono
该项目介绍springboot集成WebClient 实现服务的请求操作 示例中演示了,如何配置WebClient的请求头,请求参数等相关参数,实现同步、异步请求处理以及响应式编程、响应式流、响应式Mono。 为什么使用WebClient 不用RestTemplate 在 Spring Framework 5.0 及更高版本中,Res…...
健身房项目 Uniapp+若依Vue3版搭建!!
本次系统实现主要负责前端前端功能的实现。其中系统前端主要分为三大部分,首页,教练列表页,我的页面。 首页 首页的实现效果如图 1.会员卡组件 首页的Vip会员卡部分,团课活动的DataPicker,团课选择都采用了组件化封…...
(2)STM32 USB设备开发-USB虚拟串口
例程:STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为USB虚拟串口教程,没有知识,全是实操,按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的,如果代码中出现一些外设的…...
ubuntu上python setup.py install报错:error: expected initializer before ‘__s128’
问题场景:安装torchsparse时候执行python setup.py install 报错: /usr/include/linux/types.h:12:27: error: expected initializer before ‘__s128’12 | typedef __signed__ __int128 __s128 __attribute__((aligned(16)));| …...
解锁.NET Standard库:从0到1的创建与打包秘籍
一、引言 在当今的软件开发领域,跨平台开发已成为一种趋势。随着不同操作系统和设备的多样化,开发人员需要确保他们的代码能够在多个平台上运行,以满足更广泛的用户需求。.NET Standard 库应运而生,它定义了一组公共 API…...
Mac 查看 Java SDK 和 Android SDK 的路径
1. Mac 如何查看 JavaSDK的路径 /usr/libexec/java_home -V2. Mac 如何查看 Android SDK 的路径 在 Android Studio 中按 cmd,打开设置,然后如下方式,第三步如果有值就是第三步的信息。 第三步如果没有值,点开Edit,值在下方&…...
6. 马科维茨资产组合模型+政策意图AI金融智能体(DeepSeek-V3)增强方案(理论+Python实战)
目录 0. 承前1. 幻方量化 & DeepSeek1.1 What is 幻方量化1.2 What is DeepSeek 2. 重写AI金融智能体函数3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对上一篇文章,链接: 5. 马科维茨资产组合模型政策意图AI金融智能体(Qwen-Max)增…...
freeswtch目录下modules.conf各个模块的介绍【freeswitch版本1.6.8】
应用模块(applications) mod_abstraction: 为其他模块提供抽象层,有助于简化模块开发,让开发者能在统一框架下开发新功能,减少与底层系统的直接交互,提高代码可移植性和可维护性。 mod_av&#…...
Spark/Kafka
文章目录 项目地址一、Spark1. RDD1.1 五大核心属性1.2 执行原理1.3 四种创建方式二、Kafka2.1 生产者(1)分区器(2)生产者提高吞吐量(3) 生产者数据可靠性数据传递语义幂等性和事务数据有序2.2 Broker(1)Broker工作流程(2)节点服役和退役2.3 副本(1)Follower故障细…...
【Linux】华为服务器使用U盘安装统信操作系统
目录 一、准备工作 1.1 下载UOS官方系统 1.2制作启动U盘 1.3 服务器智能管理系统iBMC 二、iBMC设置U盘启动 一、准备工作 1.1 下载UOS官方系统 服务器CPU的架构是x86-64还是aarch64),地址:统信UOS生态社区 - 打造操作系统创…...
数据库性能优化(sql优化)_SQL执行计划02_yxy
数据库性能优化_SQL执行计划详解02 常用操作符解读1.1 表扫描类型操作符1.1.1 CSCN 聚集索引扫描1.1.2 CSEK 聚集索引数据定位1.1.3 SSEK 二级索引数据定位1.1.4 SSCN 直接使用二级索引进行扫描1.2 其他常见操作符1.2.1 BLKUP 二次扫描1.2.2 SLCT 选择1.2.3 PRJT 投影1.2.4 NSE…...
02.05、链表求和
02.05、[中等] 链表求和 1、题目描述 给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果。 2、解题思路 本题要求对两个链表表示的整数…...
FPGA实现光纤通信(3)——光纤8b/10b编码数据回环
前言 光纤通信属于高速串行通信,具有较高的数据传输速率,通常用于服务器以及通信设备之间用于高速数据交换,对于xilinx 7系列的FPGA,内部具有集成的高速接口用于实现光纤通信。本次就来实现8b/10b编码数据回环。 测试环境:vivado版本:2020.02 FPGA芯片:XC7K70T 测试说…...
Python!从0开始学爬虫:(一)HTTP协议 及 请求与响应
前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议ÿ…...
神经网络基础详解
神经元结构 在探讨神经网络的基础时,神经元结构是一个关键概念。神经元是神经网络的基本组成单元,模拟了生物神经元的功能。其结构包括: 细胞体 :负责处理和整合输入信息 树突 :接收来自其他神经元的输入信号 轴突 :将处理后的信息传递给其他神经元 神经元通过加权求和和…...
使用Chrome和Selenium实现对Superset等私域网站的截图
最近遇到了一个问题,因为一些原因,我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送,所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver,这是执行数据抓取的…...
2025展望:“安全计算”平价时代加速到来,数据流通产业兴起
大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年,数据要素产业元年开启。 这是建章立制的一年:从年初《“数据要素”三年行动计划(2024—2026年)》开始,这一年政策密集出台,涵盖公共数据资源开发利用…...
达梦拷贝DM_HOME的复制安装
近期一个项目需求,需要在没有安装包的情况下,将达梦数据库安装到虚机上(生产机上安装了达梦),故采用直接打包生产机DM_HOME的方式拷贝至虚机,再依次执行达梦的部分指令完成安装。以下为验证的步骤ÿ…...