C# 中的静态与单例

本文关键字:单例 静态 | 更新日期: 2023-09-18 20:35:29

您学习了what is singleton design pattern以及如何创建单一实例类。在这里,您将了解静态类和单例类之间的区别。

静态类可以是单一实例类。例如,以下VoteMachine类是一个静态类,它充当单例类来注册用户的投票。

示例: Singleton Class

public class VoteMachine
{
	private static int _totalVotes = 0;
	
	static VoteMachine()
	{
	}
	public static void RegisterVote()
	{
		_totalVotes += 1;
		Console.WriteLine("Registered Vote #" + _totalVotes);
	}
	public static int TotalVotes
	{
		get
		{
			return _totalVotes;
		}
	}
}

它将在多线程方案中给出正确的结果,如下所示。

示例:

public class Program
{
	public static void Main()
	{
		var numbers = Enumerable.Range(0, 10);
		Parallel.ForEach(numbers, i =>
		{			
			VoteMachine.RegisterVote();
		});
		Console.WriteLine(VoteMachine.TotalVotes);
	}
}

因此,静态类可以是单例类。它是线程安全的并且性能良好,因为我们不需要使用锁。

但是,有什么区别呢?我们根本不需要创建一个单例类吗?

下面列出了静态类和单一实例类之间的区别:

Static ClassSingleton Class
不能继承其他类中的静态类。无多态性。可以通过具有受保护的构造函数来继承和扩展单例类。
无法实现接口。可以实现接口。
无法创建实例并将其分配给另一个变量。可以创建一个实例并将其分配给多个变量。
不能作为参数传递给方法。可以作为参数传递。
无法序列化。可以序列化。