4

我确信这个问题已经得到解答,但是经过一个小时的不断搜索,我仍然很困惑。
我正在学习 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() 对该对象进行更改。
麻烦的是,pushPixels 方法会抱怨,因为“当前上下文中不存在名称‘Bmp1’”

我相信这个问题基本上是这里的范围。Bmp1 对象只存在于 InitializeBMPObjects 方法的范围内。但是如果我想在表单加载时创建一堆对象怎么办?我应该在方法之外创建对象吗?还是我需要以某种方式将它们标记为全局对象?

谢谢你。

4

6 回答 6

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

关于范围的所有答案都是正确的,我不想让您更加困惑,但这将是扩展类的绝佳用途。扩展允许您从解决方案中的任何位置(具有访问权限)调用任何位图上的方法。

开始添加一个名为 whatever you want to your project 的公共静态类。然后添加一个返回 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);

请注意,全局声明的相同方法现在在一个方法中实例化,并且可供其余方法使用。

于 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 回答