【问题标题】:How do I use a variable declared in a method, outside that method?如何在该方法之外使用在方法中声明的变量?
【发布时间】:2012-07-10 20:06:23
【问题描述】:

我正在使用 VS 2008 (C#)...我在 GlobalClass 中创建了一个函数来全局使用它。这是为了打开一个对话框。当我在我的方法中调用此函数时,它可以工作,但我无法使用我在这里创建的对象“OFD”......

static class GlobalClass
{
 public static void OFDbutton()
  {
   OpenFileDialog ofd = new OpenFileDialog();
   ofd.Filter = "Image files|*.jpg;*.jpeg;*.png;*.gif";
   DialogResult dr = ofd.ShowDialog();
  }
}

在表单方法中。我正在使用

globalclass.ofdbutton(); //Calling the function
lable1.text=ofd.filename;

我想使用对象“ofd”,但我不能这样做.. 我该怎么办,请帮忙

【问题讨论】:

    标签: c# class object scope


    【解决方案1】:

    如何使用在方法中声明的变量,而不是该方法?

    你不能。您可以将声明移到方法之外。然后它成为包含类的字段

    但正如许多其他人所说,在这种情况下最好return 文件名。

    方法向外界“展示”的唯一内容是参数(它可能会改变它们引用的对象;或者如果它们是refout,则分配给它们)和返回值。

    【讨论】:

      【解决方案2】:

      您可能想要修改您的方法以实际返回文件名。

      类似

      public static string OFDbutton()
      {
          OpenFileDialog ofd = new OpenFileDialog();
          ofd.Filter = "Image files|*.jpg;*.jpeg;*.png;*.gif";
      
          if (ofd.ShowDialog() == DialogResult.OK)
              return ofd.Filename;
          else
              return string.Empty;
      }
      

      当然,这是一种非常幼稚的方法,您可能想了解一下变量范围和面向对象的设计。

      编辑:This answer 扩展了问题并改进了设计,考虑到用户可能在对话框本身中单击了取消。

      Edit2:从链接的答案中无耻地复制,我修改了自己的 sn-p。

      【讨论】:

        【解决方案3】:

        当您在方法中声明变量时,该变量的作用域就是该方法。

        如果您也希望能够在该方法之外使用该变量,您将有两个选择:

        返回变量:

            public static string OFDMethod()
            {
               using( var ofd = new OpenFileDialog() )
               {   
                   ofd.Filter = "Image files|*.jpg;*.jpeg;*.png;*.gif";
                   if( ofd.ShowDialog() == DialogResult.OK )
                   {
                       return ofd.Filename;
                   }
                   else
                   {
                        return string.Empty;
                   }
               }
            }
        

        或为该变量创建一个输出参数(在这种情况下我当然不喜欢)

            public static void OFDMethod(out string selectedFilename)
            {
               using( var ofd = new OpenFileDialog() )
               {   
                   ofd.Filter = "Image files|*.jpg;*.jpeg;*.png;*.gif";
                   if( ofd.ShowDialog() == DialogResult.OK )
                   {
                       selectedFilename = ofd.Filename;
                   }
                   else
                   {
                        selectedFilename = string.Empty;
                   }
               }
            }
        

        【讨论】:

          【解决方案4】:

          这样做 -

          static class GlobalClass
          {
              public static string OFDbutton()
              {
                  OpenFileDialog ofd = new OpenFileDialog();
                  ofd.Filter = "Image files|*.jpg;*.jpeg;*.png;*.gif";
                  DialogResult dr = ofd.ShowDialog();
                  return ofd.FileName;
              }
          }
          
          lable1.text = GlobalClass.OFDbutton();
          

          【讨论】:

            【解决方案5】:

            更改方法以返回文件名或对话框对象本身 或者将 openfiledialog 移到方法外的单独属性中

            【讨论】:

              【解决方案6】:

              我猜你想要的是什么

              static class GlobalClass
              {
               public static OpenFileDialog OFDbutton()
                {
                 OpenFileDialog ofd = new OpenFileDialog();
                 ofd.Filter = "Image files|*.jpg;*.jpeg;*.png;*.gif";
                 DialogResult dr = ofd.ShowDialog();
                 return ofd;
                }
              }
              

              返回OpenFileDialog 对象。现在你可以

              OpenFileDialog ofd = globalclass.ofdbutton(); //Calling the function
              label1.text=ofd.filename;
              

              【讨论】:

              • 谢谢,我正是在寻找这个......我正在返回 ofd,但我使用的返回类型是字符串,这就是我无法使用该对象的原因。根据我的项目要求,我需要对象“ofd”作为一个整体,而不是单独的 ofd.filename........
              • @Jain 您显示的代码只使用了ofd.Filename,这就是为什么大多数人都只返回ofd.Filename。你永远不应该返回超过你需要的东西。尚不清楚您是否需要更多,但您找到了适合您的解决方案是件好事。 =)
              猜你喜欢
              • 2020-09-01
              • 2023-04-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-17
              • 1970-01-01
              相关资源
              最近更新 更多