Lấy đoạn mã sau, Resharper cho tôi biết rằng voicesSoFar
và voicesNeededMaximum
làm cho "quyền truy cập vào một đóng cửa đã sửa đổi". Tôi đọc về những điều này nhưng những gì tôi câu đố ở đây là Resharper cho thấy sửa lỗi này bằng cách giải nén các biến ngay trước truy vấn LINQ. Nhưng đó là nơi họ đã có!Mã này có thực sự gây ra sự cố "truy cập vào đóng cửa đã sửa đổi" không?
Trình chia sẻ lại ngừng khiếu nại nếu tôi chỉ thêm int voicesSoFar1 = voicesSoFar
ngay sau int voicesSoFar = 0
. Có một số logic lạ tôi không hiểu rằng làm cho đề nghị của Resharper chính xác? Hoặc là có một cách để an toàn "truy cập đóng cửa sửa đổi" trong trường hợp như thế này mà không gây ra lỗi?
// this takes voters while we have less than 300 voices
int voicesSoFar = 0;
int voicesNeededMaximum = 300;
var eligibleVoters =
voters.TakeWhile((p => (voicesSoFar += p.Voices) < voicesNeededMaximum));
Tôi tắt cảnh báo Resharper này. Bạn chắc chắn phải cẩn thận khi sửa đổi các biến bị bắt, nhưng đây là một trong những nơi mà một sự hiểu biết tốt về ngôn ngữ này sẽ vượt trội hơn sau một quy tắc rote. Có một lý do C# cho phép điều này - nó rất hữu ích. –