【C# Programming】值类型、良构类型
值类型
1、值类型
值类型的变量直接包含值。换言之, 变量引用的位置就是值内存中实际存储的位置。
2、引用类型
引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。
复制引用类型的值时,复制的只是引用。这个引用非常小(32位机器时4 字节引用)
3、结构
除string 和object 是引用类型,所有C# 内建类型都是值类型。C#也 允许用户自定义值类型。
结构是一种自定义的值类型,它使用关键字struct。 例如:
struct Angle
{public Angle(int degrees, int minutes, int seconds){Degrees = degrees;Minutes = minutes;Seconds = seconds;}// Using C# 6.0 read-only, automatically implememted properties.public int Degrees { get; }public int Minutes { get; }public int Seconds { get; }public Angle Move(int degrees, int minutes, int seconds){return new Angle(Degrees + degrees, Minutes + minutes, Seconds + seconds);}
}
3.1 结构的初始化
- 除了属性和字段,结构还可包含方法和构造器。结构不允许包含用户定义的默认构造器。在没有提供默认的构造器时, C# 编译器会自动生成一个默认构造器将所有字段初始化为各自的默认值。
- 为了确保值类型的局部变量能完全初始化,结构的每个构造器都必须初始化结构中所有字段。如果对结构的所有数据初始化失败,会造成编译错误。
- C# 禁止结构中的字段初始化器,例如:
struct Angle
{//……// ERROR: Fields cannot be initialized at declaration time// private int _Degrees = 42;
}
- 为值类型使用new 操作符,会造成“运行时”在临时存储池中创建对象的新实例,并将所有字段初始化为默认值。
4、default 操作符的使用
所有值类型都有自定义的无参构造器将值类型的实例初始化成默认状态。所以总可以合法使用new操作符创建值类型的变量。除此之外,还可使用default操作符生成结构的默认值。例如:
struct Angle
{public Angle(int hours, int minutes): this(hours, minutes, default(int)) {}public Angle(int degrees, int minutes, int seconds){Degrees = degrees;Minutes = minutes;Seconds = seconds;}public int Degrees { get; }public int Minutes { get; }public int Seconds { get; }public Angle Move(int degrees, int minutes, int seconds){return new Angle(Degrees + degrees, Minutes + minutes, Seconds + seconds);}
}
5、值类型的继承和接口
- 所有值类型都隐式密封
- 除枚举外,所有值类型都派生自 System.ValueType
- 值类型也能实现接口
6、装箱
6.1 将值类型转换为一个引用类型称为装箱(boxing) 转换。 转换的结果时对一个存储位置的引用。
转换的步骤如下:
- 在堆上分配内存, 它将用于存放值类型数据以及少许额外开销。
- 接着发生一次内存复制,当前存储位置的值类型数据被复制到堆上分配好的位置。
- 转换的结果是对堆上新存储位置的引用
6.2 相反的过程称为拆箱(unboxing).拆箱转换先检查已经装箱的值的类型兼容于要拆箱成的值类型,然后复制堆中存储的值
6.3 装箱/拆箱的CIL 代码
6.4 如果装箱和拆箱进行的不是很频繁,那么实现它们的性能问题不大。但有的时候,装箱会频繁发生,这就可能大幅影响性能。例如:
static void Main()
{int totalCount;System.Collections.ArrayList list = new System.Collections.ArrayList();Console.Write("Enter a number between 2 and 1000:");totalCount = int.Parse(Console.ReadLine());// Execution-time error:// list.Add(0); // Cast to double or 'D' suffix required. Whether cast or using 'D' suffix, list.Add((double)0); // boxinglist.Add((double)1); // boxingfor(int count = 2; count < totalCount; count++){list.Add(((double)list[count - 1] + // unboxing(double)list[count - 2])); // unboxing}foreach(double count in list) // unboxing Console.Write("{0}, ", count);//boxing
}
6.5 另一个装箱/拆箱例子 (接口要求被调用者为引用类型):
class Program
{static void Main(){Angle angle = new Angle(25, 58, 23);object objectAngle = angle; // BoxConsole.Write(((Angle)objectAngle).Degrees);((Angle)objectAngle).MoveTo(26, 58, 23); // Unbox, modify unboxed value, and discard valueConsole.Write(", " + ((Angle)objectAngle).Degrees);((IAngle)angle).MoveTo(26, 58, 23); // Box, modify boxed value, and discard reference to boxConsole.Write(", " + ((Angle)angle).Degrees);((IAngle)objectAngle).MoveTo(26, 58, 23); // Modify boxed value directlyConsole.WriteLine(", " + ((Angle)objectAngle).Degrees);}
}
interface IAngle
{void MoveTo(int hours, int minutes, int seconds);
}
struct Angle : IAngle
{public Angle(int degrees, int minutes, int seconds) {Degrees = degrees;Minutes = minutes;Seconds = seconds;}// NOTE: This makes Angle mutable, against the general guidelinepublic void MoveTo(int degrees, int minutes, int seconds) {Degrees = degrees;Minutes = minutes;Seconds = seconds;}public int Degrees {get; set;}public int Minutes {get; set;}public int Seconds {get; set;}
}
6.6 如果将值类型的实例作为接收者来调用object 声明的虚方法时
- 如果接收者已拆箱,而且结构重写了该方法,将直接调用重写的方法。因为所有值类型都是密封的。
- 如果接收者已拆箱,而且结构没有重写该方法,就必须调用基类的实现。该实现预期的接收者是一个对象引用。所以接收者被装箱。
- 如果接收者已装箱,而且结构重写了该方法,就将箱子的存储位置传给重写的方法,不对其拆箱。
- 如果接收者已装箱,而且结构没有重写该方法,就将箱子的引用传给基类的实现,该实现预期正是一个引用。
7、枚举
- 枚举是由开发者声明的值类型。枚举的关键特征是在编译时声明了一组可以通过名称来引用的常量值。例如:
enum ConnectionState
{Disconnected,Connecting,Connected,Disconnecting
}
- 想要使用枚举值需要为其附加枚举名称前缀。 例如:ConnectionState. Connecting
- 枚举值实际是作为整数常量实现的,第一个枚举值默认为0, 后续每项都递增1, 然而可以显式为枚举赋值。例如:
enum ConnectionState : short
{Disconnected,Connecting = 10,Connected,Joined = Connected,Disconnecting
}
- 所有的枚举基类都是System.enum. 后者从System.ValueType 派生。除此之外,不能从现有枚举类型派生以添加额外成员
- 对于枚举类型,它的值并不限于限于声明中命名的值。 只要值能转换成基础类型,就能转换枚举值。
8、枚举和字符串之间的转换
- 枚举的一个好处是ToString() 方法会输出枚举值的标识符。
- 使用Enum.Parse可以将字符串转换为枚举
public static void Main()
{ThreadPriorityLevel priority = (ThreadPriorityLevel)Enum.Parse(typeof(ThreadPriorityLevel), "Idle");Console.WriteLine(priority);
}
- 为了避免抛出异常,C#4.0 后提供了TryParse 方法。
public static void Main()
{System.Diagnostics.ThreadPriorityLevel priority;if(Enum.TryParse("Idle", out priority)){Console.WriteLine(priority);}
}
9、枚举作为标志使用
- 枚举值还可以组合以表示复合值。 此时,枚举声明应使用 Flags 属性进行标记以表示枚举值可以组合, 例如:
[Flags]
public enum FileAttributes
{None = 0, // 000000000000000ReadOnly = 1 << 0, // 000000000000001Hidden = 1 << 1, // 000000000000010System = 1 << 2, // 000000000000100Directory = 1 << 4, // 000000000010000Archive = 1 << 5, // 000000000100000Device = 1 << 6, // 000000001000000Normal = 1 << 7, // 000000010000000Temporary = 1 << 8, // 000000100000000SparseFile = 1 << 9, // 000001000000000ReparsePoint = 1 << 10, // 000010000000000Compressed = 1 << 11, // 000100000000000Offline = 1 << 12, // 001000000000000NotContentIndexed = 1 << 13, // 010000000000000Encrypted = 1 << 14, // 100000000000000
}
- 可以使用按位OR 操作符联结枚举值,使用按位AND操作符测试特定位是否存在
public static void ChapterMain()
{string fileName = @"enumtest.txt";System.IO.FileInfo file = new System.IO.FileInfo(fileName);file.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly;Console.WriteLine(“{0} | {1} = {2}”, FileAttributes.Hidden, FileAttributes.ReadOnly, (int)file.Attributes);if((file.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)throw new Exception("File is not hidden.");if((file.Attributes & FileAttributes.ReadOnly) != FileAttributes.ReadOnly)throw new Exception("File is not read-only.");
}
- 枚举声明中也可以用标志组合定义额外的枚举值
[Flags]
enum DistributedChannel
{None = 0,Transacted = 1,Queued = 2,Encrypted = 4,Persisted = 16,FaultTolerant = Transacted | Queued | Persisted
}
良构类型
1、重写ToString
- 默认情况下,在任何对象上调用ToString() 将返回类的完全限定名称 。例如:在一个Sytem.IO.FileStream对象上调用ToString() 方法将返回字符串 System.IO.FileStream
- Console.WriteLine() 和System.Diagnostics.Trace.Write 等方法会调用对象的ToString 方法。 因此,重写ToString 输出比默认值更有意义的信息
public struct Coordinate
{public Coordinate(Longitude longitude, Latitude latitude) {Longitude = longitude;Latitude = latitude;}public Longitude Longitude { get; }public Latitude Latitude { get; }public override string ToString() =>$"{ Longitude } { Latitude }";
}
public struct Longitude { }
public struct Latitude { }
- 由于缺乏本地化和其他高级格式化功能,所以它不太适合一般性用户文本显示
2、重写GetHashCode
散列码的作用是生成与对象值对应的数字,从而高效地平衡散列表。 为了获得良好的GetHashCode() 的实现,请参照以下原则
- 必须:相等的对象必须有相等的散列值。(若a.Equals(b)),则 a.GetHashCode ()== b.GetHashCode()
- 必须:在特定对象的生存期内,GetHashCode() 始终返回相同的值,即使对象数据发生了变化。
- 必须: GetHashCode() 不应引发任何异常。它总是成功返回一个值
- 性能: 散列码应尽可能唯一
- 性能: 可能的散列码的值应当尽可能在int 范围内平均分布
- 性能: GetHashCode() 的性能应该优化,它通常在Equals 中实现用于“短路”一次完整的相等性比较。所以当类型作为字典集合中的key 使用时,会频繁调用该方法
- 性能:两个对象的细微差别应造成散列码的极大差异。 理想情况下,1位的差异应造成散列码平均16位的差异,这有助于保持散列的平衡性
- 安全性: 攻击者应该难以伪造具有特定散列值的对象
在重写Equals或者将类作为散列表集合的键时,需要重写GetHashCode。(如:Collections.HashTable 和 Collections.Generic.Dictionary)
public struct Coordinate
{public Coordinate(Longitude longitude, Latitude latitude){Longitude = longitude;Latitude = latitude;}public Longitude Longitude { get; }public Latitude Latitude { get; }public override int GetHashCode(){int hashCode = Longitude.GetHashCode();// As long as the hash codes are not equalif(Longitude.GetHashCode() != Latitude.GetHashCode()){hashCode ^= Latitude.GetHashCode(); // eXclusive OR}return hashCode;}public override string ToString() => string.Format("{0} {1}", Longitude, Latitude);
}
public struct Longitude { }
public struct Latitude { }
通常采用的方法是像相关类型的散列码应用XOR 操作符,并确保XOR的操作数不相近或相等。否则结果全为零。在操作数相近或相等的情况下,考虑改为使用移位和加法的操作。
为了进行更细致的控制,应该使用移位操作符来分解比int 大的类型。 例如,对于一个名为value 的long类型,int GetHashCode() {return ((int)value ^ (int)(value >>32))} ;
如果基类不是object, 应该在XOR 赋值中包含base.GetHashCode()
假如计算得到的值可能改变,或者哉将值缓存之后能显著优化性能,就应该对散列值进行缓存。
3、重写Equals
对象同一性 和相等的对象值
- 两个引用如果引用同一个对象,就说它们是同一的。object 包含名为ReferenceEquals() 的静态方法,它能显式检查对象的同一性
- 两个对象实例的成员值部分或全部相等,也可以说它们相等
实现Equals
- 检查是否为null
- 如果是引用类型,就检查引用是否相等
- 检查数据类型是否相同
- 一个指定了具体类型的辅助方法,它能将操作数视为要比较的类型,而不是将其视为对象
- 可能要检查散列码是否相等。
- 如果基类重写了Equals,就检查base.Equals()
- 比较每一个标识字段,判断是否相等
- 重写GetHashCode
- 重写== 和!= 操作符
重写Equals 例子:
//例1:
public sealed class ProductSerialNumber
{public ProductSerialNumber(string productSeries, int model, long id){ProductSeries = productSeries;Model = model;Id = id;}public string ProductSeries { get; }public int Model { get; }public long Id { get; }public override int GetHashCode(){int hashCode = ProductSeries.GetHashCode();hashCode ^= Model; // Xor (eXclusive OR)hashCode ^= Id.GetHashCode(); // Xor (eXclusive OR)return hashCode;}public override bool Equals(object obj){if(obj == null )return false;if(ReferenceEquals(this, obj))return true;if(this.GetType() != obj.GetType())return false;return Equals((ProductSerialNumber)obj);} public bool Equals(ProductSerialNumber obj){return ((obj != null) && (ProductSeries == obj.ProductSeries) &&(Model == obj.Model) && (Id == obj.Id));}//....
}//例2:
public static void Main()
{ProductSerialNumber serialNumber1 =new ProductSerialNumber("PV", 1000, 09187234);ProductSerialNumber serialNumber2 = serialNumber1;ProductSerialNumber serialNumber3 = new ProductSerialNumber("PV", 1000, 09187234);// These serial numbers ARE the same object identity.if(!ProductSerialNumber.ReferenceEquals(serialNumber1, serialNumber2))throw new Exception("serialNumber1 does NOT " + "reference equal serialNumber2");// And, therefore, they are equal.else if(!serialNumber1.Equals(serialNumber2))throw new Exception("serialNumber1 does NOT equal serialNumber2");else {Console.WriteLine("serialNumber1 reference equals serialNumber2");Console.WriteLine("serialNumber1 equals serialNumber2");}// These serial numbers are NOT the same object identity.if(ProductSerialNumber.ReferenceEquals(serialNumber1, serialNumber3))throw new Exception("serialNumber1 DOES reference " + "equal serialNumber3");// But they are equal (assuming Equals is overloaded).else if(!serialNumber1.Equals(serialNumber3) || serialNumber1 != serialNumber3)throw new Exception("serialNumber1 does NOT equal serialNumber3");Console.WriteLine("serialNumber1 equals serialNumber3");
}
4、比较操作符重载
实现操作符的过程称为操作符重载. C# 支持重载所有操作符,除了x.y、 f(x)、 new、 typeof、default、checked、unchecked、delegate、is、as、= 和=> 之外
一旦重写了Equals, 就可能出现不一致情况,对两个对象执行Equals()可能返回true,但 ==操作符返回false. 因为==默认也是执行引用相等性检查。因此需要重载相等(==)和不相等操作符(!=)
public sealed class ProductSerialNumber
{//... public static bool operator ==(ProductSerialNumber leftHandSide, ProductSerialNumber rightHandSide){// Check if leftHandSide is null. (operator== would be recursive)if(ReferenceEquals(leftHandSide, null)){return ReferenceEquals(rightHandSide, null); // Return true if rightHandSide is also nulland false otherwise.}return (leftHandSide.Equals(rightHandSide));}public static bool operator !=(ProductSerialNumber leftHandSide, ProductSerialNumber rightHandSide){return !(leftHandSide == rightHandSide);}
}
5、二元操作符重载
+、-、* 、/ 、%、|、^、<<和>> 操作符都被实现为二元静态方法。其中至少一个参数的类型是包容类型。方法名由operator 加操作名构成。
public struct Arc
{public Arc(Longitude longitudeDifference, Latitude latitudeDifference){LongitudeDifference = longitudeDifference;LatitudeDifference = latitudeDifference;}public Longitude LongitudeDifference { get; }public Latitude LatitudeDifference { get; }
}
public struct Coordinate
{//....public static Coordinate operator +(Coordinate source, Arc arc){Coordinate result = new Coordinate( new Longitude( source.Longitude + arc.LongitudeDifference),new Latitude(source.Latitude + arc.LatitudeDifference));return result;}
}
6、 赋值与二元操作符的结合
只要重载了二元操作符,就自动重载了赋值操作符和二元操作符的结合(+=、-=、/=、%=、&=、|=、^=、<<=和>>=. 所以可以直接使用下列代码 coordinate += arc;
它等价于: coordinate = coordinate + arc;
7、一元操作符
- 一元操作符的重载类似于二元操作符的重载,只是它们只获取一个参数 该参数必须是包容类型。
public struct Latitude
{//……// UNARYpublic static Latitude operator -(Latitude latitude){return new Latitude(-latitude.Degrees);}public static Latitude operator +(Latitude latitude){return latitude;}
}
- 重载 true 和 false 时,必须同时重载两个操作符。它们的签名和其他操作符重载必须相同,但是返回值必须时一个bool 值。
public struct Example
{//public static bool operator false(object item)//{// return true;// // ...//}//public static bool operator true(object item)//{// return true;// // ...//}
}
- 重载true和false 的操作符类型可以在 if、do、while 和for 语句的控制表达 式中使用
8、引用程序集
开发者可以将程序的不同部分转移到单独的编译单元中,这些单元称为类库,或者简称库。 然后程序可以引用和依赖类库来提供自己的一部分功能。
更改程序集目标:
编译器允许通过/target 选项创建下面4种不同的程序集类型
- 控制台程序: 省略target 或者指定 /target:exe
- 类库:/target: library
- Window 可执行程序:/target: winexe
- 模块:/target : module
引用程序集:
C# 允许开发者在命令行上引用程序集。方法是使用 /reference (/r)。
例如:csc.exe /R:Coordinates.dll Program.cs
9、类型封装
相关文章:
【C# Programming】值类型、良构类型
值类型 1、值类型 值类型的变量直接包含值。换言之, 变量引用的位置就是值内存中实际存储的位置。 2、引用类型 引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。 复制引用类型的值时,复制的只是引用。这个引用非常小…...
Linux Day18 TCP_UDP协议及相关知识
一、网络基础概念 1.1 网络 网络是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机、 路由器等设备。 1.2 互联网 把多个网络连接起来就构成了互联网。目前最大的互联网就是因特网。 网络设备有:交换机、路由器、…...
【Java 基础篇】Java网络编程实时数据流处理
在现代计算机应用程序中,处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据,需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库,可以用于处理实时数据流。本文将详细介绍如何使用Java进…...
Oracle 和 mysql 增加字段SQL
在Oracle和MySQL中,可以使用ALTER TABLE语句来增加字段。下面是分别是两种数据库增加字段的SQL示例: 在Oracle中增加字段的SQL示例: ALTER TABLE 表名ADD (新字段名 数据类型);例如,如果要在名为"employees"的表中添加…...
【脚本】 【Linux】循环执行命令
loop.sh #!/bin/bashif [ "" "$1" ]; thenecho 用法: ./loop.sh 命令内容 时间间隔(毫秒) 循环次数(小于0表示无限循环)echo 示例: ./loop.sh "ps -ef" 1000 10exit 0 fiinterval1000 if [ "" ! "$2" ]; thenif echo &quo…...
快速用Python进行数据分析技巧详解
概要 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以࿰…...
BD就业复习第二天
Hbase 1. 架构 HBase(Hadoop Database)是一个开源的分布式、面向列族(Column Family)的NoSQL数据库,它是构建在Hadoop之上的。HBase的架构设计旨在处理大规模的数据,特别适用于需要快速读写和随机访问大量…...
大数据Flink(八十五):Window TVF 支持多维数据分析
文章目录 Window TVF 支持多维数据分析 一、Grouping Sets 二、Rollup...
css-边框原理教程
1. CSS中边框原理 他不是一条直线,根据盒子原理,当边框宽度大于元素的长和宽时,呈现一个梯形和三角形的形状,用如下的代码来实地理解一下边框画法实现的原理 注:学习网址: CSS画几种图形的方法_css画图_老…...
【数据结构】时间、空间复杂度
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 时间、空间复杂度 1. 算法效率3. 时…...
Databend 开源周报第 111 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 理解 SHARE END…...
iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程
文章目录 一、环境准备二、基础软件三、扩展:usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子,安装并注册软件(可以百度注册码),最新版本:v17 2、下MacOS系统iOS镜像文件,用于vmware虚拟机安装,当前镜…...
vue3 - Vue 项目处理GitHub Pages 部署后 _plugin-vue_export-helper.js 404
GitHub Demo 地址 在线预览 vue3项目打包后部署到github pages 后,预览网站提示下划线开头的一个文件_plugin-vue_export-helper访问不到,网络请求显示404 处理GitHub Pages 部署 _plugin-vue_export-helper.js 404 https://github.com/rollup/rollup/b…...
一百八十一、Hive——海豚调度HiveSQL任务时当Hive的计算引擎是mr或spark时脚本的区别(踩坑,附截图)
一、目的 当Hive的计算引擎是spark或mr时,发现海豚调度HQL任务的脚本并不同,mr更简洁 二、Hive的计算引擎是Spark时 (一)海豚调度脚本 #! /bin/bash source /etc/profile nowdatedate --date0 days ago "%Y%m%d" y…...
Linux 隔离网段下端口转发
设备在隔离网段下,设置端口转发。使A设备可访问C设备的服务 #!/bin/bash #输出成绩脚本 echo -n "请输入外网服务器的IP地址:" read score sudo iptables -t nat -A PREROUTING -p tcp --dport 1883 -j DNAT --to-destination $score:1883 s…...
【CDN和UDN】CDN和UDN技术特点以及使用场景
内容分发网络(CDN)和用户自定义网络(UDN)是两种不同的网络技术,在选择时,往往不能准备把握具不同的技术特点和应用场景。CDN 主要用于加速内容分发,而 UDN 则主要用于支持用户自定义的网络需求。…...
【Linux】改变缓存路径、清理缓存
写在前面 在做项目的过程中,服务器base路径下空间不足,准备在另一个目录下创建虚拟环境,但在安装的过程中,发现base路径下的空间还是在减少,后来经过学习了解到,pip安装下载依赖包时,会先下载缓…...
python+opencv寻找图片或视频中颜色进行追踪之HSV颜色处理
pythonopencv寻找图片或视频中颜色进行追踪之HSV颜色处理 1.颜色空间转换 import cv2img cv2.imread(1.jpg) # 转换为灰度图 img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(img, img) cv2.imshow(gray, img_gray) cv2.waitKey(0)cv2.cvtColor()用来进行颜色模…...
ubuntu 22.04 服务器网卡无IP地址
ssh连接服务器连接不上,提示如下; 连接显示器,ip addr ls 命令查看IP地址,有网卡但没有IP地址 solution: sudo dhclient enp10s0用于通过 DHCP 协议获取网络配置信息并为名为 enp10s0 的网络接口分配 IP 地址,enp1…...
基于SpringBoot的网上点餐系统
目录 前言 一、技术栈 二、系统功能介绍 用户功能模块 管理员功能模块 美食店功能模块 前台首页功能模块 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 系统管理也都将通过计算机进行整体智能化操作,对于网上点餐系统所牵扯的管理及数据保存…...
浅谈xss
XSS 简介 XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅…...
悬崖边:企业如何应对网络安全漏洞趋势
在本文中,我们将讨论企业在处理漏洞时面临的挑战,解释安全漏洞是如何引发网络攻击的,以及为什么它会导致不可接受的事件。我们还将分享我们在识别趋势性漏洞方面的经验。 现代信息安全方法正在成为企业的工作流程。例如,不久前&a…...
MyBatis 动态 SQL、MyBatis 标签、MyBatis关联查询
MyBatis 动态 SQL、MyBatis 标签、MyBatis关联查询 1、MyBatis动态 sql 的特性2、MyBatis 标签2.1、if 标签:条件判断2.2、whereif 标签2.3、set 标签2.4、choose(when,otherwise) 语句2.5、trim2.6、MyBatis foreach 标签 3、整合案例3.1、XML3.2、测试类 4、sql 标…...
在Vue中使用Immutable.js
在Vue3中使用Immutable.js 以下是如何在Vue.js中使用Immutable.js的步骤: 首先,需要安装immutable.js。你可以通过npm或yarn来安装: npm install immutable或者 yarn add immutable在你的Vue组件中导入Immutable: import { Ma…...
基于Yolov8的工业端面小目标计数检测(1)
1.端面小目标计数数据集介绍 工业端面小目标计数类别:一类,类别名object 数据集大小:训练集864张,验证集98张 缺陷特点:小目标计数,检测难度大,如下图所示; 1.1 小目标定义 1)以物体检测领域的通用数据集COCO物体定义为例,小目标是指小于3232个像素点(中物体是指…...
1.什么是jwt?jwt的作用是什么?2.jwt的三个部分是什么?三者之间的关系如何?3.JWT运行的流程是什么
1. **什么是JWT?JWT的作用是什么?** JWT(JSON Web Token)是一种用于在不同系统或组件之间传输信息的紧凑且安全的标准。它的作用主要有两个方面: - **身份验证(Authentication)**…...
十三、MySql的视图
文章目录 一、前言二、定义三、为什么使用视图四、基本使用(—)创建视图(二)案例1.修改了视图,对基表数据有影响2.修改了基表,对视图有影响3.删除视图 五、视图规则和限制 一、前言 通过视图,可…...
MFC扩展库BCGControlBar Pro v33.6亮点 - 流程图、Ribbon Bar功能升级
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.6已正式发布了,此版本包含了对图表组件的改进、带隐藏标签的单类功能区栏…...
前端 JS 经典:文件流下载
重点:调用接口时,一定要配置 responseType 的值为 blob,不然获取的文件流,不会转义成 blob 类型的文件。 1. 接口返回文件流 // BLOB (binary large object)----二进制大对象,是一个可以存储二进制文件的容器 // 下载…...
SSL免费证书会报安全提示吗?
安全性是互联网世界中至关重要的一环,其中一个关键组成部分就是SSL证书,它们用于加密在用户浏览器和服务器之间传输的数据,以确保数据的保密性和完整性。然而,有关SSL证书的一个常见问题是:免费SSL证书是否会触发安全警…...
广州响应网站建设/在线网页制作系统搭建
首先说一下, href属性 和 onclick事件 的执行顺序,当鼠标点击a标签的时候会先执行 onclick事件, 然后才是 href 属性下的动作(页面跳转,或 javascript 伪链接),如果不想执行href 属性下的动作执行,onclick …...
大型网站开发语言框架工具/软文营销经典案例优秀软文
一:Spring相关API 笔记二程序源码下载 applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象 ApplicationContext的实现类 1)ClassPathXmlApplicationContext 它是从类的…...
曹县住房和城乡建设局网站/百度学术论文查重官网
作者:Cary G.Gray and David R. Cheriton 1989 译者:phylipsbmy 2011-5-7 出处:http://duanple.blog.163.com/blog/static/70971767201141111440789/ [ 序:所谓租约(leases),其实就是一个合同,即服务端给予…...
辽宁省精神文明建设工作三大创建活动网站/360推广
当满足以下三个条件时,两者会输出相同信息。 1. 服务器为80端口 2. apache的conf中ServerName设置正确 3. HTTP/1.1协议规范 不同点: 通常情况: _SERVER[“HTTP_HOST”] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息…...
弄个小程序要多少钱/搜索引擎优化简称
1.定义变量:declare name varchar(20) 用declare定义一个名字为name的字符串类型的变量,变量前面需要加 2.为变量赋值:set name %奥迪% ,用set来进行赋值操作(也可以用select)这里的值可以是一个值也可以…...
如何查看网站开发的语言/西安百度公司地址介绍
当碰到较小自动时间步时,我们应采取哪些策略来提高仿真效率?本文我们列举了一些示例,并讨论了如何通过调整求解器设置来应对较小的时间步。在求解器日志中追踪时间步和离散阶次当使用 BDF 时间步进方法检查与时间有关的仿真求解器日志时&…...