【问题标题】:Send a reference to a variable instead of it's value发送对变量的引用而不是它的值
【发布时间】:2012-07-06 15:03:56
【问题描述】:

我有一个执行很长任务的函数,我想偶尔通过状态更新来更新其他地方的变量。 (如果有更好的方法可以做到这一点,那也很好)我正在编写一个库,并且该代码可能会一次调用多次,因此在同一个类中创建另一个变量来存储该变量不是一种选择。这是我的代码的样子:

public static bool Count(int Progress, int CountToWhat) {
    for (int i = 0; i < CountToWhat; i++) {
        Progress = CountToWhat / i; // This is how I'd like to update the value, but obviously this is wrong
        Console.WriteLine(i.ToString());
    }
}

【问题讨论】:

  • 您是否考虑过不将其设为静态?然后你可以在类中保留一个变量。

标签: c# variables reference


【解决方案1】:

这不是向呼叫者提供更新的好方法。

最好在类库中定义一个或多个事件(如OnErrorOnProgress 等)。 例如,当您想通知某个操作的进度时,您可以提出OnProgress

for (int i = 0; i < CountToWhat; i++) {
  OnProgress(CountToWhat / i);
  Console.WriteLine(i.ToString());
}

这是一种更好的方法,尤其是在从工作线程通知时。

【讨论】:

  • 如果静态事件处理程序对您的特定情况没有多大意义,您可以改为让该方法接受回调,例如public static bool Count(int Progress, int CountToWhat, Action&lt;int&gt; OnProgress)。这样它是本地范围的,而不是静态的。
  • @TimS.:当然,回调总是一个不错的选择,即使在非静态情况下也是如此。
  • 虽然我 +1 了“ref”答案,因为它们会起作用,但这是实现此结果的首选方法。
  • @Nate:不,我不能 +1 任何ref 的答案。这意味着您必须以某种方式从调用线程中轮询变量。丑陋的代码...
  • 谢谢你的回答,我以后一定会注意这个方法,但现在我只需要一些简单的东西。
【解决方案2】:

将签名改为:

public static bool Count(ref int Progress, int CountToWhat)

当你调用它时,在你作为第一个参数传入的变量之前使用 ref 关键字。

【讨论】:

  • 谢谢,这是最简单的解决方案。
【解决方案3】:

你可以使用

int Progress = 0;
public static bool Count(ref int Progress, int CountToWhat)
{
  ....
}

或者

int Progress; //without init
public static bool Count(out int Progress, int CountToWhat)
{
  ....
}

【讨论】:

  • 你是什么意思,“引用是用在类上而不是在原始类型上。”?此外,您可以使用 out/ref,但这不是唯一的方法。
  • 如果您使用 Class1 作为参数测试此方法,则 public void Test(Class1 value){...};您不需要将关键字添加为 ref 或 out,,, 就这样
  • 在某些情况下,在类上使用 ref/out 仍然是有目的的。无论如何,我的观点是,它的措辞很糟糕,而且按照目前的写法难以理解。
  • 这就是Servy,感谢您的帮助
【解决方案4】:

更好的方法可能是传递一个Action&lt;int&gt; 委托以被调用以报告进度:

public static bool Count(int CountToWhat, Action<int> reportProgress) 
{
    for (int i = 0; i < CountToWhat; i++) 
    {
        var progress = CountToWhat / i; 
        reportProgress(progress);
        Console.WriteLine(i.ToString());
    }
}

然后你会像这样使用它:

Count(100, p => currentProgress = p);

您还可以使用BackgroundWorker 类来运行您的长时间运行的任务,并利用它的ProgressChanged 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2011-06-14
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多