0

/* 嗨,我正在尝试在 Visual Studio 上制作我的第一个 c# 应用程序。我在 main 中创建了一个类和该类的一个实例,我只是想在表单上的单击事件中查询该实例的成员,但它告诉我实例名称在当前上下文中不存在。任何帮助将不胜感激这是我的代码。*/

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;

    namespace WindowsFormsApplication10
    {

     public class character         // this is my class
        {
            public bool hair_black;
        }


        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());

                character deviljin = new character();  // instance of my class

                deviljin.hair_black = true;      // initiating a member of the instance


            }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication10
    {


        public partial class Form1 : Form
        {

            int cs1 = 0,cs2=0;


            public Form1()
            {
                InitializeComponent();


            public void pictureBox1_Click(object sender, EventArgs e)
            {

                flowLayoutPanel1.Visible = true;
                if (deviljin.hair_black == true)   // trying to access instance member
                {                                  // but getting deviljin does not
                                                   // exist in the current context
                    pictureBox28.Visible = false;
                }            

            }

        }
    }
4

3 回答 3

1

这是因为错误所说的 - 实例在当前上下文(表单的上下文)中不存在

Main这是一个范围问题 - 您声明的每个变量都有一个范围,并且由于您在类中方法的本地范围内声明您的字符类实例Program,因此它只能在该方法中可见。

由于Program该类是静态的,因此您可以在该类上创建一个静态成员,例如:

namespace WindowsFormsApplication10
{

 public class character         // this is my class
    {
        public bool hair_black;
    }


    static class Program
    {
        public static character deviljin;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

编辑:并没有真正注意到这一点,但正如史蒂夫指出的那样,虽然这会编译,但如果您在实例化变量之前调用 Application.Run ,您将在尝试访问它时获得运行时异常(它将为空)所以 make确保在 Application.Run 之前执行此操作

            deviljin = new character();  // instance of my class

            deviljin.hair_black = true;      // initiating a member of the instance

            Application.Run(new Form1());


        }
    }
}

这样您就可以通过Program类访问您的实例:

        public void pictureBox1_Click(object sender, EventArgs e)
        {

            flowLayoutPanel1.Visible = true;
            if (Program.deviljin.hair_black == true)   
            { 
                pictureBox28.Visible = false;
            }            

        }

阅读变量范围、访问修饰符和静态/实例变量——对于一个非常简单的项目,静态变量可以,所以你可以在学习的同时走这条路

于 2012-12-14T00:09:39.353 回答
1

您需要更新您的表单以将 Character 实例作为参数,例如

public partial class Form1 : Form
{
    private Character _character;
    public Form1(Character character)
    {
        _character = character;
    }

    public void pictureBox1_Click(object sender, EventArgs e)
    {
        If (_character.hair_black)
        {
             ...
        }
    }
}
...
var deviljin = new Character()
{
    hair_black = true
};
Application.Run(new Form1(deviljin));
于 2012-12-14T00:12:33.673 回答
1

您的实例变量deviljin是主方法的本地变量,不能在该方法之外直接引用。

您需要在您尝试使用它的 Form1 实例中传递引用。这可以通过 form1 的构造函数直接传递引用来完成

 Application.Run(new Form1(deviljin));

当然将 Form1 的构造函数更改为

private character _devReferenceToCharacterPassed

public Form1(character mycharInstance)
{
    _devReferenceToCharacterPassed = mycharInstance;
    InitializeComponent();
}

现在您可以在点击代码中使用传入的实例

public void pictureBox1_Click(object sender, EventArgs e)
{
    flowLayoutPanel1.Visible = true;
    if (_devReferenceToCharacterPassed.hair_black == true)   
    {                                  
         pictureBox28.Visible = false;
    }            
}

还要注意

Application.Run(new Form1(deviljin));

是阻塞调用。这意味着您的代码在 Form1 打开之前不会退出此调用,因此您需要deviljin在 Run 调用之前移动变量的创建。

编辑:我强烈反对在应用程序中使用具有全局可见性的变量。有时它们是必要的,但它们会很快导致创建不可维护的代码。最好学习使用尽可能少的全局变量进行编程

于 2012-12-14T00:03:36.707 回答