.net C#标准库是否有用于存储可变值的泛型类?[duplicate]

vdzxcuhz  于 2023-01-27  发布在  .NET
关注(0)|答案(3)|浏览(101)
    • 此问题在此处已有答案**:

Class inheritance: recreate base class items (or instance) from a property of the inherited class(1个答案)
Why the tuple-type list element's value cannot be modified?(2个答案)
Why a Tuple, or a KeyValueItem, don't have a setter?(4个答案)
Is there any pre-defined class in .net 2.0 to hold a single generic-typed mutable field?(2个答案)
Why should I avoid creating a MutableTuple<T1,T2,TEtc> class in C#?(3个答案)
昨天关门了。
我需要一个类来存储一个可变值。当这个类的一个示例在代码的不同部分之间共享时,其中一个部分更改了该对象中的值,所有其他部分都看到了新值。
这个问题不是我该怎么写,而是给那些想知道答案的人:

public class ValueHolder<T> { public T Value { get; set; } }

我的问题是,这个类存在于标准库中的任何地方吗?这感觉像是它提供的许多小类中会包含的东西。
或者,有没有另一种方法可以实现我所需要的结果,而不用在代码中添加大量的小类?
更新/评论:
我对这个问题引发的负面情绪感到有点惊讶。
"这会导致WTF计数很高!""你在重塑!"
在提出这个问题时,我明确地避免了重新发明。如果标准库中已经有一些东西,我可以使用它,而不是编写一个新类。(只要收益大于成本。)
传递一个对象并允许它被修改的技术一直在使用。你是否曾经写过一个函数,它接受一个List,以便该函数添加/删除值?如果一个事件处理程序(如Form.Closing)允许该事件处理程序通过在event-args对象中设置一个值来改变正在进行的事件,那该函数呢?
在我的例子中,对象只是一个类,里面只有一个bool值,它被传递到另一段代码中,以允许该标志被提升或降低,你可能会说这应该是一个函数的返回值或ref参数,但我使用的框架允许对象传递给处理程序(类似于ParameterizedThreadStart或Tag属性),因此我可以传递的内容有限。
"我想知道标准库是否已经有这样的类。"我想。"让我们来看看吧!"

y4ekin9u

y4ekin9u1#

这是我的VolatileRef类。
当需要通过引用传递volatile变量时,我使用它。
如果您不关心易变性,只需去掉volatile关键字并将类重命名为Ref即可。

public class VolatileRef
{
    private volatile object payload;

    public VolatileRef( object payload )
    {
        this.payload = payload;
    }

    public object Payload { get => payload; set => payload = value; }
}

public class VolatileRef<T> : VolatileRef
{
    public VolatileRef( T payload )
            : base( payload )
    { }

    public new T Payload { get => (T)base.Payload; set => base.Payload = value; }
}
lmvvr0a8

lmvvr0a82#

要在项目中的任何位置以及应用生命周期中的任何时间注册和获取对象,我使用Lazy对象:

public static class ServiceContainer
{
    static readonly Dictionary<Type, Lazy<object>> services = new Dictionary<Type, Lazy<object>>();

    public static void Register<T>(Func<T> function)
    {
        services[typeof(T)] = new Lazy<object>(() => function());
    }

    public static T Resolve<T>()
    {
        return (T)Resolve(typeof(T));
    }

    public static object Resolve(Type type)
    {
        Lazy<object> lazy;
        if (services.TryGetValue(type, out lazy))
            return lazy.Value;
        throw new Exception("Not found!");
    }
}

用于:

public class Program 
{
    public void Main()
    {
        ServiceContainer.Register<IFoo>(() => new Foo()); /*register foo*/
    }

    public void UsingFoo()
    {
        var foo = ServiceContainer.Resolve<IFoo>(); /* do something with foo... */
    }
}

您可以在此处找到有关Lazy对象的更多信息:

3zwtqj6y

3zwtqj6y3#

您可以通过这种方式使用Tuple

相关问题