通过 C# 属性访问器实现计数器
属性访问器是 C# 提供的一种机制,用于封装字段的读写操作。通过在属性的 get 访问器中增加逻辑,可以在每次访问属性时执行特定操作,例如计数器的自增。
完整代码示例
using System;
class Counter
{
private int _count; // 实际计数
private int _accessCount; // 访问计数
public Counter(int initialValue)
{
_count = initialValue;
_accessCount = 0;
}
// 属性:每次访问计数器时增加访问计数
public int Count
{
get
{
_accessCount++; // 每次访问时自增
return _count;
}
set
{
_accessCount++; // 记录设置值的访问
_count = value;
}
}
// 只读属性:显示访问次数
public int AccessCount
{
get { return _accessCount; }
}
}
class Program
{
static void Main(string[] args)
{
Counter counter = new Counter(5);
Console.WriteLine($"初始计数值:{counter.Count}");
Console.WriteLine($"访问计数次数:{counter.AccessCount}");
// 访问计数器
Console.WriteLine($"当前计数值:{counter.Count}");
counter.Count = 10; // 设置新值
Console.WriteLine($"新的计数值:{counter.Count}");
Console.WriteLine($"访问计数次数:{counter.AccessCount}");
}
}
运行结果
初始计数值:5
访问计数次数:1
当前计数值:5
新的计数值:10
访问计数次数:4
代码解析
- 私有字段 _count 和 _accessCount:
- _count 存储实际的计数值。
- _accessCount 记录属性被访问的次数。
- Count 属性:
- get 访问器:每次读取 _count 时,访问计数器自增。
- set 访问器:每次设置值时,也增加访问计数。
- AccessCount 属性:
- 是一个只读属性,返回 _accessCount 的值,用于显示总访问次数。
扩展功能:支持多线程访问
在多线程场景下,可能需要确保访问计数是线程安全的。以下是使用 lock 来实现线程安全的版本:
class ThreadSafeCounter
{
private int _count;
private int _accessCount;
private readonly object _lock = new object();
public int Count
{
get
{
lock (_lock)
{
_accessCount++;
return _count;
}
}
set
{
lock (_lock)
{
_accessCount++;
_count = value;
}
}
}
public int AccessCount
{
get
{
lock (_lock)
{
return _accessCount;
}
}
}
}
多线程测试:
ThreadSafeCounter counter = new ThreadSafeCounter();
// 多线程操作计数器
Parallel.For(0, 100, i =>
{
counter.Count = i;
Console.WriteLine(counter.Count);
});
Console.WriteLine($"访问计数次数:{counter.AccessCount}");
如果需要添加更多功能(例如重置计数器或保存历史访问数据),请告诉我!