学习C#时,方法中的对象让我感到困惑。

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方法的范围内。但是,如果我想在窗体加载时创建一堆对象,我应该在方法外创建对象吗?还是需要以某种方式标记它们为全局对象?
谢谢。

2
你应该阅读关于作用域的内容。 - xdumaine
1
你可以将这些对象作为方法的结果值返回,以便在方法的本地范围之外获取它们,或者将它们存储在字段中,以便在对象的所有方法中都可以使用它们。(通常,如果你在基础知识方面遇到问题,我建议阅读整个C#编程指南或其他入门文本。) - millimoose
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.
}

2
关于作用域的所有答案都是正确的,我不想让你更加困惑,但这将是使用扩展类的绝佳用途。扩展允许您在解决方案中的任何地方(具有访问权限)调用位图方法。
首先,在项目中添加一个公共静态类,该名称可以自由命名。然后添加一个静态方法,返回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();

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

你说得对,作用域防止你从函数外部访问该对象。如果你有多个图像可能会出现,你可以采取以下措施:

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
    }
}

0

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

将此放在方法外:

Bitmap Bmp1;

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

Bmp1 = new Bitmap(320, 226);

请注意,先前在全局声明的同一方法现在在一个方法中被实例化并可供其他方法使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接