C# 如何在代码块之外使用变量

0 c#

我有以下代码。我想在代码块之外使用 pictureBox1.Image = image,如下所示:

private void button1_Click(object sender, EventArgs e) {

  using(MemoryStream memoryStream = new MemoryStream()) {
    pic.Image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
    byte[] imageBytes = memoryStream.ToArray();
  }

  Image image = Image.FromStream(memoryStream);
  pictureBox1.Image = image;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:当前上下文中不存在名称“memoryStream”。我知道我可以执行以下操作,将最后两行移到括号中并且代码可以工作,但是如何在 { } 代码块之外使用变量

我知道下面的代码可以工作,但我只想知道是否有办法在代码块之外使用 pictureBox1.Image = image 。

private void button1_Click(object sender, EventArgs e)
{
    using(MemoryStream memoryStream = new MemoryStream())
    {
        pic.Image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
        byte[] imageBytes = memoryStream.ToArray();
        Image image = Image.FromStream(memoryStream);
        pictureBox1.Image = image;
    }
}
Run Code Online (Sandbox Code Playgroud)

Val*_*ler 5

您不能也不应该在使用范围之外使用该流,之后它将被处置并且您不会遇到泄漏问题。

当您在作用域之前声明变量时,您可以在作用域之后分配值。

private void button1_Click(object sender, EventArgs e)
{
    Image image;
    using(MemoryStream memoryStream = new MemoryStream())
    {
        pic.Image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
        // byte[] imageBytes = memoryStream.ToArray(); //unused?
        image = Image.FromStream(memoryStream);
    }
    pictureBox1.Image = image;
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是创建一个函数来读取图像并返回它。

private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Image = readImage();
}

private Image readImage()
{
    using(MemoryStream memoryStream = new MemoryStream())
    {
        pic.Image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
        // byte[] imageBytes = memoryStream.ToArray(); //unused?
        return Image.FromStream(memoryStream);
    }
}
Run Code Online (Sandbox Code Playgroud)