ทำไมต้องใช้ string.Empty มากกว่า“” เมื่อกำหนดให้กับวัตถุสตริง


14

ฉันใช้งาน StyleCop กับรหัสของฉันและคำแนะนำอย่างหนึ่งของ SA1122 ก็คือการใช้ string.Empty แทนที่จะเป็น "" เมื่อทำการกำหนดสตริงว่างให้กับค่า

คำถามของฉันคือเหตุใดจึงถือว่าเป็นวิธีปฏิบัติที่ดีที่สุด หรือนี่เป็นการปฏิบัติที่ดีที่สุดหรือไม่? ฉันคิดว่าคอมไพเลอร์ไม่มีความแตกต่างระหว่างสองข้อความดังนั้นฉันสามารถคิดได้ว่ามันเป็นสิ่งที่สามารถอ่านได้?

ดังนั้นคำถามและคำตอบ

Jon Skeet ตอบคำถาม


5
ฉันแน่ใจว่าสิ่งนี้ถูกถามและตอบกลับใน Stack Overflow - แต่ฉันมีปัญหาในการค้นหา มันจะทำอย่างไรกับความจริงที่ว่ามันมีอินสแตนซ์ของวัตถุสตริงใหม่""แต่ไม่ใช่string.Empty
ChrisF

@ChrisF Ahh ไม่คิดว่าจะดูสแต็คล้นสำหรับคำถามประเภทนี้ ฉันจะมีห่านตัวผู้
dreza

1
ซ้ำของคำถามใน stackoverflow: stackoverflow.com/questions/151472/…
quentin-starin

@ChrisF - มันถูกถามเกี่ยวกับ SO กว่าและมากกว่าและมากกว่า ...
Oded

1
เราไปกันแล้ว - stackoverflow.com/questions/151472/ … - กลับมาตั้งแต่เดือนกันยายน 2551
ChrisF

คำตอบ:


12

เหตุผลที่ถูกต้องหนึ่งก็คือว่ามันทำให้มันชัดเจนนี้ไม่ได้พิมพ์ผิดหรือตัวยึดที่คุณจริงๆหมายถึงการใช้สตริงที่ว่างเปล่าที่นี่

ฉันไม่รู้ว่ามันเป็น "แนวปฏิบัติที่ดีที่สุด" หรือไม่


7

ฉันคิดว่ามีเหตุผลสองประการข้อหนึ่งสำหรับอ่านได้และอีกสองข้อเพื่อเพิ่มประสิทธิภาพเล็กน้อย

การอ่านเป็นเรื่องง่าย: มันเร็วมากที่จะจุดกว่าstring.Empty ""การค้นหาstring.Emptyนั้นโดยทั่วไปแล้วจะง่ายกว่าและอาจแม่นยำกว่าการค้นหาตัวอักษร นอกจากนี้ยังอธิบายถึงเจตนา: คุณไม่ได้พิมพ์ผิดหรือลืมที่จะทำบางสิ่งบางอย่างคุณต้องการสตริงที่ว่างเปล่าจริงๆ

เหตุผลที่ผลการดำเนินงานเกิดจากการฝึกงาน คุณเห็นแล้วว่า runtime จะเก็บตารางของสตริงที่ใช้ก่อนหน้านี้เพื่อให้สามารถทำการเปรียบเทียบสตริงได้อย่างรวดเร็วโดยไม่ต้องทำการตรวจสอบตัวอักษรต่ออักขระ string.Emptyเป็นการอ้างอิงแบบ interned แล้ว""ว่าการพิมพ์ตัวอักษรอาจไม่ให้รุ่น interned กับคุณอยู่แล้วจึงทำให้มีผลการทำงานเล็กน้อย


7
Nitpick หนึ่งอันการพิมพ์ตัวอักษร "" จะทำให้คุณมีรุ่นฝึกงานเหมือนกัน "" อย่างน้อยก็ตั้งแต่. Net 2 ขึ้นไป
quentin-starin

ใช่แล้วบทความฝึกงานใน MSDN นั้นยากที่จะติดตามในจุดนั้น ดูเหมือนว่า "" และ string ตัวคั่นทั้งสองควรชี้ไปที่สตริง interned เดียวกัน แต่ดูเหมือนว่าจะระบุความแตกต่างบางอย่างระหว่าง. net runtime version ฉันคิดว่าสตริงตัวอักษรใด ๆ ที่ปรากฏขึ้นหลายครั้งในรหัสจะถูก interned ในการใช้งานที่สองและต่อไปใช่หรือไม่
CodexArcanum

4
นอกจากนี้ฉันควรเน้นว่าเมื่อฉันพูดน้อยฉันหมายถึงเล็กมาก "เนื่องจากประสิทธิภาพ" ไม่ใช่เหตุผลที่จะเปลี่ยนจากการเป็นตัวแทนหนึ่งไปสู่อีกสิ่งหนึ่งมันเป็นเพียงสิ่งที่ควรค่าแก่การรู้เกี่ยวกับรันไทม์
CodexArcanum

4
ควรสังเกตว่าด้านประสิทธิภาพเป็นจริงสำหรับการรวบรวมเท่านั้น เนื่องจากทั้งคู่รวบรวมลงใน IL เดียวกันประสิทธิภาพรันไทม์ควรเหมือนกัน
lzcd

การเพิ่มประสิทธิภาพนั้นจะอยู่ในการคอมไพล์
เฟืองล้อประหลาด


0

จากเอกสารบางอย่างที่ฉันพบมันเกี่ยวข้องกับสิ่งที่ปล่อยออกมาโดยคอมไพเลอร์

การค้นหาอย่างรวดเร็วเผยให้เห็น: http://stylecop.soyuz5.com/SA1122.html

ทำไมมันถูกยื่นภายใต้ "กฎการอ่าน" ด้วยคำอธิบายนั้นทำให้งง

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