การประกาศตัวแปรส่งคืนใน c # methods เทียบกับการคืนค่าโดยตรง


17

ในการถกเถียงเกี่ยวกับตัวแปรส่งคืนสมาชิกบางคนในทีมต้องการวิธีการส่งคืนผลลัพธ์โดยตรงไปยังผู้โทรในขณะที่คนอื่น ๆ ต้องการประกาศตัวแปรส่งคืนที่ส่งกลับไปยังผู้โทรแล้ว (ดูตัวอย่างโค้ดด้านล่าง)

อาร์กิวเมนต์หลังคืออนุญาตให้นักพัฒนาที่ทำการดีบั๊กโค้ดเพื่อค้นหาค่าส่งคืนของเมธอดก่อนที่มันจะส่งกลับไปยังผู้เรียกดังนั้นจึงทำให้โค้ดเข้าใจง่ายขึ้น: นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งที่การเรียกใช้เมธอดนั้น

มีแนวทางใดบ้างที่มีประสิทธิภาพมากที่สุดและ / หรือมีเหตุผลอื่นใดที่ทำให้เราควรนำสไตล์หนึ่งมาใช้กับสไตล์อื่น?

ขอบคุณ

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

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

11
ทั้งสองตัวอย่างจะรวบรวม IL ที่เหมือนกัน เหตุผลเดียวที่คุณต้องการตัวอย่างที่สองมีไว้สำหรับการดีบักหรือถ้าคุณต้องการใช้resultก่อนที่จะส่งคืน
ChrisF

1
อีกเหตุผลหนึ่งอาจเป็นเพราะคุณต้องทำอย่างอื่นระหว่างการคำนวณผลลัพธ์และส่งคืน
tdammers

1
@ChrisF ที่จริงแล้วพวกเขาไม่ได้รวบรวม IL เดียวกันสำหรับฉัน (มีเพิ่มเติมstloc.0และldloc.0ในรุ่นที่สอง) แต่ฉันคิดว่ามันจะเกิดขึ้นเฉพาะในโหมดดีบั๊ก และมันก็ไม่สำคัญจริงๆที่นี่
svick

@svick - ตกลง - ฉันควรจะเพิ่ม "ในโหมดการเปิดตัว";)
ChrisF

1
เนื่องจากคุณสามารถและบางครั้งควร (เพื่อประโยชน์ของความกะทัดรัด) เขียนสิ่งที่ดูเหมือน: a = b = c;และa == b == cฉันจะหลีกเลี่ยงการเขียนสิ่งที่ดูเหมือนว่าa = b == cถ้าคุณสามารถ เมื่อฉันเห็นรหัสบรรทัดแรกมันใช้เวลาไม่กี่วินาทีในการคิดว่าเกิดอะไรขึ้น รหัสนั้นโดดเด่น ฉันต้องการตบวงเล็บไปรอบ ๆa == 3แต่ StyleCop ไม่ชอบ - เป็นเหตุผลที่ดีที่จะใช้หมายเลขเวอร์ชันหนึ่ง อย่างอื่น: a => (a == 3)นี้เป็นหลักแลมบ์ดาเช่น ทำไมต้องเพิ่มรหัสลงในฟังก์ชั่นเล็ก ๆ น้อย ๆ ป่องแล้ว
งาน

คำตอบ:


7

เนื่องจากฉันใช้ Resharper กับ Visual Studio, Ctrl-RV (หรือ Ctrl-Alt-V หากคุณใช้การโยงคีย์ Resharper / IntelliJ) เปลี่ยนตัวอย่างแรกของคุณเป็นตัวอย่างที่สองของคุณ ดังนั้นเมื่อฉันต้องการตรวจแก้จุดบกพร่องฉันสามารถทำได้ง่ายพอ และถ้าฉันลืมใส่กลับไปฉันก็จะไม่รู้สึกแย่เพราะ Ctrl-RI จะใส่กลับไปอีกครั้งเพื่อให้อ่านง่ายขึ้น

อย่างจริงจังเสียเวลาโต้เถียงเกี่ยวกับสิ่งที่สำคัญกว่า ชอบที่จะนำวงเล็บปีกกาหรือช่องว่าง vs แท็บของคุณ


5
ฉันชอบการโต้วาทีของฉันเกี่ยวกับตัวละครที่มองไม่เห็น ...
ChaosPandion

สุดยอดเคล็ดลับพวก! ตอนนี้เราสามารถแยกแยะรหัสของกันและกันได้เร็วกว่าที่เราเคยทำได้ มันอาจจะประหยัดเวลาได้มากกว่าการพูดคุยกันจริง ๆ ! :)
pb01

@pdr ctrl + RV นั้นใช้งานได้เฉพาะกับ resharper หรือไม่ หรือมันเป็น keybind แบบกำหนดเองบางอย่าง? มันไม่ทำงานสำหรับฉัน
Jane Doe

@ JaneDoe: ฉันงงเมื่อพบว่ามันเป็น Resharper refactoring และ VS นั้นไม่เทียบเท่ากัน แก้ไขคำตอบแล้ว ขอโทษสำหรับเรื่องนั้น.
สาธารณรัฐประชาธิปไตยประชาชนลาว

@ChaosPandion U + 200B สำหรับผู้ชนะ!
Jesse C. Slicer

18

โดยส่วนตัวแล้วฉันพบตัวอย่างแรกอ่านง่ายกว่า คุณยังคงสามารถดีบักได้โดยการตั้งจุดพักในคำสั่ง return และเพิ่มa == 2ไปยังหน้าต่างดูหรือโดยใช้นาฬิกาด่วน

แต่นี่เป็นเรื่องของความชอบส่วนตัว ทั้งสองรุ่นก็โอเค


8
+1 ที่ยากต่อการอ่านโค้ดเพื่อให้การวางจุดแตกง่ายขึ้นคือการทำสิ่งผิดวิธีรอบ ๆ imho
jk

หน้าต่างเฝ้าดูหรือหน้าต่างกลางไม่ได้แก้ปัญหานี้เสมอไปเพราะบางครั้งนิพจน์ต้องใช้เธรดเพื่อให้ทำงานได้
JustAnotherUserYouMayKnowOrNot ไม่

@JustAnotherUserYouMayKnowOrNot: ใช่ นอกจากนี้ยังมีความเป็นไปได้ที่จะพิมพ์ข้อความลงในหน้าต่างดีบักจากภายในเบรกพอยต์ คลิกขวาที่เบรกพอยต์แล้วเลือก "When Hit ... "
Olivier Jacot-Descombes

การแสดงออกอาจมีผลข้างเคียงการเรียกใช้อีกครั้งอาจทำให้เกิดปัญหา ดีกว่าติดกับผลลัพท์
JustAnotherUserYouMayKnowOrNot ไม่

9

return a == 2เมื่อรหัสเป็นที่อ่านได้ง่ายเป็นตัวอย่างของคุณมีอะไรผิดปกติกับการกลับมาของผลการดำเนินการตรรกะเช่น อย่างไรก็ตามหากค่าส่งคืนเป็นคำสั่งที่ซับซ้อนมากขึ้นหรือดูเหมือนอะไร

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

จากนั้นคุณจะต้องใช้ตัวแปรเพื่อจัดเก็บชิ้นส่วนแรกนั้นและทำให้ข้อความสั่งคืนง่ายขึ้นเพื่อความสะดวกในการอ่าน


2

ในตัวอย่างง่าย ๆ เช่นนั้นทั้งคู่ก็โอเค

สำหรับตัวอย่างที่ซับซ้อนกว่าฉันชอบวิธีที่สอง นั่นเป็นเพราะมันสามารถอ่านได้มากขึ้นและคนอื่น ๆ จะต้องรักษารหัส


เฉพาะในกรณีที่มีชื่อตัวแปรที่ดีกว่าresultซึ่งเป็นตัวระบุที่ไม่มีคำอธิบายและไร้ประโยชน์อย่างสมบูรณ์
Alexander - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.