สตรีมมองหา (0, SeekOrigin.Begin) หรือตำแหน่ง = 0


175

เมื่อคุณต้องการรีเซ็ตกระแสข้อมูลให้เป็นจุดเริ่มต้น (เช่นMemoryStream) เป็นการใช้งานที่ดีที่สุด

stream.Seek(0, SeekOrigin.Begin);

หรือ

stream.Position = 0;

ฉันเคยเห็นทั้งสองทำงานได้ดี แต่สงสัยว่าหนึ่งถูกกว่าอีกหรือไม่


1
ถ้าเป็นการส่งคืนเนื้อหาของสตรีมหน่วยความจำ ToArray จะทำงานโดยไม่คำนึงถึงตำแหน่ง
James Kyburz

3
คำตอบ: สิ่งที่อ่านง่ายที่สุด
jgauffin

7
ฉันชอบstream.Position = 0;แต่ฉันต้องเห็นด้วยกับ @ jgauffin เพียงแค่เลือกอ่านได้มากที่สุดทั้งสองวิธีแก้ปัญหาได้ดี
lenniep

คำตอบ:


161

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


55
ฉันใช้คุณสมบัตินี้แม้เป็นตำแหน่งที่สัมพันธ์กัน: stream.Position += 10;ดูเหมือนว่าฉันจะอ่านได้ค่อนข้างสวย
Jon Skeet

6
มีความแตกต่างความเร็วระหว่างการใช้ SeekOrigin.Begin และ SeekOrigin.Current หรือไม่
gonzobrains

6
@gonzobrains "Return Value: ตำแหน่งใหม่ภายในสตรีมคำนวณโดยการรวมจุดอ้างอิงเริ่มต้นและออฟเซ็ต" . ดังนั้นการรวมกันมีค่าใช้จ่ายมากกว่าเพียงแค่การกำหนดตำแหน่งโดยตรง ในทางปฏิบัติมันไม่มีความหมายอะไรนอกจากการหยิบจู้จี้ )))
user808128

1
@ user808128 เอกสารการอ้างอิงอย่างน้อยที่สุดเอกสารประเภทนั้นไม่ใช่หลักฐานการปฏิบัติงาน คุณควรอ้างถึงซอร์สโค้ดสำหรับสิ่งนั้น
ArekBulski

8

คุณสามารถดูซอร์สโค้ดเพื่อค้นหาทั้งสองวิธี:

ค่าใช้จ่ายใกล้เคียงกัน (3 ifs และ arithmetics) อย่างไรก็ตามนี่เป็นความจริงเพียงอย่างเดียวสำหรับการข้ามไปยังออฟเซ็ตที่ชอบPosition = 0และไม่ใช่ออฟเซ็ตที่สัมพันธ์กันPosition += 0ซึ่งในกรณีนี้ Seek ดูเหมือนจะดีกว่าเล็กน้อย

อย่างไรก็ตามคุณควรระลึกไว้เสมอว่าเรากำลังพูดถึงประสิทธิภาพของเครื่องมือวัดระดับความงามจำนวนหนึ่งและการตรวจสอบ ifs จำนวนหนึ่งซึ่งไม่สามารถวัดได้อย่างแม่นยำด้วยวิธีการเปรียบเทียบ เหมือนคนอื่น ๆ ชี้ให้เห็นแล้วไม่มีความแตกต่างอย่างมีนัยสำคัญ / ตรวจพบได้

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