C#.Net筑基-类型系统②常见类型

image.png

01、结构体类型Struct

结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构。对于一些局部使用的数据结构,优先使用结构体,效率要高很多。

  • 可以有构造函数,也可以没有。因此初始化时可以new,也可以用默认default。但当给字段设置了初始值时,则必须有显示的构造函数。
  • 结构体中可以定义字段、属性、方法,不能使用终结器。
  • 结构体可继承接口,并实现接口,但不能继承其他类、结构体。
  • 结构体是值类型,被分配在栈上面,因此在参数传递时为值传递。

⁉️结构体始终都是分配在栈上吗?—— 不一定,当结构体是类的成员时,则会随对象一起分配在堆上。同时当结构体上有引用类型字段时,该字段只存储引用对象的地址,引用对象还是分配在堆上。

void Main()
{Point p1 = default;//Point p1 = default(Point);Point p2 = new Point(1, 2);p1.X = 100;p2.X = 100;
}
public struct Point
{public int X;public int Y;public Point(int x, int y){X = x;Y = y;}
}

1.1、只读结构体与只读函数

readonly struct申明一个只读的结构体,其所有字段、属性都必须是只读的。

public readonly struct Point
{public readonly int X,Y;
}

用在方法上,该方法中不可修改任何字段值。这只能用在结构体中,结构体不能继承,不知道这个特性有什么用?

public struct Point
{public int X;public int Y;public readonly int GetValue(){X--;   //Error:不可修改return X + Y;}
}

1.2、Ref 结构体

ref 结构类型 用ref struct申明,该结构体只能存储在栈上,因此任何会导致其分配到堆上的行为都不支持,如装箱、拆箱,作为类的成员等都不支持。
Ref 结构体 可用于一些高性能场景,System.Span、ReadOnlySpan 都是 readonly ref struct结构体。

public ref struct Point
{public int X,Y;
}

02、枚举Enum

枚举类型 是由基础值类型(byte、int、long等)组成的一组命名常量的值类型,用enum来申明定义。常用于一些有固定值的类别申明,如性别、方向、数据类型等。

  • 枚举成员默认是int,可以修改为其他整数类型,如byteshortuintlong等。
  • 枚举项可设置值,也可省略,或者部分设置值。值默认是从0开始,并按顺序依次递增。
  • 枚举变量的默认值始终是0
  • 枚举本质上就是命名常量,因此可以与值类型进行相互转换(强制转换)。
  • 特性Description常用来定义枚项在UI上的显示内容,使用反射获取。
public enum UserType : int  //常量类型,可以修改为其他整数类型
{[Description("普通会员")]Default,VIP = 10,SupperVIP,  //继续前一个,值为11
}
void Main()
{var t1 = UserType.Default;Console.WriteLine(t1.ToString()); //输出名称:DefaultConsole.WriteLine((int)t1);       //输出值:0Console.WriteLine($"{t1:F}");     //输出名称:DefaultConsole.WriteLine($"{t1:D}");     //输出值:0var t2 = (UserType)0;int t3 = (int)UserType.Default;Console.WriteLine(t1 == t2); //True
}

2.1、Enum 类API

System.Enum 类型是所有枚举类型的抽象基类,提供了一些API方法用于枚举的操作,基本都是静态方法。Enum 类型还可以作为泛型约束使用。

🔸静态成员说明
HasFlag(Enum)判断(位域)枚举是否包含一个枚举值,返回bool
🔸静态成员说明
GetName<TEnum>(TEnum)获取枚举值的(常数)名称
GetNames<TEnum>()获取枚举定义的所有(常数)名称数组
GetValues<TEnum>()获取枚举定义的所有成员数组
IsDefined(Type, Object)判断给定的值(数值或名称)是否在枚举中定义
Parse<TEnum>(String)解析数值、名称为枚举,转换失败抛出异常
TryParse<TEnum>(String, TEnum)安全的转换,同上,转换结果通过out参数输出,返回bool表示是否转换成功
🔸其他说明
Type.IsEnumType的属性,用于判断一个类型是否枚举类型

2.2、位域Flags

枚举位域用[Flags]特性标记,从而可以使用枚举的位操作,实现多个枚举值合并的的能力。在有些多选值的场景很有用,用一个数值可表示多个内容,如QQ的各种钻(绿钻、红钻、黄钻…)用一个值就可以表示,参考下面代码示例。

  • 枚举定义时加上特性[Flags]
  • 要求枚举值必须是2的n次方,主要是各个成员的二进制值的对应位都不能一样,才能保障按位与、按位或运算的正确。
  • 合并值用按位或|,判断是否包含可以用按位与&,或者方法HasFlag(e)
  • 枚举类型命名一般建议用复数名词。
void Main()
{var t1 = QQDiamond.Green|QQDiamond.Red; //按位或运算,合并多个成员值Console.WriteLine((int)t1); //3,同时为绿钻、红钻//判断是否绿钻Console.WriteLine(t1.HasFlag(QQDiamond.Green)); //True//判断是否红钻,效果同上Console.WriteLine((t1 & QQDiamond.Red) == QQDiamond.Red); //True
}[Flags]
public enum QQDiamond : sbyte
{None=0b0000,  //或者0[Description("绿钻")]Green=0b0001, //或者1Red=0b0010,   //或者2、1<<1Blue=0b0100,  //或者4、1<<2Yellow=0b1000,//或者8、1<<3
}

2.3、枚举值转换

枚举值为整形,枚举名称为string,因此常与int、string进行转换。

🔸转换为枚举说明
Enum.Parse()/TryParse()转换枚举值(字符串形式)、枚举名称为枚举对象,支持位域Flgas
TEnum(int)强制转换整形值为枚举,如果没有不会报错,支持位域Flgas
/Parse/TryParse方法解析
var t1 = Enum.Parse<QQDiamond>("3");     //Green
var t2 = Enum.Parse<QQDiamond>("Green"); //Green
//强转
QQDiamond t3 =(QQDiamond)56;
🔸枚举转换为string、int说明
ToString()获取枚举名称,支持位域Flgas
Enum.GetName(e)获取枚举名称,不支持位域Flgas
字符格式:G(或F)获取枚举名称,其中F主要用于Flgas枚举
强制类型转换:(int)TEnum获取枚举值
字符格式:D(或X)格式化中获取枚举值,D为十进制整形,X为16进制
//string
var s1 = qd.ToString();    //Green
var s2 = Enum.GetName(qd); //Green  不支持位于Flgas
var s3 = $"{qd:G}";        //Green
//int
var n1 = (int)qd;   //1
var n2 = $"{qd:D}"; //1

03、日期和时间的故事

在System命名空间中有 下面几个表示日期时间的类型:都是不可变的、结构体(Struct)

类型说明
DateTime常用的日期时间类型,默认使用的是本地时间(本地时区)
DateTimeOffset支持时区偏移量的的 DateTime,适合跨时区的场景。
TimeSpan表示一段时间的时间长度(间隔),或一天内的时间(类似时钟,无日期)
DateOnly 、 TimeOnly.NET 6 引入的只表示日期、时间,结构更简单轻量,适合特点场景
TimeZoneInfo时区,可表示世界上的任何时区

📢Ticks: 上面几个时间对象中都有一个 Ticks值,其值为从公元0001/01/01开始的计数周期。1 Tick (一个周期)为100纳秒(ns),0.1微秒(us),千万分之一秒,可以看做是C#中的最小时间单位。

Console.WriteLine(DateTime.Now.Ticks);            //638504277997063647
Console.WriteLine(DateTimeOffset.Now.Ticks);      //638504277997063874
Console.WriteLine(TimeSpan.FromSeconds(1).Ticks); //10000000

3.1、什么是UTC、GMT?

UTC(Coordinated Universal Time)世界标准时间(协调时间时间),简单理解就是 0时区的时间,是国际通用时间。它与0度经线的平太阳时相差不超过1秒,接近格林尼治标准时间(GMT)。

**格林尼治标准时间(Greenwich Mean Time,GMT)**是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。

📢 由于地球在它的椭圆轨道里的运动速度不均匀,因此GMT是不稳定的。而UTC时间是由原子钟提供的,更为精确可靠,基本上已经取代GMT标准了。

image.png

我们日常使用的DateTime.Now获取的时间其实是带了本地时区的(TimeZone),北京时区(+8小时),就是相比UTC时间,多了8个小时的偏差(时差)。DateTime 的Kind属性为DateTimeKind枚举,指定了时区类型:

  • Unspecified:不确定的,大部分场景会被认为是Local的。
  • Utc:UTC标准时区,偏移量为0。
  • Local(默认值):本地时区的时间,偏移量根据本地时区计算,如北京时间的偏移量为+8小时
public enum DateTimeKind
{Unspecified,Utc,Local
}

3.2、DateTime

🔸静态成员说明
Now、UtcNow当前本地时间、当前UTC时间,还有一个Today 只有日期部分的值
MinValue、MaxValue最小、最大值
UnixEpochUnix 0点的时间,值就是 1970 年 1 月 1 日的 00:00:00.0000000 UTC
Parse、ParseExact解析字符串转换为DateTime值,转换失败会抛出异常
TryParse、TryParseExact作用同上,安全版本的,Exact版本的方法可配置时间字符格式
🔸实例成员说明
Date只有日期部分的DateTime值
KindDateTimeKind 类型,默认Local,构造函数中可以指定
Ticks计时周期总数,单位为100ns(纳秒)
Year、Month、Day…当前时间的年、月、日、星期等等
🔸方法
Add***添加值后返回一个新的 DateTime,可以为负数
ToString(String)转换为字符串,指定日期时间格式,详细格式参考《String字符串全面了解》
ToUniversalTime()转换为UTC时间

3.3、DateTimeOffset

DateTimeOffset 和 DataTime 很像,使用、构造方式、API都差不多。主要的区别就是多了时区(偏移Offset),构造函数中可以用 TimeSpan 指定偏移量。DateTimeOffset 内部有两个比较重要的字段:

  • 用一个短整型 short _offsetMinutes 来存储时区偏移量(基于UTC),单位为分钟。
  • 用一个DateTime 存储始终为UTC的日期时间。
🔸静态成员说明
UtcTicks(UTC) 日期和时间的计时周期数
Offset时区偏移量,如北京时间:DateTimeOffset.Now.Offset //08:00:00
UtcDateTime返回本地UTC的DateTime
LocalDateTime返回本地时区的DateTime
DateTime返回Kind类型为Unspecified的DateTime,忽略了时区的DateTime值

image.png

用一个示例来理解DataTime、DataTimeOffset的区别: 比如你在一个跨国(跨时区)团队,你要发布一个通知:

  • “本周五下午5点前提交周报”,不同时区都是周五下午5点前提交报告,虽然他们不是同一时刻,此时可用DateTime
  • “明天下午5点开视频会”,此时则需要大家都在同一时刻上线远程会议,可能有些地方的是白天,有些则在黑夜,此时可用DateTimeOffset。

3.4、TimeSpan

TimeSpan 用来表示一段时间长度,最大值为1000W天,最小值为100纳秒。常用TimeSpan.From***()、构造函数、或DateTime的 差值结果 来构造。

TimeSpan t1 =TimeSpan.FromSeconds(12);  //00:00:12  //12秒
TimeSpan t2= new TimeSpan(12,0,0) - t1; //11:59:48  //11小时59分48秒
TimeSpan t3 = DateTime.Now.AddSeconds(12) - DateTime.Now; 00:00:12
var t4 = new TimeSpan(15,1,0,0); //15.01:00:00  //15天1小时
var t5= DateTime.Now.TimeOfDay;  //当天的时间

04、record是什么类型?

record 记录类型用来定义一个简单的、不可变(只读) 的数据结构,定义比较方便,常用于一些简单的数据传输场景。record 本质上就是定义一个class类型(也可申明为record struct结构体),因此语法上就是 类型申明+主构造函数的形式。

🚩 可以把 Record 看做是一个快速定义类(结构体)的语法糖,编译器会构建完整的类型。

  • 构造函数中的参数会生成公共的只读属性,其他自动生成的内容还包括EqualsToString、解构赋值等。
  • record 默认为class(可缺省),用record struct 则可申明为一个结构体的。
  • record 类型可以继承另一个record类型,或接口,但不能继承其他普通class
  • 支持使用with语句创建非破坏性副本。
public record Car(string Width);				//class
public record struct User(string Name, int Age);//struct
public record class Person(DateTime Birthday);  //class
void Main()
{var u1 = new User("sam",122);var u2 = new User("sam",122);u1.Age = 1; //只读,不可修改Console.WriteLine(u1 ==u2);                       //TrueConsole.WriteLine(Object.ReferenceEquals(u1,u2)); //Falsevar (name,_) = u1;       //解构赋值Console.WriteLine(name); //sam
}
public record Person2 //创建一个可更改的recored类型
{public string FirstName { get; set; }public string LastName { get; set; }
};

通过查看编译后的代码来了解recored的本质,下面是代码public record User(string Name, int Age)编译后生成的代码(简化后),完整代码可查看在线 sharplab代码。

  • 主构造函数中的参数都生成了只读属性,如果是struct结构体则属性是可读、可写的。
  • 生成了ToString() 方法,用stringBuilder 打印了所有字段名、字段值。
  • 生成了相等比较的方法、相等运算符重载,及GetHashCode(),相等比较会比较字段值。
  • 还生成了Deconstruct方法,用来支持解构赋值,var (name,age) = new User("sam",19);
public class User : IEquatable<User>
{public string Name{get;init;}public int Age{get;init;}public User(string Name, int Age){this.Name = Name;this.Age = Age;}public override string ToString(){StringBuilder stringBuilder = new StringBuilder();//把所有字段名、值输出return stringBuilder.ToString();}public static bool operator !=(User left, User right){return !(left == right);}public static bool operator ==(User left, User right){...}public override int GetHashCode(){...}public virtual bool Equals(User other){...}//支持解构赋值Deconstructpublic void Deconstruct(out string Name, out int Age){Name = this.Name;Age = this.Age;}}

record 申明可以用简化的语法(只有主构造函数,没有“身体”),也可以和class一样自定义一些内部成员。如下面示例中,自定义实现了ToString方法,则编译器就不会再生成该方法了,同时这里加了密封sealed标记,子类也就不能重写了。

void Main()
{var u = new User("John", 25);Console.WriteLine(u.ToString());u.SayHi();
}public record User(string Name, int Age)
{public sealed override string ToString() => $"{Name} {Age}"; public void SayHi() => Console.WriteLine($"Hi {Name}");
}

05、元祖Tuple

元祖 Tuple 其实就微软内置的一组包含若干个属性的泛型类型,包括结构体类型的 System.ValueTuple、引用类型的 System.Tuple,包含1到8个只读属性。

  • System.ValueTuple,是值类型,结构体,成员是字段,可修改。
  • System.Tuple 类型是引用类型,成员是只读属性。

image.png

📢 优先推荐使用 ValueTuple,这也是微软深度支持的,性能更好,默认类型推断用的都是ValueTuple。Tuple 作为历史的产物,在语言级别没有任何特殊支持。

下面代码为Tuple<T1>的源代码,就是这么朴实无华,其他就是相等比较、ToString、索引器。

public struct ValueTuple<T1, T2>
{public T1 Item1;public T2 Item2;public ValueTuple(T1 item1, T2 item2){Item1 = item1;Item2 = item2;}
}

🚩C#在语法层面对ValueTuple的操作提供了很多便捷支持,让元祖的使用非常简单、优雅,基本可以替代匿名类型。

  • 简化 Tuplec 申明:用括号的简化语法,(Type,Type,...)(string,int)等效于ValueTuple<string,int>,编译器会进行类型推断。
  • 值相等:元祖内部实现了相等比较操作符重载,比较的是字段值。
  • 元素命名:元祖可以显示指定字段名称,比原来的无意义Item1、Item2好用多了。不过命名是开发态支持,编译后还是Item1、Item2,因此在运行时(反射)不可用。
  • 解构赋值,元祖对解构的支持是编译器行为。
ValueTuple<double,double> p1 = new (1,5);
//简化语法
(double, double) p2 = (3, 5.5);
var p3 = (3, 5.5); //类型推断,进一步简化
var dis = p2.Item1 * p2.Item2; //Item1、Item2 成员
//值比较
Console.WriteLine(p2 == p3); //True
//命名,有名字的元祖
var p4 = (Name:"sam",Age:22);
Console.WriteLine(p4.Name); //sam
//解构赋值
var (n,age) = p4;
Console.WriteLine(n); //sam

元祖的一个比较适用场景就是方法返回多个值,虽然本质上还是一个“值”。

void Main()
{var u = FindUser(1);var (nn,ss) = FindUser(2);Console.WriteLine(u.name+u.score);Console.WriteLine(nn+ss);
}public (string name,int score) FindUser(int id) //返回一个元祖
{return ("sam",1000);
}

06、匿名类型(Class)

匿名类型就是无需事先申明,可直接创建任意实例的一种类型。使用 new {}语法创建,创建时申明字段并赋值。

  • 由编译器进行推断创建出一个完整类型。
  • 匿名类型属性都是只读的,同时实现了相等比较、ToString()方法。
var u = new { Name = "same", Age = 10, Birthday = DateTime.Now };
Console.WriteLine(u.Name);
//u.Age=120; //只读不可修改

因此,匿名类型也是一种语法糖,由编译器来生成完整的类型。大多数场景都可以由 ValueTuple 代替,性能更好,也不需要额外的类型了。

image.png


07、其他内置类型

7.1、Console

Console 静态类,控制台输入、输出。

成员说明
BackgroundColor获取、设置控制台背景色
ForegroundColor获取、设置控制台前景色
WriteLine(String)输出内容到控制台
ReadLine()接受控制台输入
Beep()播放一个提示音,参数还可以设置播放时长
Clear()清空控制台

7.2、Environment

Environment 静态类,提供全局环境的一些参数和方法,算是比较常用了。

成员说明
CurrentDirectory当前程序的工作目录,是运行态可变的,不一定是exe目录
ProcessPath当前程序exe的地址,.NET 5支持
CurrentManagedThreadId当前托管现线程的ID
Is64BitOperatingSystem获取操作系统是否64位,Is64BitProcess 获取当前进程是否64位进程。
NewLine换行符(\\r\\n
OSVersion获取操作系统信息
ProcessId获取当前进程ID
ProcessorCount获取CPU处理器核心数
UserName获取当前操作系统的用户名
WorkingSet获取当前进程的物理内存量
Exit(Int32)退出进程
GetFolderPath(SpecialFolder)获取系统特定文件夹目录,如临时目录、桌面等
SetEnvironmentVariable设置环境变量

7.2、AppDomain、AppContext

  • AppDomain 是.Net Framework时代的产物,用来表示一个应用程序域,进程中可以创建多个引用程序域,拥有独立的程序集、隔离环境。在.Net Core 中 其功能大大削弱了,不再支持创建AppDomain,就只有一个CurrentDomain了。
  • AppContext 表示全局应用上下文对象,是一个静态类。.NET Core引入的新类,可用来存放一些全局的数据、开关,API比较少。

image.png

AppDomain成员说明
CurrentDomain静态属性,获取当前应AppDomain
BaseDirectory ⭐获取程序跟目录
Load(AssemblyName)加载程序集Assembly
UnhandledException ⭐全局未处理异常 事件,可用来捕获处理全局异常
AppContext成员说明
BaseDirectory获取程序跟目录⭐
TargetFrameworkName获取当前.Net框架版本
GetData(String)获取指定名称的对象数据,SetData 设置数据。
TryGetSwitch(String, Boolean)获取指定名称的bool值数据,SetSwitch 设置数据。

参考资料

  • .NET类型系统①基础
  • C# 文档
  • 日期、时间和时区
  • 《C#8.0 In a Nutshell》

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

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

相关文章

阿里又出AI神器,颠覆传统图像编辑,免费开源!

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 最近阿里开源了 Mi…

003.Linux SSH协议工具

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

最新麻豆MDYS14源码 油条视频 苹果CMS系统 附搭建教程

在数字化的时代&#xff0c;视频网站已经成为人们获取娱乐和信息的主要渠道之一。而在众多的视频网站中&#xff0c;使用麻豆MDYS14源码搭建的网站无疑是最具有吸引力的。本文将为你介绍麻豆MDYS14源码的基本特性&#xff0c;以及如何利用它打造一款完美的视频网站。 首先&…

记录一次mysql长事务的经历

目录 一.项目介绍 二.问题暴漏 三.问题排查 1.连接池方向 2.数据库方向 四.代码模拟 五.错误原因分析 1.MySQL参数优化 2.代码优化 六.总结 一.项目介绍 项目是springbootnacos的微服务架构,商城购物类系统,分多个服务,问题出现在众多服务中的单个服务 二.问题暴漏…

CAD二次开发(11)-在用C#进行CAD开发SQLite和SqlSugar的使用

1. System.Data.SQLite的使用 1.1 包的引入 利用 Nuget引入其相关包 1.2 App.config配置引入到CAD 因为我们当前的项目是类库项目&#xff0c;需要依托于宿主程序才可以运行&#xff0c;所以我们就得需要将SQLite自动生成的App.config里面的部分配置移植到CAD的配置文件中…

DC/AC电源模块:为医疗设备提供安全可靠的电力转换

BOSHIDA DC/AC电源模块&#xff1a;为医疗设备提供安全可靠的电力转换 DC/AC电源模块是一种用于将直流电源转换为交流电源的设备&#xff0c;广泛应用于各种医疗设备中。它们的主要功能是为医疗设备提供安全可靠的电力转换&#xff0c;以确保这些设备在工作过程中提供稳定的电…

硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决

在计算机世界中&#xff0c;文件系统是数据管理的基石&#xff0c;而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势&#xff0c;并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…

android中的JNI的DEMO

一&#xff1a;源代码 native-lib.cpp #include "native-lib.h"JNIEXPORT jint JNICALL Java_com_example_jnidemo_MainActivity_add(JNIEnv* env, jobject, jint a, jint b) {return a b; }JNIEXPORT jint JNICALL Java_com_example_jnidemo_MainActivity_subtra…

当 DolphinDB 遇上方程式赛车:捕捉极速赛场上的时间印记

在风驰电掣的赛车场上&#xff0c;每一毫秒都蕴藏着无限的可能。在这里&#xff0c;数据不再是冰冷的数字序列&#xff0c;而是跳动的脉搏&#xff0c;每一次跃动都精准地回应着赛车的每一次呼吸&#xff0c;敏锐感知着赛车的动态。随着物联网和遥测技术的发展&#xff0c;实时…

六西格玛培训新选择,老字号品质有保障!

在追求企业卓越与完美的道路上&#xff0c;六西格玛管理无疑是一个被广泛认可与采纳的方法论。六西格玛不仅仅是一种管理策略&#xff0c;更是一种文化和哲学&#xff0c;它强调通过数据驱动和持续改进来减少流程中的缺陷&#xff0c;提升客户满意度&#xff0c;并最终实现企业…

【ARM Coresight Debug 系列 -- ARMv8/v9 软件实现断点地址设置】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v9 软件设置断点地址断点地址软件配置流程代码实现 ARMv8/v9 软件设置断点地址 在ARMv8/9架构中&#xff0c;可以通过寄存器 DBGBVR0_EL1 设置断点。这个寄存器是一系列调试断点值寄存器中的第一个DBGBVRn_EL1&#xff0c;其…

jpg图片怎么压缩大小?图片压缩,3个方法

在日常生活中&#xff0c;我们经常会面临着需要在网络上传送、分享或存储的图片文件过大的问题&#xff0c;而JPG格式的图片由于其普遍性&#xff0c;也常常成为我们处理的对象。为了解决这一常见的挑战&#xff0c;学会如何压缩JPG图片的大小是非常实用的技能。 在这篇文章中…

「51媒体」电视台媒体邀约采访报道怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电视台作为地方主流媒体&#xff0c;对于新闻报道有着严格的选题标准和报道流程。如果您希望电视台对某个会议或活动进行报道&#xff0c;可以按这样的方法来做&#xff1a; 1.明确活动信…

鼠情自动监测系统

TH-SH1在农业生产中&#xff0c;鼠害问题一直是困扰农民的一大难题。传统的鼠害防治方法往往依赖于大规模施药或布置捕鼠器等方式&#xff0c;这些方法不仅效率低下&#xff0c;而且容易对环境造成污染。随着科技的不断发展&#xff0c;鼠情自动监测系统应运而生&#xff0c;为…

LabVIEW Windows与RT系统的比较与选择

LabVIEW是一种系统设计和开发环境&#xff0c;广泛应用于各类工程和科学应用中。LabVIEW Windows和LabVIEW RT&#xff08;Real-Time&#xff09;是LabVIEW的两个主要版本&#xff0c;分别适用于不同的应用场景。以下从多个角度详细分析两者的区别&#xff0c;并提供选择建议。…

云计算 | (七)特殊云机制

文章目录 📚自动伸缩监听器📚负载均衡器📚SLA监控器📚按使用付费监控器📚审计监控器📚故障转移系统📚虚拟机监控器📚资源集群📚多设备代理📚状态管理数据库📚自动伸缩监听器 自动伸缩监听器 (Automated scaling listener)是一个服务代理,它监控和追踪…

JavaFX 下拉框

组合框允许用户选择几个选项之一。用户可以滚动到下拉列表。组合框可以是可编辑和不可编辑的。 创建组合框 以下代码将选项列表包装到ObservableList中&#xff0c;然后使用observable列表实例化ComboBox类。 ObservableList<String> options FXCollections.observab…

机器学习课程复习——朴素贝叶斯

1. 定义 是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。 2. 公式 原版公式 简化版公式 由于上述公式无法计算&#xff0c;引入条件独立假设 条件独立版公式 3. 贝叶斯分类器 由上述公式可得贝叶斯分类器 化简为 4. 参数估计 4.1. 极大似然估计 4.2. 学习与分…

【规格说明】软件需求规格说明书实际项目案例模板(doc原件套用)

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需求 3.9 环境需求…

【Nginx系列】反向代理在现代网络架构中的重要性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…