为什么在完成的事件中,我在计数时得到的值为1?

时间:2017-01-14 21:29:17

标签: c# .net winforms

首先在backgroundworker完成的活动中

numberoffiles = ExtractImages.imagesUrls.Count();

变量numberoffiles值是18我在行上使用断点:

long bytesFromCompletedFiles = 0;
        private async void Completed(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                MessageBox.Show("Download has been canceled.");
            }
            else
            {
                if (e.Error == null)
                {
                    ProgressBar1.Value = 100;
                    count++;
                    bytesFromCompletedFiles += totalBytes[count - 1];
                    label9.Text = numberoffiles--.ToString();
                    await DownloadFile();
                    if (progressBar2.Value == 100)
                    {
                        label7.Text = "Download completed";
                        btnDownload.Enabled = true;
                        Reset();
                        if (israelDownload == false)
                        {
                            string[] list = Directory.GetFiles(countriesMainPath + "\\" + currentDownloadCountry,
             "*infrared*.jpg");
                            sorted = list.Select(x => new {
                                Item = x,
                                Number = int.Parse(Regex.Match(x, "[0-9]+").Value)
                            })
               .OrderBy(x => x.Number).Select(x => x.Item).ToArray();
                            timer1.Enabled = true;
                        }
                    }
                }
                else
                {
                    string error = e.UserState.ToString();
                }
            }
            sw.Stop();
        }

然后在webclient完成事件:

class GifsController < ApplicationController

def index
    if params[:tag]
        @gifs = Gif.tagged_with(params[:tag])
    elsif params[:search]
        @gifs = Gif.search(params[:search])
    else
        @gifs = Gif.all
    end
end

def show
    @gif = Gif.find(params[:id])
end

def new
    @gif = Gif.new
end

def create
    @gif = Gif.new(gif_params)

    @gif.save
    redirect_to @gif
end

private
def gif_params
    params.require(:gif).permit(:title, :link, :recipe, :all_tags, ingredients_attributes: [:id, :name, :_destroy], directions_attributes: [:id, :step, :_destroy])
end

end

imagesUrls is List包含18个项目。

我在做numberoffiles - .toString() 我最后看到我在硬盘上有18个文件。 但是numberoffiles中的值实际上是我在label9中看到的值是1 我希望它为0.计算出了问题。

1 个答案:

答案 0 :(得分:2)

在numberoffiles - .toString()到label9.Text的赋值期间,该值仍为1.该值仅在赋值后递减,因为您使用了postfix减量操作。

-- Operator (C# Reference)

  

递减运算符( - )将其操作数递减1.递减运算符可以出现在其操作数之前或之后: - 变量和变量 - 。

     

第一种形式是前缀减量操作。操作的结果是操作数的值“在”之后递减。

     

第二种形式是后缀减量操作。操作的结果是操作数“之前”的值已经减少。

Postfix减量操作(您的情况):

int counter = 1;
string text = counter--.ToString(); // text = 1

前缀递减操作(你应该使用的):

int counter = 1;
string text = (--counter).ToString(); // text = 0

所以在你的情况下它应该是:

label9.Text = (--numberoffiles).ToString();

尽管如此,我宁愿将减量和赋值操作拆分为单独的行,以提高可读性。

增加值:前缀和后缀减少的文本为0:

int counter = 1;
counter--;
string text = counter.ToString(); // text = 0