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");
    }
}

为什么我会得到第一个代码块的错误?

C#:为什么不';这项静态任务不起作用

除非是基本的声明/初始化行,否则不能在方法之外编写代码。强制代码语句在方法的范围之外并没有真正的意义。这就是为什么你的第二个例子有效。

然而,您可以编写一个静态构造函数:

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站点感兴趣,可以查找这些事件。