我有一個通過反序列化實例化的通信管理器。 現在我想創建一些靜態方法來訪問實例數據。通過本地靜態實例訪問實例成員
在其他帖子上,我看到人們建議不要訪問實例對象的靜態字段。但是現在我創建了下面的代碼,並且像預期的那樣工作,我可以在沒有CommManager的新實例的情況下反序列化並使用靜態方法。大!
問題: 這是安全嗎? 我想申請線程,GetChannel是我的應用程序的核心,並將被多個線程上的許多應用程序部分使用。我認爲重要的是我不會造成表現懲罰或其他後果。請指教。
我問這個原因我覺得很奇怪,我找不到這個方法的任何類似的例子,我現在看到它的方式,我可以很容易地使每個方法都是靜態的,沒有缺點。
public class CommManager
{
public ObservableCollection<ChannelConfig> channelConfigs;
private List<iChannel> channels;
private static CommManager StaticMe;
public CommManager()
{
channelConfigs.CollectionChanged += ChannelCollectionChanged;
StaticMe = this;
}
private void ChannelCollectionChanged(object sender,
NotifyCollectionChangedEventArgs args)
{
if (channels == null)
channels = new List<iChannel>();
switch (args.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (ChannelConfig newItem in args.NewItems)
channels.Add(CreateChannel(newItem));
break;
case Notif.. /// etc. etc.
}
}
/// <summary>
/// I can access this method without instance and i get normal de-serialized values
/// </summary>
public static iChannel GetChannel(CommChannel channelnr)
{
return StaticMe.Channels[(int)channelnr];
}
}
謝謝,你的回答很明確,就像一個魅力! – robbi
在代碼後面我試圖重新分配頻道= channels.OrderBy(blabla).ToList()我現在清楚地看到,我不能重新分配這個,並理解你的方法的好處。謝謝 – robbi
@robbi如果你想要它,你可以使用'OrderedList',它可以非常有效地爲你排序,或者 - 如編輯中所寫 - 如果你想使用多線程並且需要線程安全的集合,請看看['Concurrent ... 'collections](https://msdn.microsoft.com/en-US/library/system.collections.concurrent(v = vs.110).aspx),無論如何它們都實現了線程安全。 –
Adwaenyth