学习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的作用域内。但是,如果我想在表单加载上创建一堆对象,该怎么办;我应该在方法之外创建对象吗?或者我需要以某种方式将这些标记为全局对象吗?
谢谢。
一种选择是将该对象作为成员变量,另一种选择则是将其注入您的方法:
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
}
}