4

この質問はすでに回答されていると確信していますが、1時間の絶え間ない検索の後でも、私はまだ非常に混乱しています.
私は 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....

    }

ビットマップ オブジェクト「Bmp1」を作成し、次に pushPixels() でそのオブジェクトに変更を加えたいと考えています。
問題は、「名前 'Bmp1' が現在のコンテキストに存在しない」ため、メソッド pushPixels が不平を言うことです。

問題は基本的にここの範囲だと思います。オブジェクト Bmp1 がメソッド InitializeBMPObjects のスコープ内にのみ存在すること。しかし、フォームの読み込み時に一連のオブジェクトを作成したい場合はどうすればよいでしょうか。メソッドの外でオブジェクトを作成する必要がありますか? それとも、何らかの方法でこれらをグローバル オブジェクトとしてフラグを立てる必要がありますか?

ありがとうございました。

4

6 に答える 6

6

1 つのオプションは、そのオブジェクトをメンバー変数にすることです。別のオプションは、それをメソッドに挿入することです。

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.
}
于 2013-02-11T23:37:07.573 に答える
2

スコープに関するすべての回答は正しいので、これ以上混乱させたくはありませんが、これは拡張クラスの優れた使用方法です。拡張機能を使用すると、ソリューションのどこからでも (アクセスできる)、任意のビットマップでメソッドを呼び出すことができます。

まず、プロジェクトに任意の名前の public static クラスを追加します。次に、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();

于 2013-02-12T00:04:54.313 に答える
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....

    }
}
于 2013-02-11T23:36:33.463 に答える
0

次のようにグローバル変数を使用します。

public class Program...

    int a;

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

このクラスのすべてのメソッドは、変数 a にアクセスできるようになりました。

于 2013-02-11T23:37:28.117 に答える
0

はい、これらのオブジェクトはメソッドの外で宣言する必要があります。したがって、スコープをグローバルに設定します。

これをメソッドの外に置きます:

ビットマップ Bmp1;

次に、メソッド内のコードを次のように置き換えます。

Bmp1 = 新しいビットマップ (320, 226);

グローバルに宣言された同じメソッドが 1 つのメソッドでインスタンス化され、残りのメソッドで使用できることに注意してください。

于 2013-02-11T23:38:20.047 に答える
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
    }
}
于 2013-02-11T23:38:52.107 に答える