2017-11-08 2 views
-1

So, ich habe die Mehrheit meiner Code abgeschlossen, aber ein Kriterium erforderte mich, eine Prozedur zu verwenden. Also, als ich mich entschied, eine Prozedur zu verwenden, stieß ich auf mehrere Probleme. Das Hauptproblem war, dass die Variablen, die ich in der ersten Methode (Generate Number und number) eingeschlossen habe, nicht in meinen anderen Methoden angezeigt werden. So kann ich diese Variablen global machen, so dass sie in allen meinen Methoden funktionieren oder gibt es eine alternative Lösung zu diesem Problem?C# Probleme mit der Verwendung globaler Variablen

Hinweis: Dies ist nicht mein voller Code ist nur ein Stück daraus.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Random GenerateNumber = new Random(); 
     int[] number = new int[6]; 
     Generating(); 
     Ordering(); 
    } 

    static void Generating() 
    { 
     Console.Clear(); 
     Console.WriteLine("Stage 1 : 6 random numbers have been generated:\n"); 
     for (int c = 0; c < number.Length; c++) 
     { 
      if (number[c] == 0) 
      { 
       number[c] = GenerateNumber.Next(1, 50); 
       Console.Write("Random number " + (c + 1) + " = " + number[c] + "\n"); 
      } 
     } 
    } 

    static void Ordering() 
    { 
     Console.Clear(); 
     for (int i = 0; i < number.Length; i++) 
     { 
      Array.Sort(number); 
      Console.Write("Number " + (i + 1) + " = " + number[i] + "\n"); 
     } 
    } 
} 
+0

Sie können sie zu statischen Mitgliedern der 'Program' Klasse machen. – Rotem

+3

Google für C# variable Bereiche –

+4

Sie wollen nicht * globals * möchten Sie * Parameter * übergeben, siehe [Parameter übergeben (C# -Programmierhandbuch)] (https://docs.microsoft.com/en-us/dotnet/ csharp/programming-guide/classes-and-structs/passing-parameters) –

Antwort

2

Machen Sie sie global ist am einfachsten, aber wie oben gesagt, nicht der beste Weg.

class Program 
{ 
    static Random GenerateNumber = new Random(); 
    static int[] number = new int[6]; 

    static void Main(string[] args) 
    { 
     Generating(); 
     Ordering(); 
    } 

Bessere Parameter verwenden

class Program 
{  
    static void Main(string[] args) 
    { 
     Random GenerateNumber = new Random(); 
     int[] number = new int[6]; 
     Generating(GenerateNumber, number); 
     Ordering(number); 
    } 

    static void Generating(Random generateNumber, int[] number) 
    { 
     Console.Clear(); 
     Console.WriteLine("Stage 1 : 6 random numbers have been generated:\n"); 
     for (int c = 0; c < number.Length; c++) 
     { 
      if (number[c] == 0) 
      { 
       number[c] = generateNumber.Next(1, 50); 
       Console.Write("Random number " + (c + 1) + " = " + number[c] + "\n"); 
      } 
     } 
    } 

    static void Ordering(int[] number) 
    { 
     Console.Clear(); 
     for (int i = 0; i < number.Length; i++) 
     { 
      Array.Sort(number); 
      Console.Write("Number " + (i + 1) + " = " + number[i] + "\n"); 
     } 
    } 
} 
0

Sie es wie dieser

class Program 
    { 
     public static void Main(string[] args) 
     { 
      Program p = new Program(); 
      Random GenerateNumber = new Random(); 
      int[] number = new int[6]; 

      int[] generatedNumber = p.Generating(GenerateNumber, number); 
      p.Ordering(generatedNumber); 
     } 

     public int[] Generating(Random GenerateNumber, int[] number) 
     { 
      Console.Clear(); 
      Console.WriteLine("Stage 1 : 6 random numbers have been 
      generated:\n"); 
      for (int c = 0; c < number.Length; c++) 
      { 
       if (number[c] == 0) 
       { 
        number[c] = GenerateNumber.Next(1, 50); 
        Console.Write("Random number " + (c + 1) + " = " + number[c] 
        + "\n"); 
       } 
      } 
      return number; 
     } 

     public void Ordering(int[] number) 
     { 
      Console.Clear(); 
      for (int i = 0; i < number.Length; i++) 
      { 
       Array.Sort(number); 
       Console.Write("Number " + (i + 1) + " = " + number[i] + "\n"); 
      } 
     } 
    } 

https://dotnetfiddle.net/3K6P54

0

tun könnte Wenn Sie mehr Methoden, wie sie mit Ihrer Array arbeiten dann von Zahlen Ich würde vorschlagen, dass Sie eine CLASS erstellen, die die gewünschten Verhaltensweisen einkapselt. Etwas allein die Linien:

public class MyNumberArrayWithMethods 
{ 
    public int[] Numbers { get; set; } 
    public Action<int, int> Writer { get; set; } 

    //parametric constructor   
    public MyNumberArrayWithMethods(int length, Action<int, int> writer = null) 
    { 
     Numbers = new int[length]; 
     Writer = writer; 
    } 

    public void Generating(int lowerBound = 1, int upperBound = 50) 
    { 
     for (int c = 0; c < Number.Length; c++) 
     { 
      if (Number[c] == 0) 
      { 
       Number[c] = GenerateNumber.Next(lowerBound, upperBound); 
       if(Writer != null) 
        Writer(c, Number[c]) 
      } 
     } 
    } 

    public void Ordering() 
    { 
     Console.Clear(); 
     Array.Sort(Number); 
     if(Writer != null) 
      for (int i = 0; i < Number.Length; i++) 
       Writer(i, Number[i]); 
    } 

    //... all other methods that work with "Number" array should go here 
} 

und dann in der Haupt

static void Main(string[] args) 
{ 
    Action<int, int> writer = 
     (pos, num) => { Console.Write("Number " + (pos + 1) + " = " + num + "\n"); } 
    var MyCtrl = new MyNumberArrayWithMethods(6, writer); 
    MyCtrl.Generating(); 
    Ordering(); 
} 

Bitte beachten Sie, wie ich Ihre Array.Sort Anruf außerhalb der Schleife bewegt. Wenn du es innen liegst, sortierst du das Array so oft wie die Länge des Arrays und ich vermute, du willst das nicht.

Verwandte Themen