2015-06-05 7 views
3

Мне нужен класс для хранения изменчивого значения. Когда экземпляр этого класса разделяется между разными частями кода, а одна часть изменяет значение внутри этого объекта, все остальные части видят новое значение.Имеет ли стандартная библиотека C# общий класс для хранения изменяемого значения?

Этот вопрос не так, как я мог бы его написать. Здесь он предназначен для тех, кто ищет:

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

Мой вопрос в том, что этот класс существует в любом месте стандартной библиотеки? Это похоже на то, что будет включено во многие небольшие классы, которые он предоставляет.

Или, есть ли другой способ, я мог бы достичь своего требуемого результата, не засоряя свой код небольшими классами?

Обновление/комментарии:
Я немного удивлен количеством отрицательности, которое поднял этот вопрос.
«Это приводит к большому количеству WTF!» «Вы изобретаете!»

Переосмысление было чем-то, что я явно хотел избежать, задавая этот вопрос. Если в стандартной библиотеке уже есть что-то, я мог бы использовать это вместо написания нового класса. (Пока выгоды перевешивают издержки.)

Техника, передающая объект и позволяющая его изменять, используется все время. Вы когда-нибудь писали функцию, которая принимает список, чтобы эта функция добавляла/удаляла значения? Как насчет обработчика событий (например, Form.Closing), который позволяет обработчику события изменять текущее событие, задавая значение внутри объекта event-args?

В моем случае объект был просто классом с одним значением bool в нем. Он передается в другой фрагмент кода, чтобы этот флаг мог быть поднят или опущен. Вы можете сказать, что это должно быть возвращаемое значение функции или параметр ref, но я использую фреймворк, который позволяет передавать объекты для обработчиков (аналогично параметризуемымThreadStart или свойствам Tag), поэтому я ограничен в том, что я может пройти.

«Интересно, есть ли в стандартной библиотеке класс, который это делает». Я подумал про себя. "Давай выясним!"

+2

Почему бы не просто поставить ссылку на 'value' в классе, в который вы собираетесь поместить ссылку на' ValueHolder'? –

+0

@MatthewWatson Почему бы и нет. Я думаю, мои преподаватели были довольно успешны в обучении меня тому, что вам всегда нужно предоставлять аксессуры, а не разрешать публичный доступ к ценностям. – billpg

+0

Ну, очевидно, вы бы предоставили getter и setter для доступа к значению из класса, как и в 'ValueHolder'. Поэтому мой вопрос остается: Какое преимущество дает вам дополнительный класс ValueHolder? Почему 'myInstance.MyValueHolder.MyValue =" value ";' лучше, чем 'myInstance.MyValue =" value ";'? Это потому, что для типов значений, а не для ссылочных типов? –

ответ

-1

Чтобы зарегистрироваться и получить объекты в любом месте на моем проекте и в любое время на моем приложение жизненного цикла, я использую Ленивые объекты:

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... */ 
    } 
} 

Вы можете узнать больше о ленивых объектов здесь:

 Смежные вопросы

  • Нет связанных вопросов^_^