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

C#使用密封类密封用户信息

目录

一、涉及到的知识点

1.密封类定义

2.何时使用密封类

3.使用密封类的注意事项

二、实例1

三、实例2

1.源码

2.生成效果


        在C#中,密封类(sealed class)是一种不能被其他类继承的类。它用于防止其他类继承它的功能和属性。 

一、涉及到的知识点

1.密封类定义

        密封类的突出特点是不能被继承,通过密封类封装用户信息可以增加用户信息的安全性。使用密封类密封用户的登录用户名和密码,以保证其安全性。

        密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应该密封类型和成员。密封可以防止对库的类型和成员进行自定义,但也会影响某些开发人员对可用性的认识。

        在C#中声明密封类时需要使用sealed关键字,具体语法格式如下:

访问修饰符sealed class类名:基类或接口
{//类成员
}

2.何时使用密封类

         C#中使用密封类时,如果类满足如下条件,则应将其密封:

  • 类是静态类。
  • 类包含带有安全敏感信息的继承的受保护成员。
  • 类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。
  • 类是一个要求使用反射进行快速搜索的属性,密封属性可提高反射在检索属性时的性能。

3.使用密封类的注意事项

  •  密封类不能作为基类被继承,但它可以继承别的类或接口。
  • 在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。
  • 由于密封类的不可继承性,因此密封类不能声明为抽象的。

二、实例1

// 密封类
namespace _118_1
{sealed class SealedClass{public static void GetMessage(){Console.WriteLine("这是一个密封类。");}}class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);SealedClass.GetMessage();// 尝试创建一个继承自密封类的类// 这将导致编译错误,因为密封类不能被继承// class SealedChildClass : SealedClass// {//     public void ChildMethod()//     {//         Console.WriteLine("这是密封类的子类。");//     }// }Console.ReadKey();}}
}
//运行结果:
/*
这是一个密封类。*/

三、实例2

        使用密封类密封用户的登录用户名和密码,以保证其安全性。

1.源码

// 使用密封类密封用户信息
namespace _118
{public partial class Form1 : Form{private GroupBox? groupBox1;private Button? button2;private Button? button1;private TextBox? textBox2;private TextBox? textBox1;private Label? label2;private Label? label1;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // label1// label1 = new Label{AutoSize = true,Location = new Point(64, 37),Name = "label1",Size = new Size(56, 17),TabIndex = 0,Text = "用户名:"};// // label2// label2 = new Label{AutoSize = true,Location = new Point(64, 69),Name = "label2",Size = new Size(56, 17),TabIndex = 1,Text = "密   码:"};// // textBox1// textBox1 = new TextBox{Location = new Point(129, 31),Name = "textBox1",Size = new Size(100, 23),TabIndex = 2};// // textBox2// textBox2 = new TextBox{Location = new Point(129, 66),Name = "textBox2",Size = new Size(100, 23),TabIndex = 3};// // button1// button1 = new Button{Location = new Point(64, 101),Name = "button1",Size = new Size(75, 23),TabIndex = 4,Text = "确定",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // button2// button2 = new Button{Location = new Point(154, 101),Name = "button2",Size = new Size(75, 23),TabIndex = 5,Text = "取消",UseVisualStyleBackColor = true};button2.Click += Button2_Click;// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(300, 152),TabIndex = 0,TabStop = false,Text = "登录窗口"};groupBox1.Controls.Add(button2);groupBox1.Controls.Add(button1);groupBox1.Controls.Add(textBox2);groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label2);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(324, 176);Controls.Add(groupBox1);Name = "Form1";Text = "使用密封类密封用户信息";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}/// <summary>/// 按钮事件:登录/// 调用密封类/// </summary>private void Button1_Click(object? sender, EventArgs e){if (textBox1!.Text == "" || textBox2!.Text == ""){MessageBox.Show("用户名和密码不能为空", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);}else{MyClass myclass = new(){Name = textBox1.Text,            //为密封类中的编号属性赋值Pwd = textBox2.Text              //为密封类中的名称属性赋值};	                                 //实例化密封类对象MessageBox.Show("登录成功,用户名:" + myclass.Name + " 密码:" + myclass.Pwd, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}/// <summary>/// 退出当前应用程序/// </summary>private void Button2_Click(object? sender, EventArgs e){Application.Exit();}/// <summary>/// 通过sealed关键字声明密封类,防止类被继承,有效保护重要信息/// </summary>public sealed class MyClass{private string name = "";   //string类型变量,用来记录用户名private string pwd = "";    //string类型变量,用来记录密码/// <summary>/// 用户名,属性/// </summary>public string Name{get{return name;}set{name = value;}}/// <summary>/// 密码,属性/// </summary>public string Pwd{get{return pwd;}set{pwd = value;}}}}
}

2.生成效果

 

相关文章:

  • 2023全球云计算市场份额排名
  • Oracle中怎么设置时区和系统时间
  • Bitcoin Bridge:治愈还是诅咒?
  • tsgctf-2021-lkgit-无锁竞争-userfaultfd
  • 电路设计(15)——篮球赛24秒违例倒计时报警器的proteus仿真
  • Flink从入门到实践(二):Flink DataStream API
  • 【深度学习】S2 数学基础 P1 线性代数(上)
  • Shell - 学习笔记 - 2.12 - Shell获取数组长度
  • MySQL篇----第二十二篇
  • 测试OpenSIPS3.4.3的lua模块
  • Docker容器监控-CIG
  • YOLOv5改进 | 一文汇总:如何在网络结构中添加注意力机制、C3、卷积、Neck、SPPF、检测头
  • 论文阅读-Pegasus:通过网络内一致性目录容忍分布式存储中的偏斜工作负载
  • 【云原生进阶之PaaS中间件】第三章Kafka-4.2-生产者工作原理剖析
  • PCIE Order Set
  • 「译」Node.js Streams 基础
  • 30天自制操作系统-2
  • android图片蒙层
  • golang中接口赋值与方法集
  • HTTP 简介
  • JavaScript 基本功--面试宝典
  • java小心机(3)| 浅析finalize()
  • Linux下的乱码问题
  • miaov-React 最佳入门
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Vue--数据传输
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 大快搜索数据爬虫技术实例安装教学篇
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 开源地图数据可视化库——mapnik
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用 QuickBI 搭建酷炫可视化分析
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 鱼骨图 - 如何绘制?
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #《AI中文版》V3 第 1 章 概述
  • (6)添加vue-cookie
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net web项目 调用webService
  • .NET 的程序集加载上下文
  • .net 无限分类
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • :“Failed to access IIS metabase”解决方法
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @GetMapping和@RequestMapping的区别
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限