2014-05-13 14 views
8

Có cách nào khác để cập nhật tham số ref bên trong một phương thức ẩn danh không?Cập nhật tham số ref bên trong phương thức ẩn danh

Tôi biết rằng một phương pháp ẩn danh không cho phép truy cập vào tham số ref của phạm vi bên ngoài, nhưng có cách nào khác để làm điều đó không? Tôi đang sử dụng một thư viện bên ngoài cho MessageStream do đó không thể thay đổi các tham số của các đại biểu ...

void DoWork(ref int count) 
{ 
    MessageStream Stream = new MessageStream(); 
    Stream.MessageReceived += (o, args) => 
    { 
     //Error cannot use ref or out parameter inside anonymous method 
     count++; 
    }; 
} 
+0

Câu trả lời tùy thuộc vào việc bạn có thể chắc chắn 'Stream.MessageReceived' sẽ được nâng lên trước khi' DoWork' trả về hay không. Bạn có chắc chắn về điều đó không? – hvd

+0

bạn có biết ngữ cảnh không an toàn không? Nếu tôi không đăng câu trả lời với giải pháp này – faby

+0

@faby Tôi nghĩ tôi biết bạn đang nghĩ gì, và nếu tôi đúng, điều đó sẽ không hiệu quả. Nó sẽ * thường * làm việc, nhưng đôi khi nó sẽ thất bại, và không có cách nào để sửa nó để nó luôn hoạt động. – hvd

Trả lời

5

Trong trường hợp của bạn không có công việc xung quanh khả thi cho vấn đề này: vào thời điểm Stream.MessageReceived cháy sự kiện, count có thể nằm ngoài phạm vi của người gọi hàm DoWork của bạn.

Trong những tình huống như vậy, bạn nên đóng gói các count trong một đối tượng, và giữ một tham chiếu đến đối tượng đó trong cả xử lý sự kiện và người gọi, như thế này:

class Counter { 
    public int Value {get;private set;} 
    public void Increment() {Value++;} 
} 
void DoWork(Counter count) { 
    MessageStream Stream = new MessageStream(); 
    Stream.MessageReceived += (o, args) => { 
     count.Increment(); 
    }; 
} 
+0

Có thể khóa liên động.Khách hàng có thể hợp lý ở đây, tùy thuộc vào cách sử dụng. – Paddy

+0

Tôi nghĩ đây là cách duy nhất tôi có thể đạt được. Một chút sửa đổi mã theo thứ tự. Tôi đã hy vọng nó sẽ chơi tốt đẹp bằng cách nào đó. – jamos

1

Nếu bạn muốn có đại biểu cập nhật một biến từ một phạm vi outter, vượt qua một lambda đặt giá trị thay vì chuyển số bằng ref.

//shared var 
private static int _count = 0; 

//call your method 
DoWork(() => _count++); //instead of DoWork(ref _count); 


void DoWork(Action countInc) 
{ 
    MessageStream Stream = new MessageStream(); 
    Stream.Activated += (o, args) => countInc(); 
} 
Các vấn đề liên quan