将Main声明为静态会导致错误

时间:2014-01-13 17:14:28

标签: c# class main static-methods

在我上次编译时,我收到了以下构建错误:

  

“非静态字段,方法或者需要对象引用   财产......“

然后是我Main()中包含的所有项目的列表。

之前,它已阅读static Main() {,但在我将其更改为public Main() {之前,我无法将错误消失。

我不记得在这个开始发生之前我做过的最后一件事(这是昨晚很晚),但我确实认为我在试图引用主表单上的static void recalcTotals()字段项目时搞乱了我仍然没有想到它,但这是一个单独的问题。

请注意,这是我的第一个C#程序。下面基本上是我的代码:

namespace Play_XXX
{
    public partial class Main : Form 
    {
        // Enable moveability
        private const int WM_NCHITTEST = 0x84;
        private const int HTCLIENT = 0x1;
        private const int HTCAPTION = 0x2;

        // Handling the window messages
        protected override void WndProc(ref Message message) {
            base.WndProc(ref message);

            if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
                message.Result = (IntPtr)HTCAPTION;
        }

        public Main() {
            InitializeComponent();

            // Handle all auto-formatting textboxes
            txt1.Leave += new EventHandler(validateInput);
            txt2.Leave += new EventHandler(validateInput);
            txt3.Leave += new EventHandler(validateInput);
            txt4.Leave += new EventHandler(validateInput);
            txt5.Leave += new EventHandler(validateInput);
            txt6.Leave += new EventHandler(validateInput);
            txt7.Leave += new EventHandler(validateInput);
            txt8.Leave += new EventHandler(validateInput);
            txt9.Leave += new EventHandler(validateInput);
            txt10.Leave += new EventHandler(validateInput);
            txt11.Leave += new EventHandler(validateInput);
        }

        private void Main_Load(object sender, EventArgs e) {
            //TODO: Reference function to clear all input forms
        }

        static decimal? trueAmount(string testValue) {
            decimal preOut;

            //TODO: RegEx to remove all except digits?
            if (testValue != null && testValue != "")
                testValue = testValue.Replace(",", "").Replace("$", "");
            else
                testValue = "0";

            //Return value
            if (decimal.TryParse(testValue, out preOut))
                return preOut;
            else
                return null;
        }

        void validateInput(object sender, EventArgs e) {
            TextBox subjBox = (sender as TextBox);

            decimal? trueVal = trueAmount(subjBox.Text);

            //Check if this is a number
            if (trueVal.HasValue) {
                subjBox.Text = trueVal.Value.ToString("C");
                subjBox.BackColor = Color.FromArgb(86, 86, 86);
                subjBox.ForeColor = Color.FromArgb(208, 210, 211);
                recalcTotals();
            }
            else {
                subjBox.BackColor = Color.FromArgb(255, 200, 200);
                subjBox.ForeColor = Color.Maroon;
            }
        }

        static void recalcTotals() {
            //TODO: How the fxck do your reference form controls
        }

        private void btnClose_Click(object sender, EventArgs e) {
            Close();
        }

    }
}

2 个答案:

答案 0 :(得分:1)

将您的课程命名为Main以外的所有内容(例如MainForm)。

答案 1 :(得分:0)

请注意,构造函数方法不同。

方法的名称与类名不同,并且它具有返回类型,例如voidint。这些是方法:

class C
{
  public void M1()
  {
  }
  public static void M2()
  {
  }
  public int M3()
  {
    return 10;
  }
  public static int M4()
  {
    return -10;
  }
}

构造函数必须与类具有相同的名称,并且不能具有返回类型。这些是构造函数:

class C
{
  public C()
  {
  }
  static C()
  {
  }
}

构造函数通常用于在使用类之前设置“state”。

入口点是一种特殊方法,程序中只能有一个。入口点必须是方法,必须为static且必须命名为Main。因此,入口点不能是也被称为Main的类的直接成员。

我不认为在Windows窗体应用程序中使用Form派生的类中的入口点通常是正常的,但当命名遵循上述内容时,它肯定是可能的。

此外,非静态构造函数或方法可以直接访问该类的所有成员。当像这样引用另一个非静态成员时,与方法/构造函数所属的类相同的实例(称为this)被隐式用于访问另一个成员。

相反,static构造函数或方法只能通过显式拥有实例来访问非静态成员,如myInstance.TheNonStaticMember();中所示。通常,入口点(我所说的static方法)将创建一个new TheClassName(...)的实例。