2011-12-23 63 views
2

我對編程相當陌生。當我用C語言爲自己嘗試任何東西時,我一直面臨的問題是範圍。C#可變範圍阻止我在我的軌道上

有什麼方法可以在不同的方法或類中使用或修改變量嗎?有沒有辦法做到這一點,而不創建一個類或對象的新實例?它似乎每次擦拭石板都很乾淨。

例如,我正在設置一個控制檯文本遊戲,並且我想要以特定間隔向控制檯寫入不同的背景消息。

public static void OnTimedEvent(object scource, ElapsedEventArgs e) 
{ 
    if(Exposition.Narration == 1) 
    { 
     Console.WriteLine("The bar is hot and muggy"); 
    } 

    if (Exposition.Narration == 2) 
    { 
     Console.WriteLine("You see someone stealing beer from the counter"); 
    } 

    if (Exposition.Narration == 3) 
    { 
     Console.WriteLine("There is a strange smell here"); 
    } 
} 

但我沒有辦法讓不同的消息播放。如果我從方法內部創建變量,它會在每次運行時將該變量發送給它的defult。如果我創建了一個對象或類的新實例,它也會將事情發回到defult。另外,當我創建它們的新實例時,我不能修改單個類。

這只是其中一個問題出現的一個例子。有沒有辦法在更廣的範圍內擁有可擴展性?或者我在想這個錯誤的方式?

編輯:

簡單地說,我可以閱讀或不同的方法或類內改變一個變量?

using System;

namespace Examp 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 

      int number = 2; 
      other(); 
     } 


     public static void other() 
     { 
      if (Main.number == 2) 
      { 
       number = 3 
      } 
     } 

    } 
} 
+0

我也不是很明白你的問題,你把一個例子,其中Exposition.Narration是沒有定義在任何地方,你談論示波器。你錯過了一些代碼讓我們明白你想要什麼。另外考慮使用該類型的代碼的開關(這是offtopic) – 2011-12-23 02:42:33

+0

啊,對不起。普遍的問題比具體的例子更重要,這就是爲什麼我對細節稍微有點輕鬆,我會做一個編輯。 – Brad 2011-12-23 02:48:20

+0

您可以通過訪問實例屬性(您需要傳遞對實例的引用)或通過訪問類的靜態屬性(直接訪問類,不需要實例)來從另一個類更改變量。 – 2011-12-23 03:07:44

回答

0

Class access modifiers允許您控制您想要的類暴露給其他類成員。此外,static classsingleton pattern允許用於在您的應用程序中重複使用相同的實例。

看看你的例子,看起來你只是試圖讀取類成員,因此你的類中的公共屬性應該就足夠了。可以在初始化存在OnTimedEvent方法的類時傳遞此類的實例(此方法應更改爲實例方法以訪問您的類的非靜態成員)。

例如,

class MyClass 
{ 
    private Exposition exposition; 

    // Option 1: Use parametrized constructor 
    // Pass the instance reference of the other class while 
    // constructing the object 
    public MyClass(Exposition exposition) 
    { 
     this.exposition = exposition; 
    } 

    // Option 2: Use an initialize method 
    public void Initialize(Exposition exposition) 
    { 
     this.exposition = exposition; 
    } 

    // Remove static to access instance members 
    public void OnTimedEvent(object scource, ElapsedEventArgs e) 
    { 
     // Better to use an enumeration/switch instead of magic constants 
     switch(exposition.Narration) 
     { 
      case HotAndMuggy: 
       Console.WriteLine("The bar is hot and muggy");; 
       break; 
      ... 
     } 
    }  

    // Option 3: Use static properties of the Exposition class 
    // Note this approach should be used only if your application demands 
    // only one instance of the class to be created   
    public static void OnTimedEvent_Static(object scource, ElapsedEventArgs e) 
    { 
     // Better to use an enumeration/switch instead of magic constants 
     switch(Exposition.Narration) 
     { 
      case HotAndMuggy: 
       Console.WriteLine("The bar is hot and muggy");; 
       break; 
      ... 
     } 
    }   
} 
+0

謝謝,我將不得不磨一下,更多地瞭解它,以更好地理解它的工作原理。我會把它作爲參考。 – Brad 2011-12-23 03:19:55

2

雖然我不認爲我完全瞭解你的問題,你可以在這裏看到了一些方法,使一個變量「堅持」的方法外:

靜態變量

靜態變量就像是一個全局變量。你可以通過所有程序看到它們,如果你將它們設置爲公共(如果你將它們設置爲內部的,它是不同的)。

靜態變量可以被定義爲:

class MyClass 
{ 
    static int MyVariable = 4; 
} 

....somewhere... 
void MyMethod() 
{ 
    MyClass.MyVariable = 234; 
} 

正如你所看到的,你可以在任何地方訪問它們。在堆

變量

如果你創建一個對象與運營商,如果你繼續引用該對象,每次修改你做就可以了,它反映到該對象,您都引用。例如

class MyClass 
{ 
    int X; 
} 

static class Program 
{ 
    static void Main(string args[]) 
    { 
     MyClass a = new MyClass(); 
     a.X = 40; 
     Method1(a); 
     Method2(a); 
     Console.WriteLine(a.X.ToString()); // This will print 32 
    } 

    static void Method1(MyClass c) 
    { 
     c.X = 10; 
    } 

    static void Method2(MyClass c) 
    { 
     c.X = 32; 
    } 
} 

你甚至可以使用refs編輯方法

基本上你誤解的「範圍」的概念裏面的變量,因爲你的問題是「該變量的類型存在」(全局/靜態/本地等)。你想知道範圍的是這樣的:局部變量只存在於定義它的地方。

我希望這給你一些建議。答案肯定不完整,但可以給你一個想法。

嘗試更加具體,所以我可以改變我的答案。

答案編輯1:

不,你不能在你想要的方式改變一個變量,你必須將它添加到類(在這種情況下計劃),試着加入:

class Program 
{ 
    static int number; 
    .... 
} 

很明顯,你應該刪除Main方法中的一個。

還要注意的是INT不能被修改(除了沒有REF)的函數裏面,如果你將它們作爲參數,因爲它們被複制。

原因很簡單:對Class實例的引用(至少)與int的大小相同(如果我們講的是32/64位系統),所以需要同時複製它或引用它。

可以return從方法的價值,你做了之後你的計算,如果你想,像這樣:

int x = 3; 
x = DoSomethingWithX(x); 

int DoSomethingWithX(int x) 
{ 
    x += 30; 
} 
+0

啊,是的,謝謝我認爲你已經回答了我的問題。我無法使用局部變量以外的其他任何東西。我嘗試了以前的建議(MyClass.MyVariable = 234;),但我認爲它給了我一個關於創建一個新對象的錯誤消息,沿着這些線。它可能是語法。謝謝,這很有用。 – Brad 2011-12-23 03:07:36

+0

類實例[通過引用傳遞](http://stackoverflow.com/questions/2027/pass-by-reference-or-pass-by-value),'ref'關鍵字是多餘的。 – 2011-12-23 03:11:44

+0

@Brad:如果你需要別的東西讓我知道,我不能更具體,因爲我沒有完全明白你想要什麼。 **沒有看到您的編輯,請讓我在問題**中回答。Devendra:我沒有具體說明他爲什麼要使用ref,這就是爲什麼我給他們鏈接的原因。 – 2011-12-23 03:20:01