学习C#和方法中的对象让我很困惑

时间:2013-02-11 23:33:45

标签: c# .net

我确信这个问题已经得到了回答,但经过一个小时的不断搜索,我仍然很困惑 我正在学习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的范围内。但是如果我想在表单加载上创建一堆对象呢?我应该在方法之外创建对象吗?或者我是否需要以某种方式将这些标记为全局对象?

谢谢。

6 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分: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();

中使用此功能

答案 2 :(得分: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....

    }
}

答案 3 :(得分:0)

可以使用像这样的全局变量:

public class Program...

    int a;

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

此类中的所有方法现在都可以访问变量a。

答案 4 :(得分:0)

是的,您需要在方法之外声明这些对象;因此,将范围设置为全局。

把它放在方法之外:

位图Bmp1;

然后用以下方法替换方法中的代码:

Bmp1 =新位图(320,226);

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

答案 5 :(得分: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
    }
}