为什么不能设置Public Var?

时间:2012-11-30 07:44:26

标签: c# variables

我正在尝试设置以下public var:

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

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

我该怎么做?

4 个答案:

答案 0 :(得分:6)

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

只是一个想法:

public

您可以像以下一样访问它:

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

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

你必须自己锻炼,以满足你的确切需求。

答案 1 :(得分:4)

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

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

然后在代码中访问它:

Variables.collection.Add(...);

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

答案 2 :(得分:2)

修改

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


关于 I want to be able to use the same collection all through my application

,我对原始问题的意义

在面向对象的环境中,如果这是重构/重构应用程序无法超越的要求,那么你一定要使用Singleton design pattern

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

那是:

  • 创建一个类(例如,通过名称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的响应时(yikes!),我想我必须解释我的答案背后的理由:

<强>优点:

  • 这比采用一些非标准方法更好
  • 最好不要将它传递给存在的每一段代码

<强>缺点:

  • 绝对不推荐,如果可以通过任何方式规避
  • 周围有单一的地图是严重的难闻气味:在应用程序的整个生命周期中保留引用,导致大量泄漏,而不是
  • 多线程行为不是一件轻而易举的事情,如果事情很少发生(特别是隐藏的竞争条件,以及在噩梦中潜伏在程序员床下的其他事情),特别难以追查。

还建议阅读:

答案 3 :(得分: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类

中的所有方法