我正在尝试设置以下公共变量:
var collection = new Dictionary<string, Statistics>();
我希望能够在我的应用程序中使用相同的集合,因此我想在应用程序启动时在顶部创建它。
我该怎么做?
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(..)
...
你必须自己锻炼,什么适合你的确切需求。
您可以将其创建为公共类中的公共静态字段或属性(也可以是静态的):
public class Variables
{
public static Dictionary<string, Statistics> collection = new Dictionary<string, Statistics>();
}
然后在代码中访问它:
Variables.collection.Add(...);
请注意,这不是线程安全的方法。因此,如果您打算在多线程应用程序中使用静态字典,最好使用静态方法,以线程安全的方式包装字典(如 Jon Skeet 所述)或使用线程安全的集合,例如ConcurrentDictionary。
你得到的错误是:
上下文关键字“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 类中的所有方法
OP 的评论显示,要求只能通过一个 .cs 代码访问变量。请忽略以下内容,如果您认为此答案对于该主题的未来访问者的问题不是有价值的补充,请投票删除。或者投赞成票,如果你认为它有足够的附加值留下来。
我对原始问题的意思是,关于I want to be able to use the same collection all through my application
在面向对象的环境中,如果这是重构/重构应用程序无法超越的要求,则绝对应该使用单例设计模式
单例是一种模式,它保证只存在给定类的一个实例(当然,每个应用程序上下文/虚拟机),并且可以在同一应用程序的上下文中从任何地方访问该实例。
那是:
示例:(来自 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 的回复(哎呀!)时,我想我必须解释我的回答背后的理由:
优点:
缺点:
还推荐阅读: