C#:为什么这个静态赋值不起作用?

时间:2015-11-10 18:51:47

标签: c#

我收到错误“当前上下文中名称_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");
    }
}

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

3 个答案:

答案 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站点感兴趣,可以查找。