3

我正在尝试设置以下公共变量:

var collection = new Dictionary<string, Statistics>();

我希望能够在我的应用程序中使用相同的集合,因此我想在应用程序启动时在顶部创建它。

我该怎么做?

4

4 回答 4

6

C#中没有全局变量的概念。总是必须在某个类/范围内声明变量。

可以public做的是通过修饰符使其可访问,例如属性(例如)。

只是一个想法:

public class Shared
{
     public Dictionary<string, Statistics> CollectionDic {get;set;}

     public Shared() {
        CollectionDic  = new Dictionary<string, Statistics>();
     }
}

之后您可以像这样访问它:

var shared = new Shared(); 
shared.CollectionDic.Add(..)
...

你必须自己锻炼,什么适合你的确切需求。

于 2012-11-30T07:46:45.740 回答
5

您可以将其创建为公共类中的公共静态字段或属性(也可以是静态的):

public class Variables
{
    public static Dictionary<string, Statistics> collection = new Dictionary<string, Statistics>();
}

然后在代码中访问它:

Variables.collection.Add(...);

请注意,这不是线程安全的方法。因此,如果您打算在多线程应用程序中使用静态字典,最好使用静态方法,以线程安全的方式包装字典(如 Jon Skeet 所述)或使用线程安全的集合,例如ConcurrentDictionary

于 2012-11-30T07:48:09.117 回答
2

你得到的错误是:

上下文关键字“var”只能出现在局部变量声明中

我相信您正在尝试将您的收藏定义为:

public partial class Form1 : Form
{
    var collection = new Dictionary<string, Statistics>();

您不能var在此级别使用关键字,

我希望我的所有 Form1.cs 都可以访问它,而不是不同的 .cs 文件

你可以这样定义它:

Dictionary<string, Statistics> collection = new Dictionary<string, Statistics>();

它将可用于 Form1 类中的所有方法

于 2012-11-30T07:49:06.663 回答
2

编辑

OP 的评论显示,要求只能通过一个 .cs 代码访问变量。请忽略以下内容,如果您认为此答案对于该主题的未来访问者的问题不是有价值的补充,请投票删除。或者投赞成票,如果你认为它有足够的附加值留下来。


我对原始问题的意思是,关于I want to be able to use the same collection all through my application

在面向对象的环境中,如果这是重构/重构应用程序无法超越的要求,则绝对应该使用单例设计模式

单例是一种模式,它保证只存在给定类的一个实例(当然,每个应用程序上下文/虚拟机),并且可以在同一应用程序的上下文中从任何地方访问该实例。

那是:

  • 创建一个类(例如,通过名称 MyDictionary)
  • 实现您想要的必要功能(您希望它独立于底层实现)
  • 按照文章使其成为单身人士
    • 决定是否需要延迟加载
    • 我建议在处理单例时始终使用线程安全实现以避免不必要的后果。
  • 随时随地访问

示例:(来自 C#Indepth 链接,第二版,具有简单的线程安全,请注意文章的作者是谁!)

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();

    Singleton()
    {
    }    

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }    
    }
} 

请注意始终将线程安全考虑在内!

当我收到@JonSkeet 的回复(哎呀!)时,我想我必须解释我的回答背后的理由:

优点:

  • 这比有一些非标准的方式要好
  • 这比必须将它传递给存在的每一位代码要好

缺点:

  • 如果可以通过任何方式规避此要求,则绝对不推荐
  • 周围有一个单例映射是一种严重的恶臭:在应用程序的整个生命周期中保持引用,经常导致大量泄漏
  • 多线程行为并非微不足道,如果某些行为很少发生(隐藏的竞争条件,以及在噩梦中潜伏在程序员床底下的任何其他东西),则特别难以追究

还推荐阅读:

于 2012-11-30T07:45:58.713 回答