【问题标题】:I cannot access a variable outside a class我无法访问类外的变量
【发布时间】:2013-05-20 12:58:02
【问题描述】:

我正在做一个二十一点项目..

我首先为Hit 按钮创建了Hit 类。

所以在表单上,​​当我单击它时,它将从 switch case 场景中检索一个值,该值在命中类中随机化了一个数字/值。

我尝试在 GenerateID 方法中的 Class hit to = stRefID 下创建一个变量,但这也失败了;一切都是公开的,所以我很困惑。

感谢您抽出宝贵时间帮助我,因为这是我第一次在这里发帖,但我一直都在使用这个地方。

Hit.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Blackjack
{
public class Hit
{
    public static string GenerateID(int MinSize, int MaxSize)
    {

        string stRefID = "";

        Random random = new Random();

            int iChosenMaxSize = random.Next(0, 11);

            int two = 2;
            int three = 3;
            int four = 4;
            int five = 5;
            int six = 6;
            int seven = 7;
            int eight = 8;
            int nine = 9;
            int ten = 10;
            int jack = 10;
            int queen = 10;
            int king = 10;
            int ace = 11;


         for (int x = 1; x <= iChosenMaxSize; x++)
        {
            int iCharType = random.Next(0, 12);
            switch (iCharType)
            {
                    case 0:
                        stRefID += two;
                        break;
                    case 1:
                        stRefID += three;
                        break;
                    case 2:
                        stRefID += four;
                        break;
                    case 3:
                        stRefID += five;
                        break;
                    case 4:
                        stRefID += six;
                        break;
                    case 5:
                        stRefID += seven;
                        break;
                    case 6:
                        stRefID += eight;
                        break;
                    case 7:
                        stRefID += nine;
                        break;
                    case 8:
                        stRefID += ten;
                        break;
                    case 9:
                        stRefID += ace;
                        break;
                    case 10:
                        stRefID += jack;
                        break;
                    case 11:
                        stRefID += queen;
                        break;
                    case 12:
                        stRefID += king;
                        break;

                }
             } return stRefID; 

        }
    }
}

我想在哪里检索并将文本框设置为检索到的值:

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

namespace Blackjack
{
public partial class Form1 : Form
{


        private void hit_Click(object sender, EventArgs e)
    {

         this.test.Text = Hit.stRefID;

    }

我也尝试过公开按钮,但失败了...

测试文本框输出:

private void test_TextChanged(object sender, EventArgs e)
    {

    }

亲切的问候, 迈克。

修改后的代码:

namespace Blackjack
{
public class Hit
{

    public static string GenerateID(string stRefID)

    {

        Random random = new Random();

            int iChosenMaxSize = random.Next(0, 11);

            int two = 2;
            int three = 3;
            int four = 4;
            int five = 5;
            int six = 6;
            int seven = 7;
            int eight = 8;
            int nine = 9;
            int ten = 10;
            int jack = 10;
            int queen = 10;
            int king = 10;
            int ace = 11;


         for (int x = 1; x <= iChosenMaxSize; x++)
        {
            int iCharType = random.Next(0, 12);
            switch (iCharType)
            {
                    case 0:
                        stRefID += two;
                        break;
                    case 1:
                        stRefID += three;
                        break;
                    case 2:
                        stRefID += four;
                        break;
                    case 3:
                        stRefID += five;
                        break;
                    case 4:
                        stRefID += six;
                        break;
                    case 5:
                        stRefID += seven;
                        break;
                    case 6:
                        stRefID += eight;
                        break;
                    case 7:
                        stRefID += nine;
                        break;
                    case 8:
                        stRefID += ten;
                        break;
                    case 9:
                        stRefID += ace;
                        break;
                    case 10:
                        stRefID += jack;
                        break;
                    case 11:
                        stRefID += queen;
                        break;
                    case 12:
                        stRefID += king;
                        break;

                }
          } return stRefID; 

        }

}
}

我使用 stRefID 创建了 generateID 方法,因为返回应该返回到它 - 我可以从按钮调用值?公共静态字符串声明有效,但前提是我有一个默认值...

【问题讨论】:

  • @Mike:你的代码可以编译吗?我猜Hit.stRefID 应该会抛出编译错误。
  • 对不起,我没有在这里看到你的回复,是的,它是:this.test.Text = Hit.GenerateID(stRefID);它说:错误1当前上下文中不存在名称'stRefID'
  • 我可以访问变量 - 但方法没有设置它。所以我想找出问题所在,我现在用修改后的代码编辑我的第一篇文章
  • 如果我将其保留为 this.test.Text = Hit.GenerateID();然后它说方法“GenerateID”没有重载需要'0'参数。
  • 非常感谢您的帮助 - 我希望我现在可以投票给您):

标签: c#


【解决方案1】:

不确定我是否完全理解。

但我可以看到 stRefID 是一个变量 localGenerateID 函数。

如果您需要以Hit.stRefID 的身份访问它,那么stRefID 应该是静态类成员

尝试将stRefID 添加为static 全局Class 变量。

public class Hit
{
    public static string stRefID = "";

    public static string GenerateID(int MinSize, int MaxSize)
    {
       //Your logic
    }

【讨论】:

  • 这是一个变量范围问题。如果他将 stRefID 设为静态,则他可能会在为其分配有用值之前访问它。最重要的是,除非他调用GenerateID,否则该值将永远不会改变,该GenerateID 当前返回他正在寻找的stRefID 的值。
  • @TheGreatCO:是的,我可以看到范围问题。但我不确定他为什么要尝试制作button public
  • 是的,我几乎是一样的......然后又不知道为什么GenerateID也需要是静态的。
  • @DimitarDimitrov:因为我们没有看到 GenerateID 函数调用,所以很难猜测..
  • @user2400333 您没有设置静态 stRefID。不仅如此,您的原始代码运行良好,只是您没有正确使用它。您需要调用GenerateID 并使用从它返回的值。您不需要静态类成员。这在许多级别的编码上都不好。
【解决方案2】:

您不能访问在方法中定义的变量。 stRefID 的范围严格在 GenerateID 之内。根据你的类,如果你想访问stRefID的值,你需要调用Hit.GenerateID,这将返回stRefID的值。变量的范围在 C# 中非常重要(与所有编程语言一样)。我建议你看看C# Variable Scope

【讨论】:

    【解决方案3】:

    您所做的是在方法GenerateID 的范围内声明了stRefID 变量,这是行不通的,所以您可以做的是将该变量放在类的范围内,然后您可以像这样使用它这个。

    namespace Blackjack
       {
        public class Hit
          {
           string stRefID = "";
    
           public static string GenerateID(int MinSize, int MaxSize)
            {
            Random random = new Random();
    
            int iChosenMaxSize = random.Next(0, 11);
    
            int two = 2;
            int three = 3;
            int four = 4;
            int five = 5;
            int six = 6;
            int seven = 7;
            int eight = 8;
            int nine = 9;
            int ten = 10;
            int jack = 10;
            int queen = 10;
            int king = 10;
            int ace = 11;
    
    
         for (int x = 1; x <= iChosenMaxSize; x++)
        {
            int iCharType = random.Next(0, 12);
            switch (iCharType)
            {
                    case 0:
                        stRefID += two;
                        break;
                    case 1:
                        stRefID += three;
                        break;
                    case 2:
                        stRefID += four;
                        break;
                    case 3:
                        stRefID += five;
                        break;
                    case 4:
                        stRefID += six;
                        break;
                    case 5:
                        stRefID += seven;
                        break;
                    case 6:
                        stRefID += eight;
                        break;
                    case 7:
                        stRefID += nine;
                        break;
                    case 8:
                        stRefID += ten;
                        break;
                    case 9:
                        stRefID += ace;
                        break;
                    case 10:
                        stRefID += jack;
                        break;
                    case 11:
                        stRefID += queen;
                        break;
                    case 12:
                        stRefID += king;
                        break;
    
                }
             } return stRefID; 
    
        }
    

    我猜这应该可以正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多