我收到错误“当前上下文中名称_client不存在。” “数据库”变量也是如此。
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");
}
}
为什么我会收到第一个代码块的错误?
答案 0 :(得分:11)
除非是基本的声明/初始化行,否则不能在方法之外编写代码。在方法范围之外,命令式代码语句并不真正有意义。这就是你的第二个例子的原因。
但是,您可以编写静态构造函数:
class Program
{
protected static IMongoClient _client;
protected static IMongoDatabase _database;
static Program()
{
_client = new MongoClient();
_database = _client.GetDatabase("test");
}
}
请记住,字段初始值设定项(静态或实例)和构造函数(静态或实例)和方法都是在构造对象期间的非常不同的时间执行的。如果代码依赖于时间,那么您将需要确保在需要时进行初始化。
答案 1 :(得分:2)
移动它:
_client = new MongoClient();
_database = _client.GetDatabase("test");
指一种方法,在这种情况下它是static Main()
这里没有错误:
protected static IMongoClient _client = new MongoClient();
因为new MongoClient()
没有被执行,而是隐式地被复制到静态构造函数,这是一个方法,并且在一个方法中执行它。
最重要的是,您只能在方法中执行代码。
答案 2 :(得分:2)
你错过了静态构造函数。试试这个:
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站点感兴趣,可以查找。