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

【C#进阶】C# 特性

序号系列文章
10【C#基础】C# 正则表达式
11【C#基础】C# 预处理器指令
12【C#基础】C# 文件与IO

文章目录

  • 前言
  • 1,特性的概念
    • 1.1 特性的属性
    • 1.2 特性的用途
  • 2,特性的定义
    • 2.1 特性参数
    • 2.2 特性目标
  • 3,预定义特性
    • 3.1 AttributeUsage
    • 3.2 Conditional
      • 3.2.1 条件特性类
    • 3.3 Obsolete
  • 4,自定义特性
    • 4.1 声明自定义特性
    • 4.2 构建自定义特性
    • 4.3 应用自定义特性
  • 结语

前言

👍 大家好,我是writer桑,前面一章已经学习了 C# 中文件与IO的操作,那本章就开始学习 C# 中特性的使用,希望看完大家能够有所收获,感谢支持!


1,特性的概念

特性 (Attribute) 是用于在运行时传递程序中各种元素(比如类、方法、结构、组件等)的行为信息的声明性标签。可以使用特性将元数据或声明性信息与代码相关联。一个特性的声明可以通过放置在它所作用的对象上面的方括号([])来描述。

1.1 特性的属性

在 C# 中,特性的属性可以总结以下几点:

  • 特性向程序添加元数据。元数据就是“描述数据的数据”,在程序中表现为描述类型的相关信息,如编译器指令和注释、描述、方法、类等其他信息。
  • 在 C# 程序中,所有类型和成员都会有一组指定的元数据用于描述它们,也允许自定义特性来描述其他任何信息。
  • 可以将一个或多个特性应用于整个程序集、模块或较小的程序元素(例如类和属性)。
  • 特性也可以像方法和属性一样接收自变量。
  • 可以使用反射1来查看当前程序集或其他程序集的元数据的信息。

1.2 特性的用途

在项目中特性的常见用途包括但不限于以下几点:

  1. 在 Web 服务中使用 WebMethod 特性标记方法时,表示该方法应可通过 SOAP 协议2进行调用。
  2. 用于描述与本机代码互操作时如何封送方法参数。
  3. 描述类、方法和接口的 COM 属性。
  4. 从标题、版本、说明或商标方面描述程序集。
  5. 通过实时 (JIT) 编译器3控制优化,这样代码就一直都易于调试。

.Net 框架中,提供了两种类型的特性:预定义特性和自定义特性。

2,特性的定义

在 C# 中,特性的定义是使用方括号 ([]) 将特性名称括起来,并放置在特性目标4的声明上方已指定特性。可以将特性附加到几乎任何声明中,尽管有些特性会限制有效附加到某些声明的类型。

特性的定义的语法可以总结为如下:

[attribute(positional_parameters, name_parameter = value, …)]
element

  • positional_parameters: 表示特性必须具备的信息。
  • name_paramete:表示特性可选的信息。
  • element: 在这里表示特性目标4

代码示例:

using System; [Serializable]
public class SampleClass
{// 该类型的对象可以被序列化。
}

在此示例中,SerializableAttribute 特性用于将具体特征作用于 SampleCLass 类。

2.1 特性参数

特性参数包括位置参数、未命名参数和已命名参数。其中,位置参数必须以特定的顺序来指定,且不能省略。而命名参数是可选参数,通过名称来指定,可以通过任何顺序来指定。

代码示例:

[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
  • 上面的实例中的三个特性都是等同的。
  • 第一个参数是位置参数(DLL 名称),始终作为第一个参数出现。
  • 位置参数与特性构造函数的参数相对应。而已命名或可选参数与特性的字段或属性相对应。

点击了解更多特性参数的使用。

2.2 特性目标

特性目标指的是应用特性的实体。例如,特性目标可以是类、特定方法或整个程序集。一般情况,特性应用于紧跟在它后面的元素。不过,C# 特性支持显示标识,例如可以显示标识为将特性应用于方法,或者是应用于其参数或返回值。

显示标识特性目标的语法如下:

[target : attribute-list]

  • target:表示指定的特性目标值。
  • attribute-list:表示要应用的特性列表。

下表展示常用的 target 值:

目标值适用对象
assembly整个程序集
module当前程序集模块
field类或结构中的字段
event事件
method方法或 get 和 set 属性访问器
param方法参数或 set 属性访问器参数
propertyProperty(属性)
return方法、属性索引器或 get 属性访问器的返回值
type结构、类、接口、枚举或委托

代码示例:

以下示例演示如何将特性应用于方法、方法参数和方法返回值。

// 默认: 应用于方法
[ValidatedContract]
int Method1()
{ return 0; 
}// 显示指定应用于方法
[method: ValidatedContract]
int Method2()
{ return 0; 
}// 应用于参数
int Method3([ValidatedContract] string contract) 
{ return 0; 
}// 应用于返回值
[return: ValidatedContract]
int Method4()
{ return 0; 
}

以下示例演示如何将特性应用于程序集和模式。

using System;
using System.Reflection;[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]

点击了解更多特性目标的使用。

3,预定义特性

所谓的预定义特性就是在 .NET 框架中预先定义好的特性,使得程序代码在编译之前就能被读取。在 .NET 框架中,提供了三种预定义特性,分别为 AttributeUsage 、Conditional 、Obsolete

3.1 AttributeUsage

特性 AttributeUsage 是属性使用的意思,用于描述特性类的使用方式。其中包括如何使用一个自定义特性类,以及特性可应用到的项目的类型。注意,使用特性修饰的类 AttributeUsage 必须 System.Attribute 直接或间接派生类,否则将发生编译时错误。

AttributeUsage 特性的语法如下:

[AttributeUsage(validon, AllowMultiple=allowmultiple, Inherited=inherited)]

  • 参数 validon 表示可被应用的特性目标值。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。上述的特性目标中的表格也展示了常用特性目标值。
  • 参数 AllowMultiple 是一个可选的,allowmultiple 选项为其提供一个布尔值。如果为 true,则该特性是多用的,如果为 false,则该特性是单用的。默认为 false 表示单用的。
  • 参数 Inherited 也是可选的,inherited 选项为其提供一个布尔值。如果为 true,表示则该类可被派生类继承。如果为 false,表示不能被继承。默认为 false 表示不可继承。

代码示例:

using System;// AttributeUsage 特性应用于 ExampleAttribute 类。
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class ExampleAttribute : Attribute
{// 构造函数 public ExampleAttribute(String Description_in){this.description = Description_in;}// description 字段public String description;// Description 属性public String Description{get{return this.description;}}
}

因为上例中的 AttributeUsage 特性的 validon 参数被设置为 AttributeTargets.Class ,所以只能将特性应用于类对象。而不能应用其他对象,例如方法等。示例如下:

[Example("Can be applied to classes")]
public class MyClass
{[Example("Cannot be applied to fields")]    // 错误 public String MyField;
}

代码效果:
在这里插入图片描述
上例中的 AllowMultiple 参数为 false ,表示该特性不能被重复应用多次。示例如下:

[Example("Cannot be applied more than once")]
[Example("Cannot be applied more than once")]   // 错误
public class MyClass
{// 类成员....
}

代码效果:
在这里插入图片描述
上例中的 Inherited 参数为 false,表示该特性类不能被继承。示例如下:

[Example("BaseClass")]
public class Base
{// 类成员....
}public class Derive : Base
{// 子类成员....
}public class Program
{static void Main(string[] args){// 得到指定类型的Type对象Type BaseType = typeof(Base);Type DeriveType = typeof(Derive);Console.WriteLine(BaseType);     // BaseConsole.WriteLine(DeriveType);   // Derive// 判断当前的方法是否应用了Example特性bool BaseDef = Attribute.IsDefined(BaseType, typeof(ExampleAttribute));bool DriveDef = Attribute.IsDefined(DeriveType, typeof(ExampleAttribute));Console.WriteLine(BaseDef);         // TrueConsole.WriteLine(DriveDef);        // False}
}

运行效果:
在这里插入图片描述
上例中 ,使用 Attribute.IsDefined 方法检测到了 Base 类中应用了 ExampleAttribute 特性,但是 Derive 派生类却没有应用到。因为 Inherited 参数被设置为 false ,所以 Derive 类不能继承到 ExampleAttribute 特性。

3.2 Conditional

特性 Conditional 是有条件的意思。使用特性修饰的方法也就是条件方法,条件方法的执行依赖于指定的预处理标识符。预处理标识符影响着方法调用的条件编译,这种影响取决于指定的值。例如事先用预处理器指令定义了一个 Test 字符,当条件方法指定的值也为 Test 时, 则该方法会被执行。

Conditional 特性的语法如下:

[Conditional(conditionalSymbol)]

  • 参数 conditionalSymbol 表示指定的预处理标识符。

代码示例:

#define Test
using System;
using System.Diagnostics;public class Example
{[Conditional("Test")]static void Method1(){Console.WriteLine("Method1");}static void Method2(){Console.WriteLine("Method2");}static void Main(){Method1();Method2();}
}

运行效果:
在这里插入图片描述

上例中在程序编译之前使用预处理器指令定义了 Test 字符。在使用 Conditional 修饰符修饰了条件方法 Method1 中又定义了 Test 的指定值,所以 Method 方法可以顺利运行。

代码示例:

//#define Test

运行效果:
在这里插入图片描述
反之,当 Test 指定值没有定义时(被注释),Method 方法就不能运行。

条件方法的使用收到以下几点限制:

  • 条件方法必须应用在类类型或者结构体类型上。比方说如果在接口类型上制定了 Conditional 特性,则会发生编译错误。
  • 条件方法不能使用 override 修饰符,不过,条件方法允许使用 virtual 修饰符。此类方法(指的是 virtual 关键字修饰的虚方法)的替代是隐式条件的,不能用特性显式标记 Conditional 。
  • 条件方法的返回类型必须为 void,也就是不能有返回对象。

3.2.1 条件特性类

条件特性类是使用一个或多个 Conditional 特性修饰的特性类。因此,条件特性类与在其特性中声明的条件编译符号需要关联 Conditional 。

示例如下:

文件 test.cs:

using System;
using System.Diagnostics;[Conditional("DEBUG")]
public class TestAttribute : Attribute { }

文件 test1.cs:

#define DEBUG[Test]		// 指定TestAttribute
class Class1 {}

文件 test2.cs:

#undef DEBUG[Test] 		// 未指定TestAttribute
class Class2 {}

上例中的类 Class1 和 Class2 都是用特性类修饰的 Test ,前者定义了条件 DEBUG,而后者是基于否定条件 DEBUG 。由于此符号在当前上下文定义的,而不是在基类的上下文定义的。所以类 Class1 和 Class2 属性会被 Test Class1 和 Test Class2 忽略。

3.3 Obsolete

特性 Obsolete 是过时的意思,用于标记不应再使用的类型和类型的成员。使用这个特性相当于告诉编译器丢弃某个特定的目标元素,当使用某个用 Obsolete 特性应用的对象时编译器会报出错误。在实际项目中,当一个新方法用在一个类中,但开发者还想保留类中的旧方法时,就可以把他标记为 obsolete(过时的)。

Obsolete 特性的语法如下:

[Obsolete(message,iserror)]

  • 参数 message 是字符串类型,描述应用的项目为什么过时以及该替代使用什么。
  • 参数 iserror 是布尔值类型,当布尔值为 true 时,编译器会把项目的使用当成一个错误,反之为 false 时,编译器会生成一个警告。iserror 参数是可选的,默认值为 false 。

代码示例:

using System;public class Example
{[Obsolete("不要使用OldMethod,而是使用NewMethod", true)]static void OldMethod(){Console.WriteLine("这是旧方法");}static void NewMethod(){Console.WriteLine("这是新方法");}public static void Main(){OldMethod();}
}

代码效果:
在这里插入图片描述
当把参数 iserror 换成 false 时,编译器就会生成一个警告。

代码示例:

[Obsolete("不要使用OldMethod,而是使用NewMethod", false)]

代码效果:
在这里插入图片描述

4,自定义特性

在 C# 中,允许我们定义特性类来创建自己的自定义特性,特性类直接或间接派生自 Attribute 的类。 自定义特性可用于存储声明性的信息,且可在运行时被检索。自定义特性可根据项目的实际需求进行变动,可与任何目标元素相关。

创建并使用自定义特性可总结为以下四个步骤:

  1. 声明自定义特性。
  2. 构建自定义特性。
  3. 在需要应用特性的对象上放置自定义特性。
  4. 通过反射1访问特性。(暂时不讨论)

4.1 声明自定义特性

声明一个 Author 的特性类,此类是用来存储作者的姓名和年龄信息的类型。且特性的目标值设置为 Class 和 Struct, 表示可被应用的对象仅为类和结构体。

代码示例:

using System;[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct)
]
public class AuthorAttribute : System.Attribute

在上面的示例中,由于该类派生自 System.Attribute ,因此它是一个自定义特性类。

4.2 构建自定义特性

构建自定义特性 AuthorAttribute,该特性存储了作者的姓名(name)和年龄(age)。

代码示例:

using System;[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct)
]
public class AuthorAttribute : System.Attribute
{private string name;public double age;// 构造函数public AuthorAttribute(string name){this.name = name;age = 11;}
}

在上例的构建自定义特性中,声明了两个字段,分别为 name 和 age 。再使用构造函数对其赋值。需要注意的是,name 是位置参数。 所有公共读写字段或属性都是命名参数。 在本例中,version 是唯一的命名参数。

4.3 应用自定义特性

可通过将一个或多个 Author 特性放置在类或结构体上方进行应用。

代码示例:

[Author("writer桑", age = 21)]
public class Example
{// Example类成员
}

结语

👌 以上就是 C# 特性的介绍啦,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!


  1. 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 ↩︎ ↩︎

  2. SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。 ↩︎

  3. JIT是一种提高程序运行效率的方法。 ↩︎

  4. 特性目标是指应用特性的实体。 ↩︎ ↩︎

相关文章:

【C#进阶】C# 特性

序号系列文章10【C#基础】C# 正则表达式11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO文章目录前言1,特性的概念1.1 特性的属性1.2 特性的用途2,特性的定义2.1 特性参数2.2 特性目标3,预定义特性3.1 AttributeUsage3.2 Conditional3.2…...

Java速成篇-Day01笔记

提示:这里只记录我个人不熟悉的知识,并非所有内容 笔记目录课程:04-第一行代码① jshell② 对象.方法课程:05-第一份源码① Java开发程序的流程② 入口方法课程:06-常见问题-中文乱码① 乱码原因② 解决方法课程&#…...

从源码开始精通spring-security1

参考b站up主:传送门 前沿: 本章:spring-security 重要的成员 WebSecurity、HttpSecurity、SecurityBuilder、SecurityFilterChain、FilterChainProxy 重点:WebSecurity、HttpSecurity 他们都实现了 SecurityBuilder 接口 用来构建对象 WebSe…...

你应该优化的JavaScript代码,以及前端工程师日常使用的小技巧。使之更加简洁,可读性更强,更易维护。

本文主要是分享一下平时前端工程师,在写前端代码过程中的一些代码优化,以及使用的一些小技巧,来使我们的代码更加简洁,可读性更强,更易维护。 1. 字符串的自动匹配(includes的优化) includes是…...

自动化测试

文章目录前言一、什么是自动化测试?一个简单的自动化实例二、自动化测试的分类1.接口自动化测试2.UI自动化测试(界面测试)移动端自动化测试web端自动化测试(主要学习)三、selenium工具1.为什么选择selenium作为web自动…...

leetcode-每日一题-807(中等,数组)

正常情况第一眼看这道题,看懂意思的话很简单就可以解出来。给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid ,其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。城市的…...

【Linux】Linux项目自动化构建工具make makefile

文章目录1. 背景2.实例3.原理4.项目清理5. 文件属性中的三个时间6. Linux下第一个小程序——进度条6.1 前置知识1:缓冲区6.2前置知识2:回车换行6.3进度条的实现7 Linux下git的”三板斧“1. 背景 一个工程中的源文件不计其数,其按类型、功能、…...

华为OD机试题 - IPv4 地址转换成整数(JavaScript)| 含思路

华为OD机试题 最近更新的博客使用说明本篇题解: IPv4 地址转换成整数题目输入输出示例一输入输出说明示例一输入输出说明Code解题思路华为OD其它语言版本最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | …...

spring整合通用mapper

1.使用通用mapper可以更快速的进行数据库的增删查改操作,加入springboot的管理,常规的SQL都可以复用 2.整合  a)引入依赖 <dependencies><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId>…...

一天什么时间发抖音浏览量高?5个抖音最佳发布时间段

抖音作为现在一款现象级的软件&#xff0c;已经不知不觉地影响着我们生活的方方面面。那抖音想要被更多人看到&#xff0c;就需要掐准哪些时间活跃数最多&#xff0c;今天就来和大家分享一下一天什么时间发抖音浏览量高&#xff0c;又该如何抓住最佳投放契机呢?一、一天什么时…...

华为OD机试题 - 关联子串(JavaScript)| 含思路

华为OD机试题 最近更新的博客使用说明本篇题解:关联子串题目输入输出示例一输入输出说明示例二输入输出说明Code解题思路华为OD其它语言版本最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典...

【代码随想录训练营】【Day33休息】【Day34】第八章|贪心算法|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果

K 次取反后最大化的数组和 题目详细&#xff1a;LeetCode.1005 这道题比较简单&#xff0c;这里直接给出贪心策略&#xff1a; 局部最优解&#xff1a; 按照 负数 > 0 > 正数 的优先级次序&#xff0c;依次对nums中的较小数值进行取反因为负负得正&#xff0c;负值越小…...

<c++> const 常量限定符

文章目录什么是 const 常量限定符const 的初始化const 的默认作用域const 的引用例外情况const 与指针const指针的声明指向 const 的指针const指针指向 const 的 const指针什么是 const 常量限定符 Q&#xff1a;什么是 const 常量限定符&#xff1f; A&#xff1a;const名叫常…...

pytorch实现transformer模型

Transformer是一种强大的神经网络架构&#xff0c;可用于处理序列数据&#xff0c;例如自然语言处理任务。在PyTorch中&#xff0c;可以使用torch.nn.Transformer类轻松实现Transformer模型。 以下是一个简单的Transformer模型实现的示例代码&#xff0c;它将一个输入序列转换为…...

【懒加载数据 Objective-C语言】

一、咱们就开始进行懒加载 1.懒加载发现,每一个字典,是不是就是四个键值对组成的: 1)answer:String,中国合伙人, 2)icon:String,movie_zghhr, 3)title:String,创业励志电影, 4)options:Array,21 items 前三个都是String类型,最后是不是Array类型, 所…...

人脸网格/人脸3D重建 face_mesh(毕业设计+代码)

概述 Face Mesh是一个解决方案&#xff0c;可在移动设备上实时估计468个3D面部地标。它利用机器学习&#xff08;ML&#xff09;推断3D面部表面&#xff0c;只需要单个摄像头输入&#xff0c;无需专用深度传感器。利用轻量级模型架构以及整个管道中的GPU加速&#xff0c;该解决…...

JMeter 控制并发数

文章目录一、误区二、正确设置 JMeter 的并发数总结没用过 JMeter 的同学&#xff0c;可以先过一遍他的简单使用例子 https://blog.csdn.net/weixin_42132143/article/details/118875293?spm1001.2014.3001.5501 一、误区 在使用 JMeter 做压测时&#xff0c;大家都知道要这么…...

git常用命令汇总

Git 是一种分布式版本控制系统&#xff0c;它具有以下优点&#xff1a; 分布式&#xff1a;每个开发者都可以拥有自己的本地代码仓库&#xff0c;不需要连接到中央服务器&#xff0c;这样可以避免单点故障和网络延迟等问题。 非线性开发&#xff1a;Git 可以支持多个分支并行开…...

【2023】华为OD机试真题Java-题目0226-寻找相似单词

寻找相似单词 题目描述 给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。 相似单词说明:给定一个单词X,如果通过任意交换单词中字母的位置得到不同的单词Y,…...

【项目管理】晋升为领导后,如何开展工作?

兵随将转&#xff0c;作为管理者&#xff0c;你可以不知道下属的短处&#xff0c;却不能不知道下属的长处。晋升为领导后&#xff0c;如何开展工作呢&#xff1f; 金九银十&#xff0c;此期间换工作的人不在少数。有几位朋友最近都换了公司&#xff0c;职位得到晋升&#xff0c…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...