通过C#中的属性访问器实现一个计数器,使得每次访问时计数加一

通过C#中的属性访问器实现一个计数器,使得每次访问时计数加一

编码文章call10242025-02-01 3:47:4215A+A-

通过 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(#34;初始计数值:{counter.Count}");
        Console.WriteLine(#34;访问计数次数:{counter.AccessCount}");

        // 访问计数器
        Console.WriteLine(#34;当前计数值:{counter.Count}");
        counter.Count = 10; // 设置新值
        Console.WriteLine(#34;新的计数值:{counter.Count}");
        Console.WriteLine(#34;访问计数次数:{counter.AccessCount}");
    }
}

运行结果

初始计数值:5
访问计数次数:1
当前计数值:5
新的计数值:10
访问计数次数:4

代码解析

  1. 私有字段 _count 和 _accessCount
  2. _count 存储实际的计数值。
  3. _accessCount 记录属性被访问的次数。
  4. Count 属性
  5. get 访问器:每次读取 _count 时,访问计数器自增。
  6. set 访问器:每次设置值时,也增加访问计数。
  7. AccessCount 属性
  8. 是一个只读属性,返回 _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(#34;访问计数次数:{counter.AccessCount}");

如果需要添加更多功能(例如重置计数器或保存历史访问数据),请告诉我!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4