/ *您好我正在尝试在visual studio上制作我的第一个c#应用程序。我在main中创建了一个类和该类的实例,我只是试图在窗体上的click事件中查询该实例的成员,但它告诉我实例名称在当前上下文中不存在。任何帮助将不胜感激这里是我的代码。 * /
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;
}
}
}
}
答案 0 :(得分:1)
您的实例变量deviljin
是main方法的本地变量,不能在该方法之外直接引用。
您需要在您尝试使用它的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打开之前,您的代码不会退出此调用,因此您需要在Run调用之前移动deviljin
变量的创建。
编辑:我强烈反对在整个应用程序中使用具有全局可见性的变量。有时它们是必要的,但它们会导致很快创建不可维护的代码。最好学习使用尽可能少的全局变量进行编程
答案 1 :(得分: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,你会在尝试时遇到运行时异常访问它(它将为null)所以请确保在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;
}
}
阅读变量范围,访问修饰符和静态/实例变量 - 对于一个非常简单的项目,静态变量可以正常,这样你就可以在学习的同时走这条路线
答案 2 :(得分: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));