我正在尝试设置以下public var:
var collection = new Dictionary<string, Statistics>();
我希望能够在我的应用程序中使用相同的集合,因此我希望在应用程序启动时在顶部创建它。
我该怎么做?
答案 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>
那是:
示例:(来自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类
中的所有方法