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

时间:2010-08-18 18:41:25

标签: 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 = "";
        }
    }
}

这在_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
是的,因为它是真的。除非声明为静态,否则C#不允许您引用私有类字段?我确信我做错了什么。

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

感谢您的帮助。

赛斯

7 个答案:

答案 0 :(得分:8)

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

我会假设您之前尝试过:

static void Main(string[] args) 
{
   InitVars();
} 

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

static void Main(string[] args) 
{
   Program prog = new Program();
   prog.InitVars();
} 

至于If()语句

if (string.IsNullOrEmpty(_dbName)) _dbName = "";

只是简短版本:

if (string.IsNullOrEmpty(_dbName)) 
     _dbName = "";

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

答案 1 :(得分:5)

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

当您考虑到该方法存在于“类上”而变量存在于“实例”上时,您无法从静态方法访问实例变量的原因变得显而易见。希望有所帮助。

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

答案 2 :(得分:1)

您无法以静态方法访问非静态成员。

除非您希望大括号适用于多个语句,否则不需要大括号。但无论如何你应该把它们放进去。

答案 3 :(得分:1)

要回答有关大括号的问题,如果if块中有多个语句,则它们在C#中才是真正必需的。否则,您可以将单行与if放在同一行,或者放在下一行。我相信在编码标准中通常建议您始终使用括号。通常建议不要将整个代码系列放在所有一行上,但是当我们得到三级和零合并运算符时,这种情况就会消失。

答案 4 :(得分:1)

如果不使用方法参数来引入类成员的引用,则无法从静态方法中访问非静态类成员。

if语法是正常的c#(c ++,c)。只有复杂的多线块才需要大括号。以下其他也可以有一个奇异的行。

答案 5 :(得分:0)

您正尝试从静态上下文访问实例字段。由于_dbName未标记为静态,因此Program类的每个实例可能不同,因此静态方法InitVars()无法知道正确的值是什么。< / p>

如果Program的每个实例都具有_dbName的相同值,则_dbName应标记为静态。如果不同的实例可能具有不同的值,那么InitVars()应该是一个实例方法(删除静态关键字并仅在实际的Program对象上调用它而不是从静态Main调用它。)

答案 6 :(得分:0)

VB术语中的“静态”将是“共享”。