【问题标题】:An object reference is required for the non-static field非静态字段需要对象引用
【发布时间】:2015-05-11 17:47:02
【问题描述】:

我遵循this 教程,并尝试在 C# 控制台应用程序中使用 Access 数据库。

我有 2 节课:

class Ac
    {
        OleDbConnection connection;
        OleDbCommand command;

        private void ConnectTo()
        {
            connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.15.0;Data Source=D:\Info\csharp\socket\ef\accesstest\accesstest\bin\Debug\Database.accdb;Persist Security Info=False");
            command = connection.CreateCommand();
        }

        public Ac()
        {
            ConnectTo();
        }

        public void Insert(string a, string b)
        {
            try
            {
                command.CommandText = "INSERT INTO Persons (nName, nNamee) VALUES (\"" + a + "\", \"" + b + "\");";
                command.CommandType = System.Data.CommandType.Text;
                connection.Open();

                command.ExecuteNonQuery();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                }
            }
        }
    }

还有,

namespace accesstest
{
    public class MainClass
    {
        Ac f = new Ac();

        public static void Main()
        {
            f.Insert("ab", "ac");

            Console.WriteLine("\n\nPress enter to close...");
            Console.ReadLine();
        }
    }
}

我得到“非静态字段、方法或属性‘accesstest.MainClass.f’需要对象引用”。 我尝试从中删除静态,但不起作用,说 Main 必须是静态的。

对我有什么想法吗?谢谢!

【问题讨论】:

  • 使f静态static Ac f = new Ac();
  • 或者把它移到Main方法里面。
  • 我想说将 f 的实例创建移到 main 中更有意义 - 它似乎在其他任何地方都没有任何用途。
  • 好的,我会的。感谢您的建议。

标签: c# static


【解决方案1】:

在静态上下文中,如果没有对象引用,就不能引用实例变量 f。

根据 MSDN,Main 方法是程序的入口点;它是程序控制开始和结束的地方。

  • Main 在类或结构中声明。 Main 必须是静态的,并且不应该是公共的。 (在前面的示例中,它接收默认访问私有。)封闭类或结构不需要是静态的。
  • Main 可以具有 void 或 int 返回类型。
  • 可以使用或不使用包含命令行参数的 string[] 参数来声明 Main 方法。使用 Visual Studio 创建 Windows 窗体应用程序时,可以手动添加参数,也可以使用 Environment 类获取命令行参数。参数被读取为零索引的命令行参数。与 C 和 C++ 不同,程序的名称不被视为第一个命令行参数。

Suggested Reading

【讨论】:

  • 是的,我找到了所有这些,但我不明白他的意思是静态问题。我了解 Main 的问题,这只是一个示例,表明我在发布之前搜索了几次。谢谢!
  • Environment.GetCommandLineArgs() 实际上确实包含可执行文件作为第一个参数:msdn.microsoft.com/en-us/library/…
【解决方案2】:

试试这个:

1) 公开“Ac 类”。

2) 让它变得简单

    public string whateverFunction()
    {
    f.Insert("ab", "ac"); 
    return "OK";}
    }

3) 在其他地方调用 MainClass

    accesstest.MainClass obj = new accesstest.MainClas(); 
    string result = obj.whateverFunction();

如果可行,请提高代码质量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多