我是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中),它是否是有效的语法.
谢谢你的帮助.
赛斯
不,但静态方法使用的私有字段.我认为你真正想做的是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即将执行(一个)下一个语句.但是,您可以通过将它们包装在大括号中,在一个语句中进行多次声明.但是,如果你真的只有一个声明,则不需要它们.
您不能在静态方法中使用实例成员变量.要么使你的变量变为静态,要么将方法和变量放在一个实例类中,并在main程序中将其新建.
当你想到这个方法存在于"类上"而变量存在于"实例上"的事实时,你无法从静态方法访问实例变量的原因变得很明显.希望有所帮助.
作为最后的评论,我只是补充一点,编译器给你错误的事实与你的字段是私有的这一事实无关; 如果你的字段是公共的,内部的,等等,编译器仍然会给你同样的错误:即.静态方法无法访问实例变量.