2008-12-21 14 views
5

Phương pháp sau không biên dịch. Visual Studio cảnh báo "Không thể sử dụng tham số ngoài trong một phương thức ẩn danh". Phương pháp WithReaderLock(Proc action) mất delegate void Proc().Làm cách nào để tránh sử dụng tham số ngoài trong khối phương thức ẩn danh?

public Boolean TryGetValue(TKey key, out TValue value) 
{ 
    Boolean got = false; 
    WithReaderLock(delegate 
    { 
     got = dictionary.TryGetValue(key, out value); 
    }); 
    return got; 
} 

Cách tốt nhất để có được hành vi này là gì? (Vui lòng không cung cấp lời khuyên về từ điển chủ đề an toàn, câu hỏi này nhằm giải quyết vấn đề tham số ngoài).

Trả lời

11
public bool TryGetValue(TKey key, out TValue value) 
{ 
    bool got = false;    
    TValue tmp = default(TValue); // for definite assignment 
    WithReaderLock(delegate 
    { 
     got = dictionary.TryGetValue(key, out tmp); 
    }); 
    value = tmp; 
    return got; 
} 

(sửa - lỗi nhỏ)

Đối với thông tin, trong .NET 3.5 bạn có thể muốn sử dụng Action đại biểu thay vì cán của riêng bạn, vì mọi người sẽ nhận ra nó nữa. Ngay cả trong 2.0, có rất nhiều đại biểu void Foo(): ThreadStart, MethodInvoker, vv - nhưng Action là dễ nhất để làm theo ;-p

+0

Xin lỗi vì sự trục trặc trong phiên bản gốc; cố định –

+0

Tôi thấy 'đại biểu void Action (T obj)' trong .NET 2.0, nhưng điều đó hoạt động _on_ một đối tượng. Tôi cần hoạt động _around_ một hành động. Do đó, 'đại biểu void Proc()'. Tôi có thể đặt tên cho nó là 'delegate void Action()' để nhất quán. –

1

Câu trả lời đơn giản là chỉ sao chép logic bên trong phương thức. Nhưng sau đó chúng tôi kéo dài nguyên tắc DRY và phải duy trì hành vi bên trong cả hai phương pháp.

public Boolean TryGetValue(TKey key, out TValue value) 
{ 
    internalLock.AcquireReaderLock(Timeout.Infine); 
    try 
    { 
     return dictionary.TryGetValue(key, out value); 
    } 
    finally 
    { 
     internalLock.ReleaseReaderLock(); 
    } 
}