0
だから私はこのようなコードを持っている:変更されたクロージャへのアクセス - これは推奨される修正プログラムですか?
int totalRequestsToSend = 0;
i = 1;
foreach (file in files)
{
try
{
// This can throw if adding request fails for some reason, e.g. file does not exist
requests.AddRequest(
new FileStoreRequest(file)
{
OnStoreConfirm = (file) =>
{
progress.Report((i*100)/totalRequestsToSend)
Interlocked.Increment(ref i);
}
}
);
totalRequestsToSend += 1;
}
catch(Exception e) {
// handle exception
}
}
ReSharperのは、私は、ラムダ内totalRequestsToSend使うラインについて「修正閉鎖へのアクセス」と文句を言います。期待と苦情が無視される可能性があるので、論理が働く
、しかし、ReSharperのの提案の修正の一つは、そうのような大きさ1の配列にint型の変数を変更します。
int[] totalRequestsToSend = {0};
i = 1;
foreach (file in files)
{
try
{
requests.AddRequest(
new FileStoreRequest(file)
{
OnStoreConfirm = (file) =>
{
progress.Report((i*100)/totalRequestsToSend[0])
Interlocked.Increment(ref i);
}
}
);
totalRequestsToSend[0] += 1;
}
catch(Exception e) {
// handle exception
}
}
これは、ReSharperのからの苦情が発生することはありません。私は困惑している。この場合、変数を使用するのとは異なる配列をどのように使用していますか?
ありがとうございました。
答えを見る[ここ](http://stackoverflow.com/questions/1688465/resharper-warning-access-to-modified-closure) – Jonesopolis
@ジョーンズポリスそれは閉鎖された変数について何も言わない配列にラップされているか、またはresharperがそのようなリファクタを提案する理由について説明します。もちろん、変更されたクロージャーへのアクセスは*この場合は*必要です。それは意図的ではありません。 – Servy
@セイビー私はあなたを怒らせることをした。私はもはや私の上を飛び越えずに文脈を追加するリンクを提供することさえできません。助けようとする試みのコメントです。 – Jonesopolis