You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让正在构造的类引用并返回已存在的实例?

让类在构造时复用已有实例的实现方法

你想在构造类实例时直接复用已有同名称实例的思路是合理的,但原代码里的做法行不通——因为构造函数的本质是初始化新创建的实例,一旦进入构造函数,内存里已经分配了新的MyClass对象,没办法把this指向已有的实例,这样做只会生成一个未初始化的空实例,而非复用已有对象。

正确的做法是用静态工厂方法封装实例创建逻辑,替代直接调用构造函数:

class MyClass
{
    string _name;
    static List<MyClass> _existing = new List<MyClass>();

    // 将构造函数设为私有,强制外部通过工厂方法获取实例
    private MyClass(string name)
    {
        _name = name;
    }

    // 静态工厂方法:处理实例查找与创建逻辑
    public static MyClass GetInstance(string name)
    {
        // 先在已有列表中查找匹配的实例
        var existingInstance = _existing.FirstOrDefault(mc => mc._name == name);
        if (existingInstance != null)
        {
            return existingInstance;
        }

        // 没有匹配实例时,创建新实例并加入列表
        var newInstance = new MyClass(name);
        _existing.Add(newInstance);
        return newInstance;
    }
}

方案说明

  1. 私有构造函数:确保外部代码不能直接用new创建实例,必须通过工厂方法获取,完全控制实例的创建流程。
  2. 静态工厂方法:先检查已有实例列表,找到匹配项直接返回;无匹配时再创建新实例并加入列表,保证相同name只会对应一个实例。
  3. 语义清晰:比起在构造函数里做“替换实例”这种违背常规逻辑的操作,工厂方法的意图更明确,其他开发者能快速理解这是在做实例复用。

如果你的场景需要线程安全的实例管理,可以给_existing列表加锁,或者改用ConcurrentDictionary<string, MyClass>提升查找效率和线程安全性。

内容的提问来源于stack exchange,提问作者Jonathan Plumb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:56:03