发送对变量的引用而不是它的值

时间:2012-07-06 15:03:56

标签: c# variables reference

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

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());
    }
}

4 个答案:

答案 0 :(得分:4)

这不是向来电者提供更新的好方法。

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

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

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

答案 1 :(得分:3)

将签名更改为:

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

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

答案 2 :(得分:2)

您可以使用

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)
{
  ....
}

答案 3 :(得分:1)

更好的方法可能是通过Action<int>委托来调用报告进度:

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事件。