Khai báo các biến trả về trong các phương thức c # so với trả về giá trị trực tiếp


16

Trong một cuộc tranh luận liên quan đến các biến trả về, một số thành viên của nhóm thích một phương thức trả kết quả trực tiếp cho người gọi, trong khi những người khác thích khai báo một biến trả về sau đó được trả về cho người gọi (xem ví dụ mã bên dưới)

Đối số sau này là nó cho phép nhà phát triển gỡ lỗi mã tìm giá trị trả về của phương thức trước khi trả về cho người gọi, do đó làm cho mã dễ hiểu hơn: Điều này đặc biệt đúng khi các lệnh gọi phương thức được nối tiếp.

Có bất kỳ hướng dẫn nào là hiệu quả nhất và / hoặc có bất kỳ lý do nào khác tại sao chúng ta nên áp dụng một phong cách hơn một phong cách khác không?

Cảm ơn

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
Cả hai ví dụ sẽ biên dịch thành IL giống hệt nhau. Lý do duy nhất bạn muốn ví dụ thứ hai là cho mục đích gỡ lỗi hoặc nếu bạn cần sử dụng resulttrước khi trả lại.
ChrisF

1
Một lý do khác là vì bạn cần phải làm một cái gì đó khác giữa việc tính toán kết quả và trả lại nó.
tdammers

1
@ChrisF, trên thực tế họ không biên dịch với cùng IL cho tôi (có thêm stloc.0ldloc.0trong phiên bản thứ hai). Nhưng tôi nghĩ điều đó chỉ xảy ra trong chế độ Gỡ lỗi. Và dù sao nó cũng không thực sự quan trọng.
Svick

@svick - OK - Tôi nên đã thêm "trong chế độ phát hành";)
ChrisF

1
Vì bạn có thể và đôi khi nên (vì lợi ích của sự ngắn gọn) viết một cái gì đó trông giống như: a = b = c;a == b == c, tôi sẽ tránh viết một cái gì đó trông giống như a = b == cnếu bạn có thể. Khi tôi lần đầu tiên nhìn thấy một dòng mã như vậy, tôi phải mất vài giây để tìm hiểu chuyện gì đang xảy ra. Mã đó nổi bật. Tôi muốn tát dấu ngoặc đơn xung quanh a == 3, nhưng StyleCop không thích nó - một lý do chính đáng để sử dụng phiên bản số một. Một cái gì đó khác: đây thực chất là một lambda, chẳng hạn như a => (a == 3). Tại sao thêm một dòng mã vào một hàm tầm thường đã bị cồng kềnh?
Công việc

Câu trả lời:


7

Bởi vì tôi sử dụng Resharper với Visual Studio, Ctrl-RV (Hoặc Ctrl-Alt-V, nếu bạn sử dụng các ràng buộc phím Resharper / IntelliJ) sẽ biến ví dụ đầu tiên của bạn thành ví dụ thứ hai. Vì vậy, khi tôi muốn gỡ lỗi, tôi có thể làm điều đó đủ dễ dàng. Và nếu tôi quên đặt lại thì tôi sẽ không cảm thấy tệ vì Ctrl-RI sẽ đặt nó trở lại một lần nữa để dễ đọc hơn.

Nghiêm túc, lãng phí thời gian của bạn để tranh luận về những điều quan trọng hơn. Giống như nơi để đặt dấu ngoặc nhọn hoặc khoảng trắng hàng đầu của bạn so với các tab.


5
Tôi thích các cuộc tranh luận của tôi là về các nhân vật vô hình ...
ChaosPandion

Mẹo tuyệt vời, các bạn! Bây giờ chúng ta có thể liên tục tái xác định mã của nhau nhanh hơn nhiều so với trước đây. Nó có thể sẽ tiết kiệm nhiều thời gian hơn so với thực tế thảo luận về nó! :)
pb01

@pdr rằng ctrl + RV chỉ hoạt động với chia sẻ lại? hoặc nó là một số loại keybind tùy chỉnh? nó không làm việc cho tôi
Jane Doe

@JaneDoe: Tôi choáng váng khi thấy rằng đó là tái cấu trúc Resharper và VS không có tương đương. Trả lời đúng. Xin lỗi vì điều đó.
pdr

@ChaosPandion U + 200B cho chiến thắng!
Jesse C. Choper

18

Cá nhân tôi thấy ví dụ đầu tiên dễ đọc hơn. Bạn vẫn có thể gỡ lỗi nó, bằng cách đặt điểm dừng trong câu lệnh return và thêm a == 2vào cửa sổ đồng hồ hoặc bằng cách sử dụng đồng hồ nhanh.

Nhưng đây thực sự là một vấn đề sở thích cá nhân. Cả hai phiên bản đều ổn.


8
+1 quyền khó hơn để đọc mã để làm cho việc đặt điểm dừng dễ dàng hơn là thực hiện sai cách làm tròn imho
jk.

Cửa sổ xem hoặc cửa sổ trung gian không phải lúc nào cũng là giải pháp cho vấn đề này, vì đôi khi biểu thức yêu cầu luồng chạy.
JustAntherUserYouMayKnowOrNot 17/03 '

@JustAntherUserYouMayKnowOrNot: Có. Ngoài ra còn có khả năng in một thông báo vào cửa sổ gỡ lỗi từ trong một điểm dừng. Nhấp chuột phải vào điểm dừng và chọn "Khi nhấn ...".
Olivier Jacot-Descombes 17/03/13

Ngoài ra biểu thức có thể có tác dụng phụ, chạy lại nó có thể dẫn đến các vấn đề. Tốt hơn gắn bó với kết quả var.
JustAntherUserYouMayKnowOrNot 18/03 '

9

Khi mã dễ đọc như ví dụ của bạn, không có gì sai khi trả về kết quả của một hoạt động logic như return a == 2. Tuy nhiên, nếu giá trị trả về là một câu lệnh phức tạp hơn hoặc trông giống như

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

sau đó bạn sẽ muốn sử dụng các biến để lưu trữ các phần đó trước và đơn giản hóa câu lệnh return, để dễ đọc.


2

Trong một ví dụ đơn giản như vậy, một trong hai là OK.

Đối với các ví dụ phức tạp hơn, tôi thích cách thứ hai. Đó chỉ là vì nó dễ đọc hơn và những người khác có thể sẽ phải duy trì mã.


Chỉ khi có một tên biến tốt hơn result, nó tự nó là một định danh hoàn toàn không mô tả và vô dụng.
Alexander - Tái lập Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.