VBer的C#问题.私有字段必须声明为静态吗?

Set*_*man 3 c# vb.net syntax

我是vb.net程序员切换到C#.

我有一个控制台应用程序的代码(针对NET20)

using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;


namespace eScoreSwapper
{
    class Program
    {
        private string _dbName = ConfigurationManager.AppSettings["dbName"];

        static void Main(string[] args) {}

        static void InitVars()
        {
            if (string.IsNullOrEmpty(_dbName)) _dbName = "";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这在_dbName变量的InitVars的if子句中给出了编译错误:

Error   1   An object reference is required for the non-static field, method, or property 'eScoreSwapper.Program._dbName'   C:\Users\SethS\Documents\eScore\Versions\Trunk\dotNet\eScoreSwapper\eScoreSwapper\Program.cs    26  38  eScoreSwapper
Run Code Online (Sandbox Code Playgroud)

是因为它是真的.除非声明为静态,否则C#不允许您引用私有类字段?我确信我做错了什么.

在我的时候,我可以问另一个C#问题.为什么if语句有效?为什么不需要牙箍?只要条件后跟单个表达式(如在t-sql IF中),它是否是有效的语法.

谢谢你的帮助.

赛斯

Jam*_*ran 8

不,但静态方法使用的私有字段.我认为你真正想做的是static从声明中删除InitVars().

我会假设你以前尝试过:

static void Main(string[] args) 
{
   InitVars();
} 
Run Code Online (Sandbox Code Playgroud)

并且失败,所以你添加static到InitVars().错误的答案.基本上,你应该假装Main()不是类的一部分.

static void Main(string[] args) 
{
   Program prog = new Program();
   prog.InitVars();
} 
Run Code Online (Sandbox Code Playgroud)

至于If()语句

if (string.IsNullOrEmpty(_dbName)) _dbName = "";
Run Code Online (Sandbox Code Playgroud)

只是一个简短的版本:

if (string.IsNullOrEmpty(_dbName)) 
     _dbName = "";
Run Code Online (Sandbox Code Playgroud)

现在,在C-ish语言中,正式地,if()true即将执行(一个)下一个语句.但是,您可以通过将它们包装在大括号中,在一个语句中进行多次声明.但是,如果你真的只有一个声明,则不需要它们.


Est*_*aya 5

您不能在静态方法中使用实例成员变量.要么使你的变量变为静态,要么将方法和变量放在一个实例类中,并在main程序中将其新建.

当你想到这个方法存在于"类上"而变量存在于"实例上"的事实时,你无法从静态方法访问实例变量的原因变得很明显.希望有所帮助.

作为最后的评论,我只是补充一点,编译器给你错误的事实与你的字段是私有的这一事实无关; 如果你的字段是公共的,内部的,等等,编译器仍然会给你同样的错误:即.静态方法无法访问实例变量.