Существует небольшое различие между открытым статическим полем readonly и общедоступным статическим свойством. Свойство защищает доступ в некоторой степени, но если все, что вы делаете, возвращает значение, эти два не отличаются друг от друга.
// access between these two is almost identical
public class Foo
{
public readonly static IDictionary<string, int> bar =
new Dictionary<string, int>();
public static IDictionary<string, int> Bar
{
get { return bar; }
}
}
вопрос вы собираетесь работать, состоит в том, что даже если поле было помечено как readonly
это все еще изменчивый. Что нужно, чтобы кто-то не позвонил Foo.Bar.Clear();
Чтобы решить эту проблему, вы можете создать копию и вернуть ее, или вы можете найти использование словаря для чтения.
public class Foo
{
private readonly static IDictionary<string, int> bar =
new Dictionary<string, int>();
public static IDictionary<string, int> Bar
{
// now any calls like Foo.Bar.Clear(); will not clear Foo.bar
get { return new Dictionary<string, int>(bar); }
}
}
Тогда, если вам, если вам нужно добавить или удалить элементы из Foo.Bar
вы можете создавать функции, чтобы ограничить как модифицирован основной объект.
public static void AddItem(string key, int value)
{ }
public static void RemoveItem(string key)
{ }
Даже если вы используете ReadonlyDictionary
реализацию, вы все равно можете столкнуться с проблемами, с модификацией, если TKey
или TValue
словаря изменчивы.
В целом те причины, которые вы видели, чтобы избежать статических переменных, остаются в силе здесь. Вы вводите статическую зависимость, которая будет перетаскиваться, когда код, который использует Foo.Bar
, используется повторно. Если объект, к которому вы статически обращаетесь, неизменен, а также только для чтения, существует ряд непредвиденных побочных эффектов, которые могут возникнуть.
Вам было бы лучше создать отдельный экземпляр объекта в корне вашего состава и передать его объектам, которые нуждаются в зависимости.
public void CompRoot()
{
var bar = new ReadonlyDictionary(
... initialize with desired values ...
// also this object is not in .NET but there
// are many available on the net
);
var obj = new UsesBarDependency(bar);
}
public class UsesBarDependency
{
private readonly ReadonlyDictionary bar;
public UsesBarDependency(ReadonlyDictionary bar)
{
if (bar == null)
throw new ArgumentNullException("bar");
this.bar = bar;
}
public void Func()
{
// use to access the dependency
this.bar
// over
Foo.Bar
}
}
Это позволяет пользователям UsesBarDependency
обеспечить любые ReadonlyDictionary
к объекту вместо того, чтобы быть вынуждены использовать статическую Foo.Bar
зависимость.
Это помогло! Я не понимал здесь размышлений, о котором также упомянул Одед. Хотя я не могу его использовать, не могли бы вы предоставить дополнительную информацию. – Sunny
@Sundeep Я отредактировал ответ, чтобы развернуть последствия отражения. – dasblinkenlight