พวกเขาแตกต่างกันตามที่คนอื่นตอบไปแล้ว
static void Main(string[] args)
{
string s1 = null;
string s2 = string.Empty;
string s3 = "";
Console.WriteLine(s1 == s2);
Console.WriteLine(s1 == s3);
Console.WriteLine(s2 == s3);
}
results:
false - since null is different from string.empty
false - since null is different from ""
true - since "" is same as string.empty
ปัญหาในการจัดการสตริงว่างกับสตริงว่างกำลังกลายเป็นปัญหาเมื่อคุณต้องการคงไว้ในไฟล์แบบแบนหรือถ่ายโอนผ่านการสื่อสารดังนั้นฉันจึงพบว่ามันอาจมีประโยชน์สำหรับคนอื่น ๆ ที่เยี่ยมชมหน้านี้เพื่อให้ทางออกที่ดี ปัญหานั้น ๆ
เพื่อจุดประสงค์ในการบันทึกสตริงลงในไฟล์หรือการสื่อสาร:
คุณอาจต้องการแปลงสตริงเป็นไบต์
แนวทางปฏิบัติที่ดีที่ฉันแนะนำคือการเพิ่มไบต์ส่วนหัว 2 ส่วนในสตริงที่แปลงแล้วของคุณ
เซ็กเมนต์ 1 - ข้อมูลเมตาซึ่งเก็บไว้ใน 1 ไบต์และอธิบายความยาวของเซ็กเมนต์ถัดไป
เซ็กเมนต์ 2 - เก็บความยาวของสตริงที่จะบันทึก
ตัวอย่าง:
string "abcd" - เพื่อให้ง่ายขึ้นฉันจะแปลงโดยใช้ตัวเข้ารหัส ASCII และจะได้รับ {65,66,67,68}
คำนวณเซ็กเมนต์ 2 จะได้ผลลัพธ์ 4 - ดังนั้น 4 ไบต์คือความยาวของสตริงที่แปลงแล้ว
คำนวณเซ็กเมนต์ 1 จะให้ผล 1 - เนื่องจากใช้เพียง 1 ไบต์เพื่อเก็บข้อมูลความยาวของข้อมูลสตริงที่แปลงแล้ว (ซึ่งเป็น 4 เช่นถ้าเป็น 260 ฉันจะได้ 2)
แถบใหม่ของไบต์ตอนนี้จะเป็น {1,4,65,66,67,68} ซึ่งสามารถบันทึกลงในไฟล์ได้
ประโยชน์ที่เกี่ยวกับหัวเรื่องคือถ้าฉันมีสตริงว่างเพื่อบันทึกฉันจะได้รับจากการแปลงอาร์เรย์ของไบต์ว่างที่มีความยาว 0 และหลังจากคำนวณกลุ่มแล้วฉันจะมี {1,0} ซึ่งอาจเป็นได้ บันทึกและต่อมาเมื่อโหลดและตีความกลับเป็นสตริงว่าง ในทางกลับกันถ้าฉันมีค่า null ในสตริงของฉันฉันจะมีเพียง {0} เป็นอาร์เรย์ไบต์ของฉันเพื่อบันทึกและอีกครั้งเมื่อโหลดแล้วสามารถตีความกลับเป็น null ได้
มีประโยชน์มากขึ้นเช่นการทราบขนาดที่จะโหลดหรือสะสมหากคุณกระตุกหลายสตริง
กลับไปที่หัวเรื่อง - มันจะ .. ก่อให้เกิดมลพิษในสแต็กเนื่องจากหลักการเดียวกันที่อธิบายไว้ถูกใช้โดยระบบใด ๆ เพื่อแยกความแตกต่างของ null จากว่างเปล่า .. ดังนั้นใช่สตริงการว่างจะใช้หน่วยความจำมากกว่า null แม้ว่าฉันจะไม่ เรียกมันว่ามลพิษ .. มันเพิ่มขึ้นเพียง 1 ไบต์