我需要一个类来存储一个可变值。当在代码的不同部分之间共享此类的实例并且一个部分更改该对象内的值时,所有其他部分都会看到新值。
这个问题不是我怎么写的。这是任何人搜索:
public class ValueHolder<T> { public T Value { get; set; } }
我的问题是,这个类是否存在于标准库的任何位置?这感觉就像它提供的许多小类中都包含的东西。
或者,是否有另一种方法可以实现我所需的结果而不会乱丢我的代码?
更新/评论:
我对这个问题提出的否定性感到有些惊讶
&#34;这会导致WTF数量很高!&#34; &#34;你正在重塑!&#34;
重新发明是我明确提出的,以避免提出这个问题。如果标准库中已经存在某些内容,我可以使用它而不是编写新类。 (只要收益超过成本。)
一直使用传递对象并允许对其进行修改的技术。你有没有写过一个函数,它接受一个List来为该函数添加/删除值?那么事件处理程序(例如Form.Closing)允许事件处理程序通过在event-args对象中设置一个值来改变正在进行的事件呢?
就我而言,该对象只是一个具有单个bool值的类。它被传递到另一段代码中,以便允许该标志被提升或降低。您可能会说这应该是函数的返回值或ref参数,但是我使用的框架允许将对象传递给处理程序(类似于ParameterizedThreadStart或Tag属性),所以I& #39; m限制在我能传递的内容中。
&#34;我想知道标准库是否已经有了这样做的类。&#34;我心想。 &#34;让我们找出来!&#34;
答案 0 :(得分:-1)
要在我的项目的任何地方注册和获取对象,并且在我的应用程序生命周期的任何时间,我都使用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对象的更多信息:
答案 1 :(得分:-3)
您可以通过这种方式使用 Tuple。