2017-04-14 4 views
3

Ich bin neu in C# - das ist fast mein erstes Programm. Ich versuche, einige statische statische Variablen und Konstanten zu erstellen, die überall im Programm verwendet werden können. Der falsche Weg, den ich versucht habe, ist, sie in einer separaten Klasse im selben Namespace zu deklarieren, aber sie sind für das Hauptprogramm nicht im Zusammenhang. Es ist eine WPF-Anwendung. Der Code sieht wie folgt aus:Nicht scoping statische vars richtig in C#

namespace testXyz 
{ 
    class PublicVars 
    { 
     public const int BuffOneLength = 10000; 
     public static int[] Buff1 = new int[BuffOneLength]; 

     public const int BuffTwoLength = 2500; 
     public static int[] Buff2 = new int[BuffTwoLength]; 

     private void fillBuff1() 
     { 
      Buff1[0] = 8; 
      Buff1[1] = 3;   
      //etc 
     } 

     private void fillBuff2() 
     { 
      Buff2[0] = 5; 
      Buff2[1] = 7;   
      //etc 
     } 
    } 
} 

Zweite Datei:

namespace testXyz 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public static int isInContext = 0; 
     int jjj = 0, mmm = 0; 

     private void doSomething() 
     { 
      isInContext = 5; // this compiles 
      if (jjj < BuffOneLength) // "the name 'BuffOneLength' does not exist in the current context" 
      { 
       mmm = Buff2[0]; // "the name 'Buff2' does not exist in the current context" 
      } 
     } 
    } 
} 

Meine eigentliche Programm ist viel mehr natürlich. Ich habe die obige WPF-Anwendung genau wie gezeigt erstellt, um dieses Problem zu testen, und ich habe diese Fehler, die auch im realen Programm auftreten. Ich möchte wirklich nicht die Arrays im Hauptprogramm füllen, da sie sehr lang sind und es würde viel Scrollen bedeuten. Ich möchte auch einen Ort haben, an dem ich bestimmte öffentliche statische Variablen deklarieren kann. Was ist der richtige Weg?

+0

ich, warum nicht bekommen sein werden Sie den gleichen Namensraum deklarieren zweimal? – dcg

+0

Die 2 Blöcke befinden sich in 2 verschiedenen CS-Dateien im Projekt. Visual Studio generiert die Namespacedeklarationen. Ich habe sie im obigen Beispiel angehängt. – Moonling

+0

Ok! Ich habe es nirgendwo gelesen, also nahm ich an, dass es in derselben Datei war. – dcg

Antwort

8

Sie müssen entweder Klasse angeben:

// BuffOneLength from PublicVars class 
if (jjj < PublicVars.BuffOneLength) { 
    ... 
    // Buff2 from PublicVars class 
    mmm = PublicVars.Buff2[0]; 

oder setzen using static:

// When class is not specified, try PublicVars class 
using static testXyz.PublicVars; 

namespace testXyz { 
    public partial class MainWindow : Window { 
    ... 

    // BuffOneLength - class is not specified, PublicVars will be tried 
    if (jjj < BuffOneLength) { 
     mmm = Buff2[0]; 
2

Sie können nicht eine statische Variable zugreifen, die nur durch den Aufruf der Variable in einer anderen Klasse ist. Sie müssen zuerst durch die Klasse gehen, die es in Ihrem Fall enthält wäre es

PublicVars.BuffOneLength 

und

PublicVars.Buff2[0] 
+0

Danke. Das beantwortet es. Ich werde den Klassen den Klassennamen voranstellen. "Verwenden von statischen" wäre eine gute Option, aber ich habe nur VS 2013 ... – Moonling