2013-02-11 32 views
4

我相信這個問題已經得到了回答,但經過一個小時的不斷搜索,我仍然很困惑。
我正在學習C#並習慣了事情的工作方式,但讓我感到困惑的一件事是如何讓對象創建的方法可用於其他方法。
我正在開發一些可以完成圖像工作的應用程序。我想在表單加載時創建程序使用的對象,然後用另一種方法對其進行更改。看起來很簡單。下面的代碼的裸位:學習C#和方法內的對象令我困惑

private void Form1_Load(object sender, EventArgs e) 
    { 
     InitializeBMPObjects(); 

    } 

    public void InitializeBMPObjects() 
    { 
     Bitmap Bmp1 = new Bitmap(320, 226);   

    } 


    public void pushPixels() 
    { 
     Graphics g = Graphics.FromImage(Bmp1); 
     //Do some graphics stuff.... 

    } 

我想創建位圖對象「BMP-1」,那麼我想pushPixels()來修改該對象。
問題是,方法pushpixels抱怨,因爲「名稱'bmp1'不存在於當前的上下文中」

我相信問題基本上在這裏範圍。對象Bmp1只存在於方法InitializeBMPObjects的範圍內。但是如果我想在表單加載上創建一堆對象呢?我應該在方法之外創建對象嗎?或者我需要以某種方式將這些標記爲全局對象?

謝謝。

+2

你應該閱讀有關[適用範圍](http://msdn.microsoft.com/en-us/library/aa691132(V = vs.71)。 aspx) – xdumaine 2013-02-11 23:37:45

+1

您可以將這些對象作爲[*結果值*的方法](http://msdn.microsoft.com/en-us/library/ms173114.aspx)返回以從其他地方的方法本地作用域中獲取它們,或將它們存儲在[* fields *](http://msdn.microsoft.com/en-us/library/ms173118.aspx)中,以使它們可用於對象的所有方法。 (一般來說,如果您遇到這樣的基本問題,我建議您閱讀整個C#編程指南或其他介紹性文章。) – millimoose 2013-02-11 23:38:54

回答

6

一種選擇是創建該對象的成員變量,另一種是將其注入到你的方法:

public void InitializeBMPObjects() 
{ 
    Bitmap Bmp1 = new Bitmap(320, 226); 
    pushPixels(Bmp1);//bmp1 accessible only to pushPixels in this case 
} 
public void pushPixels(Bitmap bmp1) 
{ 
    Graphics g = Graphics.FromImage(Bmp1); 
    //Do some graphics stuff.... 
} 

或..

public class YourClass 
{ 
    private Bitmap bmp1 = new Bitmap(320,226) ; 
    //this makes bmp1 accessible to all member methods. 
} 
+0

這很棒。謝謝你的信息。 – EtanSivad 2013-02-12 15:34:27

1

針對父類創建變量作爲屬性/字段,所以最終會出現類似的情況。

public class MyClass 
{ 
    private Bitmap _myImage; 

    public void InitializeBMPObjects() 
    { 
     _myImage = new Bitmap(320, 226); 
    } 

    public void pushPixels() 
    { 
     Graphics g = Graphics.FromImage(_myImage); 
     //Do some graphics stuff.... 

    } 
} 
0

人們會使用像全局變量所以:

public class Program... 

    int a; 

    void Method1() ... 
    void Method2() ... 

此類中的所有方法現在都可以訪問變量a。

0

是的,你需要在方法之外聲明這些對象;從而將範圍設定爲全球範圍。

把這個外面的方法:

Bitmap Bmp1;

然後與此替換代碼在你的方法:

BMP1 =新位圖(320,226);

請注意,全局聲明的相同方法現在在一種方法中實例化,其餘方法可用。

0

您是對的,範圍阻止您從函數外部訪問該對象。如果你有多個圖片像你說的,可能會發生,你可以做到以下幾點:

List<Bitmap> bitmapList = new List<Bitmap>(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    InitializeBMPObjects(); 

} 

public void InitializeBMPObjects() 
{ 
    Bitmap Bmp1 = new Bitmap(320, 226); 
    bitmapList.Add(Bmp1); 

} 


public void pushPixels() 
{ 
    foreach(Bitmap bmp in bitmapList) 
    { 
     //do stuff here 
    } 
} 
2

所有關於範圍問題的答案是正確的,我不希望更多的迷惑你,但是這將是一個很好用的extension類。擴展允許您在解決方案中的任何位置(可以訪問)在任何位圖上調用您的方法。

要開始添加一個公共靜態類,它命名爲您想要的項目。然後添加一個返回System.Drawing.Bitmap並接受System.Drawing.Bitmap參數的靜態方法。將你的代碼放入方法中。使用擴展方法類似於使用ToString()方法。

public static class MyExtensions 
{ 
    public static System.Drawing.Bitmap PushPixels(this System.Drawing.Bitmap bitmap) 
    { 
     //do stuff here 
     return bitmap; 
    } 
} 

要使用此代碼中的System.Drawing.Bitmap newBitmap = Bmp1.PushPixels();