目录
一、涉及到的知识点
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.生成效果