C#:为什么不';这项静态任务不起作用
本文关键字:静态 任务 不起作用 为什么不 | 更新日期: 2023-09-27 18:21:28
我得到错误"当前上下文中不存在名称客户端"。"数据库"变量也是如此。
namespace MongoDB_Test
{
class Program
{
protected static IMongoClient _client;
protected static IMongoDatabase _database;
_client = new MongoClient(); // error here
_database = _client.GetDatabase("test"); // same error but for _database variable
}
}
我没有得到以下代码的错误:
namespace MongoDB_Test
{
class Program
{
protected static IMongoClient _client = new MongoClient();
protected static IMongoDatabase _database = _client.GetDatabase("test");
}
}
为什么我会得到第一个代码块的错误?
除非是基本的声明/初始化行,否则不能在方法之外编写代码。强制代码语句在方法的范围之外并没有真正的意义。这就是为什么你的第二个例子有效。
然而,您可以编写一个静态构造函数:
class Program
{
protected static IMongoClient _client;
protected static IMongoDatabase _database;
static Program()
{
_client = new MongoClient();
_database = _client.GetDatabase("test");
}
}
请记住,字段初始值设定项(静态或实例)、构造函数(静态或例子)和方法在构建对象的过程中都在非常不同的时间执行。如果代码依赖于定时,则需要确保在需要时进行初始化。
移动此:
_client = new MongoClient();
_database = _client.GetDatabase("test");
对于一种方法,在这种情况下,它是static Main()
这里没有错误:
protected static IMongoClient _client = new MongoClient();
因为new MongoClient()
不会被执行,而是隐式地被复制到静态构造函数,静态构造函数是一个方法,它在方法内部执行。
底线是,您只能在方法中执行代码。
您缺少静态构造函数。试试这个:
namespace MongoDB_Test
{
class Program
{
protected static IMongoClient _client;
protected static IMongoDatabase _database;
static Program()
{
_client = new MongoClient();
_database = _client.GetDatabase("test");
}
}
}
基本上是这样的:
protected static IMongoClient _client = new MongoClient();
protected static IMongoDatabase _database = _client.GetDatabase("test");
可以被认为是这方面的功能等价物:
static Program()
{
_client = new MongoClient();
_database = _client.GetDatabase("test");
}
也就是说,字段初始化和构造函数不会同时执行——会发生一系列事件,如果您对MSDN站点感兴趣,可以查找这些事件。