ความแตกต่างระหว่าง“ String” และ“ string” ใน. NET และไหนดีที่สุด?


15

ใน. NET Framework อย่างน้อยในภาษา C # เรามีชนิดสตริง "รุ่น" สองอัน:

  • "สตริง"
  • "สตริง"

ดูเหมือนว่าพวกเขาจะใช้แทนกันได้ แต่พวกเขาจริงเหรอ? หากพวกเขาไม่สามารถใช้แทนกันได้จะดีกว่าหรือไม่หากใช้แทนกันและดีกว่า


1
คล้ายกับคำถามนี้: stackoverflow.com/q/6000517/6504
Agent_9191

2
โวหารฉันมักจะใช้รุ่นตัวพิมพ์เล็กเมื่อฉันอ้างถึงประเภทและรุ่นตัวพิมพ์ใหญ่เมื่อฉันเรียกใช้เมธอดแบบคงที่ของ System.String
Joel Mueller

4
เหมือนกับstackoverflow.com/questions/7074/...
zzzzBov

2
stringไม่มีอยู่ใน.netนั้นมีเฉพาะใน C # เท่านั้น
CodesInChaos

1
แม้ว่าสิ่งนี้อาจจะเหมาะสมกว่าสำหรับ Stack Overflow แต่ฉันไม่คิดว่ามันเป็นหัวข้อที่สมบูรณ์แบบสำหรับโปรแกรมเมอร์และเนื่องจาก Stack Overflow มีอย่างน้อยหนึ่งสำเนาที่ซ้ำกัน ดังนั้นโปรดหยุดการตั้งค่าสถานะ / ปิดการลงคะแนนเพื่อโยกย้ายหากคุณคิดว่าควรปิดตัวเลือกนี้ก็เจ๋งดี แต่ควรปิดไม่ย้าย
yannis

คำตอบ:


30

ดีตามMSDN

stringเป็นนามแฝงสำหรับStringใน. NET Framework

อยู่ที่ไหน "สตริง" System.Stringในความเป็นจริง

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

มันจะดีกว่าที่จะสอดคล้องกับสิ่งที่คุณใช้ว่า


ด้วยเหตุผลบางอย่างที่ฉันมีในหัวของฉันว่า String เป็นเสื้อคลุมคลาสรอบ ๆ ค่าที่พิมพ์ด้วยสตริงและสิ่งนี้นำไปสู่ความคิดของการชกมวย ... ฉันผิดทั้งหมดที่นี่หรือไม่
Aaron Anodide

1
@Gabriel No String(และด้วยstringนามแฝง) เป็นประเภทอ้างอิง
Kris Harper

@Gabriel: Java ไม่ได้ทำกับสิ่งที่ต้องการ byte เทียบกับ Byte?
whatsisname

เหมือนกันกับ Double vs double และประเภทข้อมูลอื่น ๆ หรือไม่
Gavin Coates

1
@AaronAnodide ฉันเชื่อว่านั่นเป็นจาวาแบบประชุมซึ่งน่าจะเป็นที่ที่คุณได้ยิน
KChaloux

20

ในฐานะที่ชี้ให้เห็นว่าพวกเขาเป็นสิ่งเดียวกันและเป็นเพียงนามแฝงไปยังstringString

สำหรับสิ่งที่คุ้มค่าฉันใช้stringเพื่อประกาศประเภท - ตัวแปรคุณสมบัติค่าส่งคืนและพารามิเตอร์ สิ่งนี้สอดคล้องกับการใช้งานระบบประเภทอื่น - int,, boolและvarอื่น ๆ (แม้ว่าInt32และBooleanถูกต้องเช่นกัน)

ฉันจะใช้Stringเมื่อมีการใช้วิธีการที่คงที่ในระดับ String เหมือนหรือString.Split() String.IsNullOrEmpty()ฉันรู้สึกว่าสิ่งนี้เหมาะสมกว่าเพราะวิธีการเป็นของคลาสและสอดคล้องกับวิธีที่ฉันใช้วิธีการคงที่อื่น ๆ


เราใช้การประชุมนี้ในที่ทำงานเช่นกันและฉันก็ชอบ สมองของฉันทำการเชื่อมต่อโดยอัตโนมัติ
SBI

4

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


3
หากคุณมีชนิดที่อิมพอร์ตสองชนิดที่มีชื่อเหมือนกันและคุณใช้ชื่อนั้นโดยไม่มีการรับรองเนมสเปซคุณจะได้รับข้อผิดพลาด
svick

มันเป็นไปได้ที่จะหลอกให้เข้าไปในการทำงานก็ไม่เคยไปได้ที่จะหลอกลวงString string
ไบรอัน Boettcher

stringแต่ถึงกระนั้นผมไม่คิดว่านั่นเป็นเหตุผลที่ดีพอกับการใช้งาน
svick

5
"คนใดคนหนึ่งอาจแตก" และ "คนใดคนหนึ่งจะไม่แตก" โดยที่คนอื่นเหมือนกันไม่ใช่เหตุผลที่ดีพอ
ไบรอัน Boettcher

4

string เป็นคำหลัก C # ซึ่งเป็นเพียงนามแฝงสำหรับ System.String

.. แต่เนื่องจากเป็นคำหลักตัวแก้ไขสีไวยากรณ์ของคุณ / IDE จะแสดงด้วยสีของคำหลักเช่นเดียวกับ int, double, if, else และอื่น ๆ Stylistically คุณอาจต้องการใช้คำหลักมากกว่าSystem.Stringชนิด (หรือStringหลังจากนั้น คุณทำเสร็จแล้วusing System;)

ตรงนี้คือจุดเฉพาะ แต่เป็นแม้ว่าbool, char, int, doubleและstringมีชื่อแทนคำหลักทั้งหมดสำหรับประเภทระบบstringเป็นคี่หนึ่งออกมามันเป็นชนิดอ้างอิงและอื่น ๆ ประเภทค่า


4
objectเป็นนามแฝงของคำหลักสำหรับประเภทอ้างอิงด้วย
nikie

โอ้ใช่ฉันลืมทุกอย่างเกี่ยวกับสิ่งนั้น - ขอบคุณสำหรับการเตือน
JBRWilkinson

2

stringเป็นเพียงนามแฝงสำหรับStringพวกเขาในที่สุดก็เหมือนกัน

คุณสามารถใช้ใดก็ตามที่คุณต้องการ แต่ฉันมักใช้stringเมื่อฉันวางแผนที่จะใช้มันมากเช่นชนิดข้อมูลดั้งเดิม (คล้ายกับint, floatหรือbool) และStringเมื่อฉันวางแผนที่จะใช้มันเป็นวัตถุ / ระดับ ตัวอย่างเช่น:

string foo = "   ";
if (String.isNullOrWhitespace(foo)) 
{
    // ...
}

ในกรณีดังกล่าวข้างต้นผมวางแผนในการใช้fooเพียงแค่การจัดเก็บข้อความบางส่วน (อย่างมีประสิทธิภาพเป็นดั้งเดิม) ดังนั้นฉันจะใช้string; แต่เมื่อผมเรียกผมใช้String.isNullOrWhitespace(string) Stringฉันทำสิ่งนี้เนื่องจากโดยทั่วไปอักษรตัวแรกของชื่อคลาสจะเป็นตัวพิมพ์ใหญ่ ( String) ในขณะที่ตัวอักษรตัวแรกของดั้งเดิม (เช่นint) ไม่ใช่


-2

สตริงที่ใช้กับเนมสเปซ System.String สตริงที่ใช้ในการรวบรวมคอมไพเลอร์ C # ยิ่งกว่านั้นSystem.Stringเป็นค่าประเภทอ้างอิง คุณต้องการที่จะจัดการกับวัตถุระบบสตริงเพื่อตัวอักษรเท่านั้น ระบบและระบบทั้งสองทำงานเหมือนกัน

string TC = new System.String('/', 5);

สตริงที่ใช้สำหรับการเปรียบเทียบเท่ากันและเพื่อวัตถุประสงค์อื่นเช่นกัน


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