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

本文关键字:对象 方法 学习 | 更新日期: 2023-09-27 17:58:40

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

谢谢。

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

一种选择是将该对象作为成员变量,另一种选择则是将其注入您的方法:

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

所有关于scope的答案都是正确的,我不想再让您感到困惑,但这将是对扩展类的极好使用。扩展允许您从解决方案中的任何位置(具有访问权限)对任何位图调用方法。

开始向项目中添加一个名为what的公共静态类。然后添加一个返回System.Drawing.Bitmap并接受System.Drawing.位图参数的静态方法。将代码放入方法中。使用扩展方法类似于使用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(); 中使用此功能

将变量创建为父类的属性/字段,这样您就可以得到类似的结果。

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

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

public class Program...
    int a;
    void Method1() ...
    void Method2() ...

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

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

把这个放在方法之外:

位图Bmp1;

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

Bmp1=新位图(320226);

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

您是对的,作用域阻止您从函数外部访问该对象。如果你有多个像你说的可能发生的图像,你可以做以下操作:

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