2009-08-19 1 views
25

Tôi đã thấy nó nói trong các câu hỏi khác mà cú pháp truy vấn LINQ biên dịch thành một Lambda.Tại sao bạn không thể chỉnh sửa và tiếp tục gỡ lỗi khi có biểu thức Lambda trong phương thức?

Vậy tại sao bạn không thể chỉnh sửa và tiếp tục khi có biểu thức Lambda trong phương thức, trong khi ký hiệu truy vấn bạn có thể?

Thú vị nhất, và nghiêm túc làm cho tôi cân nhắc việc chuyển sang sử dụng ký hiệu truy vấn ở mọi nơi, là ngay cả khi mã của bạn không có trong Lambda, nhưng có một Lambda ở một nơi khác trong cùng một phương pháp, bạn không thể chỉnh sửa và tiếp tục! Đó là, giống như, đau đớn vô cớ gây ra khi các nhà phát triển không tự nguyện!

+0

Đồng ý. Tôi đã sử dụng chỉnh sửa và tiếp tục rất nhiều nhưng bây giờ tôi đã sử dụng lambdas rất nhiều, nó đã giết chết tính năng đó. –

+1

bản sao có thể có của [Tại sao tôi không thể chỉnh sửa phương thức chứa phương thức ẩn danh trong trình gỡ lỗi?] (Http://stackoverflow.com/questions/581967/why-can-i-not-edit-a-method-that -contains-an-anonymous-method-in-the-debugger) – nawfal

+1

Đối với những người đọc trong năm 2016, bạn CÓ THỂ làm điều này ngay bây giờ trong VS2015. Vẫn còn một số hạn chế, nhưng dần dần họ đã làm rất tốt. – matrixugly

Trả lời

20

Chỉnh sửa và tiếp tục có thể thay đổi cách triển khai phương pháp "hoạt động", nhưng không thay đổi trường nào thuộc loại.

Biểu thức Lambda (và các phương thức ẩn danh) có thể sẽ tạo ra các kiểu riêng của riêng chúng khi chúng nắm bắt các biến. Thay đổi biểu thức lambda có thể thay đổi các loại có liên quan, điều này sẽ phá vỡ chỉnh sửa và tiếp tục.

Nghe có vẻ như nó nên có thể tạo ra thay đổi mã mà không có tác động này, nhưng tôi nghi ngờ nó chỉ đơn giản là dễ dàng hơn để ngăn chặn nó hoàn toàn - đó cũng có nghĩa là bạn không bắt đầu làm thay đổi và sau đó thấy rằng bạn bị ngăn chặn một nửa thông qua thay đổi của bạn.

(Cá nhân tôi không phải là một fan hâm mộ của E & C ở nơi đầu tiên, vì vậy tôi đã không bao giờ nhận thấy nó.)

+4

Cảm ơn. Tại sao bạn không thích E & C? Bạn làm gì thay vào đó? –

+9

Tôi thích sử dụng các bài kiểm tra đơn vị. Sau đó, tôi không cần phải lo lắng về việc khởi động lại - có nghĩa là tôi luôn sử dụng mã mới từ đầu đến cuối. –

+0

Giải thích tốt, cảm ơn –

0

Tôi không biết chắc chắn, nhưng tôi đoán là sự phức tạp xung quanh tìm những gì cần phải thay đổi khi có các biến cục bộ liên quan được nâng lên các lớp. Tôi đoán rằng tìm ra những thay đổi sẽ được an toàn và những gì sẽ không được coi là phức tạp và dễ bị lỗi để có được quyền vào thời điểm này. Các công cụ trong năm 2010 tập trung xung quanh luồng và giao diện người dùng mới - có lẽ chúng tôi sẽ nhận được nó trong phiên bản tiếp theo.

+0

tại sao? miễn là bạn không gỡ lỗi chính phương pháp này, bạn sẽ nghĩ rằng một số IL mới sẽ được phát ra và JIT sẽ làm điều đó khi cần. Nó không giống như, nói C + +, nơi E & C hoạt động ngay cả khi bạn nghĩ rằng nó đã làm việc chăm chỉ hơn. – gbjbaanb

0

Tôi không biết chắc chắn, nhưng tôi cho rằng nó phải làm với cách trình biên dịch chuyển đổi các biểu thức lambda tạo thành các bao đóng thành các lớp được tạo ra bởi trình biên dịch. Có lẽ không có cách nào (dễ) để áp dụng các thay đổi được thực hiện cho mã được biên dịch và bảo toàn trạng thái hiện tại.