【问题标题】:Use instantiated object from other method使用其他方法的实例化对象
【发布时间】:2016-01-02 18:20:29
【问题描述】:

关于 oop 的一些东西我还不能理解! 可能已经有人问过了,但我找不到,我发现的唯一例子是关于使用单例,但这不是建议的方法。

假设这是我的主要代码:

private void main()
{
    Process task1 = null;
    task1 = new Process();
    task1.StartInfo.FileName = something.bat;
    task1.StartInfo.Arguments = string.Format("10");
    task1.StartInfo.CreateNoWindow = false;
    task1.Start();
    task1.WaitForExit();
    Update();
}

然后在另一种方法中,我需要重新调用已经使用过的同一个对象:

private static void Update()
{
    task1.Start();
    task1.WaitForExit();
}

这段代码可能有错误,但我只需要了解实例概念即可。

请任何人帮忙?

谢谢,新年快乐

【问题讨论】:

  • 为什么不把它作为参数传递给Update方法?
  • 你是什么意思?你能举个例子吗?因为相信我..我很努力..但是从一个方法到另一个方法传递值并不是我能轻易做到的......!
  • 了解/了解变量Scope

标签: c# oop object instance


【解决方案1】:

在两个函数之外全局声明和实例化它,那么你应该可以使用同一个对象,

Process task1 = null;
task1 = new Process();

private void main()
{
     task1.StartInfo.FileName = something.bat;
     ............
}

private void Update()
{
   task1.Start();
   task1.WaitForExit();
}

或者您可以将变量传递给您的更新方法

void main()
{
            Process task1 = null;
            task1 = new Process();
            task1.StartInfo.FileName = something.bat;
            task1.StartInfo.Arguments = string.Format("10");
            task1.StartInfo.CreateNoWindow = false;
            task1.Start();
            task1.WaitForExit();
            Update(task1);
}

在更新方法中

private void update(Process taskin)
{
   taskin.Start();
   taskin.WaitForExit();
}

【讨论】:

  • 我刚试过,但它似乎对我不起作用....我不明白我在做什么错误也许....谢谢你的回答
  • 实际上就像你说的那样......它只在更新方法中工作......而不是在主要方法中......嗯......奇怪。
  • 是...我得到错误 1 ​​'ConsoleApplication1.Program.avvisotask' 和 'ConsoleApplication1.Program.avvisotask' 之间的歧义 c:\users\utente\documents\visual studio 2013\Projects\ConsoleApplication1\ ConsoleApplication1\Program.cs 21 13 原谅我...我将大部分内容翻译成英文以使其更清晰....所以 avvisotask 是 task1。
  • 我非常喜欢您使用的第二种方式.....也有人发布但后来被删除了....非常感谢....这是继续的好方法吗?
  • 是的,你就是这样使用同一个变量
【解决方案2】:

回答您有关实例概念的问题。它更多的是关于变量的范围而不是实例概念。

private void main()
{
    Process task1 = null;
    task1 = new Process();
    task1.StartInfo.FileName = something.bat;
    task1.StartInfo.Arguments = string.Format("10");
    task1.StartInfo.CreateNoWindow = false;
    task1.Start();
    task1.WaitForExit();
    Update();
}

在上面的代码中,Process task1 = null; 初始化变量,然后您在下一行通过task1 = new Process(); 设置它,就像您在void Main() 方法中执行此操作一样,现在这些变量的范围仅限于此方法。

Update() 方法是一个完全独立的方法,无法看到在Main() 方法中初始化的变量。如果您需要一个将在同一类的许多方法中使用的变量,sajeetharan 的答案是正确的,我会补充说,在您的情况下,如果可能,请尝试声明一个私有字段。

要了解有关范围的更多信息,请查看 - Variables and method scopes in .Net

【讨论】:

  • 谢谢普瑞特!我认为有一种更简单的方法可以从全局对象实例化变量!我想更简单的方法是使用全局静态变量......但是如果你想对旧代码做点什么,那就没那么容易了......!非常感谢!
【解决方案3】:

如果您只想在整个代码中对单个对象进行操作,则可以使用 Singleton 类:

public class SingleProc
{
  private static SingleProc instance;
  private SingleProc() { }
  public Process Proc { get; set; }
  public static void RunTillExit()
  {
    Instance.Proc.Start();
    Instance.Proc.WaitForExit();
  }
  public static SingleProc Instance
  {
    get
    {
      if (instance == null)
      {
        instance = new SingleProc();
      }
      return instance;
    }
  }
}

设置属性:

SingleProc.Instance.Proc.StartInfo.FileName = "something.bat";
SingleProc.Instance.Proc.StartInfo.Arguments = string.Format("10");
SingleProc.Instance.Proc.StartInfo.CreateNoWindow = false;

以及您需要的任何地方:致电RunTillExit

SingleProc.RunTillExit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多