如何从不同的方法访问Main()中的变量

时间:2019-04-12 12:13:21

标签: c#

我正在尝试从我的DisplayFortune方法访问数组财富,但它说它在当前上下文中不存在。任何帮助,将不胜感激。我是C#的新手。

static void Main()
{
    // Write your main here.
    string[] fortune = { "String 1", "String 2", "String 3", "String 4", 
    "String 5", "String 6" };
    Random rand = new Random();
    int index = rand.Next(fortune.Length);
    WriteLine(fortune[index]);
    ReadLine();
}

public static void DisplayFortune(string first, string second)
{
    WriteLine(fortune[index]);

}

9 个答案:

答案 0 :(得分:3)

明确地将其作为方法参数传递,例如

public static void DisplayFortune(string first, string second, string[] fortune)
{
    WriteLine(fortune[index]);

}

答案 1 :(得分:1)

string[] fortuneRandom randint index这样的

Local 变量在作用域之下不可见它们以(即Main方法)声明。 在实现DisplayFortune方法时,让我们看一下我们想要哪个参数:

 public static void DisplayFortune(/* what should we put here? */)
 {
     // we want:
     //   fortune
     //   index 
     WriteLine(fortune[index]);
 }

因此我们可以放上

 public static void DisplayFortune(string[] fortune, int index)
 {
     WriteLine(fortune[index]);
 }

最后,由于它是一个 public 方法(每个人都可以调用它),所以让我们 validate 输入(如果我将其执行为DisplayFortune(null, -1234)会怎样?):

 public static void DisplayFortune(string[] fortune, int index)
 {
     if (null == fortune)
         throw new ArgumentNullException(nameof(fortune));
     else if (index < fortune.GetLowerBound(0) || index > fortune.GetUpperBound(0)) 
         throw new ArgumentOutOfRangeException(nameof(index)); 

     WriteLine(fortune[index]);
 }

要调用该方法,我们应提供其参数:

 static void Main() 
 {
    string[] fortune = { 
      "String 1", "String 2", "String 3", "String 4", "String 5", "String 6" 
    };

    Random rand = new Random();
    int index = rand.Next(fortune.Length); 

    ...
    DisplayFortune(fortune, index);
 }

答案 2 :(得分:0)

在Main之外声明您的财富变量。在类声明的下面。

答案 3 :(得分:0)

你不能。

否则,如果您要将此变量设为类的成员,例如:

// declaration outside of Main's scope
static string[] fortune;

static void Main()
{
    // Write your main here.
    fortune = { "String 1", "String 2", "String 3", "String 4", 
    "String 5", "String 6" };
    Random rand = new Random();
    int index = rand.Next(fortune.Length);
    WriteLine(fortune[index]);
    ReadLine();
}

public static void DisplayFortune(string first, string second)
{
    WriteLine(fortune[index]);
}

或者,如果直接将此变量传递给方法,例如:

public static void DisplayFortune(string first, string second, string[] fortune)
{
    WriteLine(fortune[index]);
}

答案 4 :(得分:0)

您不能在另一个方法内部访问变量,除非将其带出方法范围之外。

因此,将变量从Main中移出,然后即可访问它。

例如。伪代码

int yourVaribale = 0;
static Main { yourVariable = 5; OtherMethod(); }...
static OtherMethod{ yourVariable = 10; }....

答案 5 :(得分:0)

您的功能没有任何意义。 - 选项1 :     在任何事物之外将财富声明为const -选项2:     将数组添加为displayFortune()参数

答案 6 :(得分:0)

有几种方法可以执行此操作。 您可以像下面这样声明变量 Outside Main函数:

static  string[] fortune = { "String 1", "String 2", "String 3", "String 4", 
"String 5", "String 6" };

另一个选择是将变量传递给方法:

public static void DisplayFortune(string first, string second, string[] fortune)
{
    WriteLine(fortune[index]);
}

答案 7 :(得分:0)

因此,在您发布的代码中有一些奇怪的事情。之所以无法访问该变量,是因为该变量超出范围。。在出现大括号public void putProfilePic(String url, File profileImage, final Action1<UserIdentity> userIdentityAction) { RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), profileImage); appCMSUserIdentityRest.putUserProfileImage(url, fileBody).enqueue(new Callback<UserIdentity>() { @Override public void onResponse(@NonNull Call<UserIdentity> call, @NonNull Response<UserIdentity> response) { if (response.body() != null) { Observable.just(response.body()) .onErrorResumeNext(throwable -> Observable.empty()) .subscribe(userIdentityAction); } } @Override public void onFailure(@NonNull Call<UserIdentity> call, @NonNull Throwable t) { Observable.just((UserIdentity) null) .onErrorResumeNext(throwable -> Observable.empty()) .subscribe(userIdentityAction); } }); } {的任何位置,您都在创建有范围的 block < / strong>。在该块中声明的变量只能在同一块中引用。因此,除非有其他功能,否则您无法访问该变量:

  • 被声明为更高的范围
  • 作为参数传递给函数

该代码的第二个奇怪之处是,}中有两个未使用的参数。您应该更改这些参数以接受数组。

DisplayFortune

然后,像Main中的public static void DisplayFortune(string[] fortunes, int index) { WriteLine(fortunes[index]); } 一样调用它。

我认为您正在学习,所以只想指出另一种改进代码的方法:

  • 您的DisplayFortune方法不应打印财富-它应DisplayFortune(fortunes, index);作为字符串,因此您的return方法可以使用它。
  • 列表项

答案 8 :(得分:0)

通常,您的阵列运气在另一个范围内,要解决您的问题,有两种方法。

  1. 您需要在Main方法之外声明您的数组命运,在这种情况下,因为Main和DisplayFortune方法都具有相同的 level-class范围,因此您的数组命运将对方法可用

    // Level-Class Scope
    static string[] fortune ;
    
    static void Main()
    {
        // Write your main here.
        fortune = new string[6];
        Random rand = new Random();
        int index = rand.Next(fortune.Length);
        Console.WriteLine(fortune[index]);
        Console.ReadLine();
    }
    
    public static void DisplayFortune(int index)
    {
        Console.WriteLine(fortune[index]);
    }
    
  2. 解决问题的第二种方法是在 DisplayFortune

    中将其作为参数传递

    简单方法:

    public static void DisplayFortune(string[] array, int index)
    {
        Console.WriteLine(array[index]);
    }
    

    扩展方法:

    public static void DisplayFortune(this string[] array, int index)
    {
        Console.WriteLine(array[index]);
    }
    

最诚挚的问候。