ใน C # ฉันควรใช้ string.Empty หรือ String.Empty หรือ“” เพื่อทำให้สตริงเป็นตัวเริ่มต้นหรือไม่?


705

ใน C # ฉันต้องการเริ่มต้นค่าสตริงด้วยสตริงว่าง

ฉันจะทำสิ่งนี้ได้อย่างไร อะไรคือวิธีที่ถูกต้องและทำไม

string willi = string.Empty;

หรือ

string willi = String.Empty;

หรือ

string willi = "";

หรืออะไร?


7
ดูการสนทนาที่คล้ายกันนี้สำหรับ java: stackoverflow.com/questions/213985/…
harpo

39
ดีกว่าที่จะใช้ String.IsNullOrEmpty (สตริง myString) แม้ว่าแน่นอน?
ZombieSheep

3
ฉันใช้ [string.IsNullOrWhiteSpace (stringvalue)] ... ทำงานใน. Net 4.0 ในการเริ่มต้นผมก็ใช้: [ข้อความ var = "";] ง่ายอ่านได้และใช้เวลาอย่างน้อยประเภท :)
Jalal El-Shaer

61
สิ่งที่สำคัญกว่าคือชื่อของตัวแปรเฮฮา
Arj

5
สิ่งที่ฉันสนใจคือทำไมถึงมีทรัพย์สินที่ว่างเปล่า มันเป็นสิ่งที่ดีและทุกอย่าง แต่ไม่จำเป็นและสมบูรณ์ต้อง
MasterMastic

คำตอบ:


808

ใช้สิ่งที่คุณและทีมหาได้มากที่สุด

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

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

การโต้เถียงที่ผิดพลาด""และ" "ง่ายต่อกันไม่ได้ล้างด้วยฉันจริงๆ ถ้าคุณกำลังใช้ตัวอักษรสัดส่วน (และฉันไม่ได้ทำงานร่วมกับใด ๆนักพัฒนาที่ทำ) ก็สวยง่ายที่จะบอกความแตกต่าง


75
ดวงตาของคุณสามารถหลอกคุณได้เมื่อคุณคาดว่าจะเห็น "" คุณสามารถเข้าใจผิด "" สำหรับ " นี่คือเหตุผลที่ง่ายต่อการแก้ไขสิ่งที่คนอื่นเขียน สมองของคุณไม่มีแนวคิดเกี่ยวกับเนื้อความที่คิดล่วงหน้าดังนั้นจึงง่ายกว่าที่จะเลือกสิ่งที่ไม่รู้ตัว
tvanfosson

125
@tvanfosson: งั้นคุณ (หรือเพื่อนร่วมงาน) ที่จริงแล้วนี่เป็นบั๊กหรือเปล่า? ฉันสงสัยว่าจะมีการอ้างสิทธิ์ประเภทนี้หากไม่มีปัญหาเกิดขึ้นจริง ฉันใช้ "" มาหลายปีโดยที่ไม่ผิดเลย ...
Jon Skeet

34
โดยส่วนตัวแล้วฉันใช้ String.Empty เสมอฉันใช้ capital 'S' เมื่อใดก็ตามที่ฉันต้องการใช้วิธีการแบบคงที่กับสตริงมันเป็นเพียงความสำคัญส่วนบุคคลที่ทำให้ฉันสามารถแยกประเภทของตัวแปรได้ แต่นี่เป็นเพียงการส่งต่อจากการใช้ StringUtils.EMPTY ใน commons.lang จาก java สิ่งหนึ่งที่น่าสนใจคือฉันเกือบจะตาบอดและสิ่งนี้ช่วยฉันในการอ่านได้อย่างแน่นอน
Brett Ryan

79
คุณให้แรงบันดาลใจแก่ฉันในการเริ่มพัฒนาใน Times New Roman
Justin Rusbatch

73
สำหรับบางเหตุผลที่ชัดเจนstring.Emptyไม่ได้เป็นอย่างต่อเนื่อง นั่นหมายความว่าในหลายกรณีที่จำเป็นต้องมีค่าคงที่เวลาคอมไพล์string.Emptyไม่เป็นกฎหมาย ซึ่งรวมถึงการcase ""บล็อกในswitchงบค่าเริ่มต้นของพารามิเตอร์ทางเลือกพารามิเตอร์และคุณสมบัติในการใช้คุณลักษณะและสถานการณ์อื่น ๆ อีกมากมาย (จากซ้ายไปยังผู้อ่าน) เมื่อพิจารณาแล้วว่าไม่ได้string.Emptyรับอนุญาตในบางสถานการณ์ทั่วไปจะเป็นการดีกว่าหากใช้""แบบแผนทุกที่
Jeppe Stig Nielsen

375

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

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

รหัส C #

private void Test1()
{
    string test1 = string.Empty;    
    string test11 = test1;
}

private void Test2()
{
    string test2 = "";    
    string test22 = test2;
}

รหัส IL

.method private hidebysig instance void 
          Test1() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test1,
                [1] string test11)
  IL_0000:  nop
  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test1
.method private hidebysig instance void 
        Test2() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test2,
                [1] string test22)
  IL_0000:  nop
  IL_0001:  ldstr      ""
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test2

รหัสการประกอบ

        string test1 = string.Empty;
0000003a  mov         eax,dword ptr ds:[022A102Ch] 
0000003f  mov         dword ptr [ebp-40h],eax 

        string test11 = test1;
00000042  mov         eax,dword ptr [ebp-40h] 
00000045  mov         dword ptr [ebp-44h],eax 
        string test2 = "";
0000003a  mov         eax,dword ptr ds:[022A202Ch] 
00000040  mov         dword ptr [ebp-40h],eax 

        string test22 = test2;
00000043  mov         eax,dword ptr [ebp-40h] 
00000046  mov         dword ptr [ebp-44h],eax 

13
@PrateekSaluja: เพื่อดู IL คุณสามารถใช้ ildasm.exe ซึ่งมาพร้อมกับ Visual Studio หากต้องการดูชุดประกอบใช้หน้าต่าง 'ถอดประกอบ' บนเมนูแก้ไขข้อบกพร่องเมื่อคุณกดเบรกพอยต์ (ใช้งานได้ในรหัสการเผยแพร่ด้วย)
Thomas Bratt

1
เกลียดที่ฉันกำลังจะแนะนำผลิตภัณฑ์นี้ .. แต่ .. ตัวสะท้อนแสงช่วยให้คุณสามารถเลือกภาษาของคุณเมื่อแยกส่วนแหล่งที่มาและตัวเลือก IL! ILDASM เป็นเพียงความรู้สึกเก่า ๆ ... ทีม MS tools ดูเหมือนจะไม่ขัดหรือปล่อยเครื่องมือที่ดี!
felickz

80

รหัสที่ดีที่สุดคือไม่มีรหัสเลย :

ลักษณะพื้นฐานของการเขียนโปรแกรมคืองานของเราในฐานะโปรแกรมเมอร์คือการตระหนักว่าการตัดสินใจทุกครั้งที่เราทำคือการแลกเปลี่ยน […] เริ่มด้วยความกะทัดรัด เพิ่มมิติอื่นตามที่ต้องการโดยการทดสอบ

ดังนั้นโค้ดน้อยเป็นรหัสที่ดีกว่า: ชอบ""ไปหรือstring.Empty String.Emptyทั้งสองนั้นมีความยาวเพิ่มขึ้นหกเท่าโดยไม่มีผลประโยชน์เพิ่มเติม - แน่นอนว่าไม่มีความชัดเจนที่เพิ่มขึ้นเนื่องจากพวกเขาแสดงข้อมูลเดียวกันที่แน่นอน


1
แต่ใน C # เราสามารถพูด
string ได้ IsNullOrWhitespace

31
ฉันยอมรับว่ารหัสควรมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ แต่โดยทั่วไปแล้วจะไม่โต้แย้งว่าตัวอักษรที่น้อยกว่าจะเป็นรหัสที่ดีกว่าเสมอ เมื่อพูดถึงการตั้งชื่อตัวแปรจำนวนอักขระที่เหมาะสมโดยทั่วไปส่งผลให้ชื่อดีกว่าการใช้ i และ j
Markus Meyer

3
@ Markus ขึ้นอยู่กับว่า: สำหรับตัวแปร loop ที่แทนดัชนีi นั้นดีกว่าชื่อตัวแปรแบบยาว ชื่อตัวแปรที่สั้นกว่าทั่วไปมากขึ้นที่นำเสนอข้อมูลเดียวกันในความชัดเจนเดียวกันนั้นเป็นที่นิยมมากกว่าเสมอ เป็นเพียงการแสดงข้อมูลที่จำเป็นที่คุณต้องการความยาวตัวอักษรและฉันไม่ได้ปฏิเสธสิ่งนี้ (ไม่มีใคร)
Konrad Rudolph

2
@ Konrad: ฉันเป็นชื่อตัวแปรที่ดีเฉพาะเมื่อลูปมีขนาดเล็กและไม่มีดัชนีอื่น ๆ แต่ฉันเห็นด้วยถ้า sth สามารถระบุสั้น ๆ เพิ่มเติมในการถ่ายทอดข้อมูลเดียวกันซึ่งจะดีกว่าเช่นในสตริงตัวอักษรตัวเล็ก / "" string.Empty ไม่ได้เพิ่มความคมชัดใด ๆ
Markus Meyer

สำหรับฉัน: string.Empty กล่าวว่าสตริงนี้และควรจะว่างตลอดเวลาในขณะที่ "" พูดในขณะที่เขียนสตริงนี้อาจว่างเปล่า แต่คุณมีอิสระที่จะเปลี่ยนได้
ละออง

54

สิ่งหนึ่งที่แตกต่างคือถ้าคุณใช้switch-caseไวยากรณ์คุณไม่สามารถเขียนได้case string.Empty:เพราะมันไม่คงที่ คุณจะได้รับCompilation error : A constant value is expected

ดูที่ลิงค์นี้สำหรับข้อมูลเพิ่มเติม: คำพูดสตริงว่างเปล่าและว่างเปล่าคำพูด


22
switchคำสั่งเป็นหนึ่งในตัวอย่างที่ดีมาก นอกจากนี้หากคุณสร้างพารามิเตอร์ทางเลือกเช่นvoid MyMethod(string optional = "") { ... }คุณไม่สามารถใช้พารามิเตอร์นี้ได้เช่นstring.Emptyกัน และแน่นอนถ้าคุณต้องการกำหนดconstเขตข้อมูลหรือตัวแปรท้องถิ่นconst string myString = "";อีกครั้ง""เป็นตัวเลือกเท่านั้น ถ้าstring.Emptyเป็นเพียงสนามคงที่คงไม่มีความแตกต่าง ""แต่มันก็ไม่ได้ดังนั้นในบางกรณีที่คุณต้องใช้ ดังนั้นทำไมไม่ใช้""ตลอดเวลา?
Jeppe Stig Nielsen

5
นี่เป็นข้อโต้แย้งที่แข็งแกร่งมากเพราะการใช้string.Emptyป้องกันไม่ให้คุณบรรลุความสอดคล้องในฐานรหัสของคุณ: คุณต้องใช้เอนทิตีที่ต่างกันสองตัวเพื่อแสดงสิ่งเดียวกัน และเพื่อเพิ่มรายชื่อของสิ่งที่คุณไม่สามารถทำ: คุณไม่สามารถใช้string.Emptyกับคุณลักษณะ
Pragmateek

2
คะแนนที่ดีมาก! ลิงก์เสีย นี่คือสำเนาของเนื้อหา: web.archive.org/web/20131230161806/http://kossovsky.net/…
ygoe

42

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


101
ฉันเถียงว่าถ้าคุณตั้งใจคัดลอกตัวอักษรที่ไม่สามารถพิมพ์ลงในรหัสของคุณคุณได้มีปัญหาที่ใหญ่กว่าคำถามนี้;)
จอนสกีต

9
ASCII \ 003 เกิดขึ้นจะเป็นตัวกำหนดเขตฟิลด์สำหรับข้อความ B2B ผมเคยทำงานกับ :)
จิมมี่

7
(ผมยังขอแนะนำให้หลีกเลี่ยง \ x หนีครับ - มันยากเกินไปที่จะมองเห็นความแตกต่างระหว่าง "\ x9Bad คอมไพเลอร์" และ "\ x9Good คอมไพเลอร์" ซึ่งมีความรุนแรงผลที่แตกต่างกัน!)
จอนสกีต

ส่วนตัวผมชอบ String over string ทุกครั้งที่เรียกเมธอดสแตติกบน String ฉันเกือบจะตาบอดแล้วและนี่เป็นความชอบส่วนตัวที่ฉันไม่ได้บังคับใคร
Brett Ryan

2
@ จิมมี่แน่นอน แต่เรากำลังพูดถึงสตริงที่ว่างเปล่า อาร์กิวเมนต์ที่""เป็นอันตรายเมื่อคัดลอก / วางเป็นโมฆะฉันเรียกร้องเนื่องจากคุณไม่เคยคัดลอก / วางสตริงว่าง สำหรับสายอื่น ๆ มันเป็นเรื่องที่ต้องคำนึงถึงเสมอ
Timo

22

ฉันจะไม่พูดสอด แต่ฉันเห็นข้อมูลผิดพลาดที่จะถูกโยนออกจากที่นี่

string.Emptyผมเองชอบ นั่นเป็นความชอบส่วนตัวและฉันก็มุ่งมั่นที่จะทำตามความต้องการของทีมที่ฉันทำงานด้วยเป็นกรณีไป

ขณะที่บางคนอื่น ๆ ได้กล่าวถึงมีความแตกต่างในระหว่างไม่มีและstring.EmptyString.Empty

นอกจากนี้และนี่เป็นความจริงที่รู้จักกันน้อยการใช้ "" เป็นที่ยอมรับอย่างสมบูรณ์ ทุกตัวอย่างของ "" จะสร้างวัตถุในสภาพแวดล้อมอื่น อย่างไรก็ตาม. NET ฝึกงานสตริงของมันดังนั้นอินสแตนซ์ในอนาคตจะดึงสตริงที่ไม่เปลี่ยนรูปแบบเดียวกันจากกลุ่มฝึกงานและผลการปฏิบัติงานใด ๆ ที่จะเล็กน้อย ที่มา: แบรดอับราฮัม


20
ฉันไม่เห็นว่าทำไม "ทางเทคนิค" ทุกตัวอย่างของ "" จะสร้างวัตถุ ไม่ใช่แค่โอกาสที่สตริงจะถูก interned แต่อยู่ในข้อมูลจำเพาะ C #
Jon Skeet

15

ฉันชอบมากกว่า "" ถ้าไม่มีเหตุผลที่ดีสำหรับบางสิ่งที่ซับซ้อนกว่า


13

String.Emptyและstring.Emptyเทียบเท่า Stringคือชื่อคลาส BCL stringคือ C # นามแฝง (หรือทางลัดหากคุณต้องการ) เช่นเดียวกับกับและInt32 intดูเอกสารสำหรับตัวอย่างเพิ่มเติม

เท่าที่""เกี่ยวข้องฉันไม่แน่ใจจริงๆ

string.Emptyส่วนตัวผมมักจะใช้


10

นักพัฒนาทุกคนจะรู้ว่า "" หมายถึงอะไร ฉันพบ String เป็นการส่วนตัวในครั้งแรกและต้องใช้เวลาค้นหา google เพื่อหาว่าจริงๆแล้วมันเป็นสิ่งเดียวกัน


3
มันเป็นฟิลด์สตริงสาธารณะแบบอ่านอย่างเดียวและค่าของมันคือ "" ... ทำไมจึงเปลี่ยนไป
Matthew Whited

5
คุณพลาดจุดที่ @Jason ทำ คุณจะรู้ได้อย่างไรว่ามันเป็นครั้งแรกที่คุณเห็นstring.Empty? คุณรู้หรือไม่ว่า""เป็นครั้งแรกที่คุณเห็นมัน
David R Tribble

10

หัวข้อนี้ค่อนข้างเก่าและยาวดังนั้นโปรดขอโทษด้วยถ้าพฤติกรรมนี้ถูกกล่าวถึงที่อื่น (และชี้ให้ฉันเห็นคำตอบที่ครอบคลุมสิ่งนี้)

ฉันพบความแตกต่างในพฤติกรรมของคอมไพเลอร์ถ้าคุณใช้string.Emptyหรือเครื่องหมายคำพูดคู่ ความแตกต่างแสดงตัวเองถ้าคุณไม่ใช้ตัวแปรสตริงที่เริ่มต้นด้วย string.Empty หรือด้วยเครื่องหมายคำพูดคู่

ในกรณีของการเริ่มต้นด้วยstring.Emptyคำเตือนคอมไพเลอร์

CS0219 - The variable 'x' is assigned but its value is never used

ไม่เคยถูกปล่อยออกมาในขณะที่ในกรณีของการเริ่มต้นด้วยคำพูดสองครั้งคุณจะได้รับข้อความที่คาดหวัง

พฤติกรรมนี้มีการอธิบายไว้ในบทความเชื่อมต่อที่ลิงก์นี้: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value

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


1
ฉันเชื่อว่าคุณเป็นคนแรกที่พูดถึง ฉันได้อ่านคำถามและคำตอบนี้มาหลายเดือนแล้วและจำความแตกต่างนี้ไม่ได้ซึ่งถ้าฉันถูกกล่าวถึง
Palec

2
น่าสนใจ โปรดทราบว่าvar unused = "literal";คอมไพเลอร์สามารถเพิ่มประสิทธิภาพการประกาศได้อย่างสมบูรณ์ (ลบออก) มันไม่มีผลข้างเคียง ในทางกลับกันvar unused = MyClass.Member;ไม่สามารถลบได้ทั้งหมด นั่นเป็นเพราะการอ่านMemberอาจมีผลข้างเคียง หากMemberเป็นคุณสมบัติแบบคงที่ที่มีgetaccessor เป็นที่ชัดเจนว่าจะต้องเก็บการเรียกไปยังตัวรับสัญญาณ แต่แม้ว่าMemberจะเป็นเขตข้อมูลแบบคงที่อาจมีผลข้างเคียงที่ตัวสร้างแบบคงที่อาจทำงาน แน่นอนว่ามันจะเป็นรูปแบบการเข้ารหัสที่ไม่ดีเพื่อให้เป็นเช่นนั้น Memberแต่คุณต้องหุ่นเพื่ออ่าน
Jeppe Stig Nielsen

9

ฉันทำการทดสอบง่าย ๆ โดยใช้วิธีการต่อไปนี้ในแอปพลิเคชันคอนโซล:

private static void CompareStringConstants()
{
    string str1 = "";
    string str2 = string.Empty;
    string str3 = String.Empty;
    Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True
    Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True
}

นี้อย่างชัดเจนแสดงให้เห็นว่าทั้งสามตัวแปรคือstr1, str2และstr3แม้ว่าจะถูกเริ่มต้นโดยใช้ไวยากรณ์ที่แตกต่างกันจะชี้ไปที่สายเดียวกันว่า (จากความยาวเป็นศูนย์) วัตถุในหน่วยความจำ ฉันทำการทดสอบนี้ในแอปพลิเคชันคอนโซล NET 4.5 ดังนั้นภายในพวกเขาจึงไม่มีความแตกต่างและทุกอย่างก็ลงเอยด้วยความสะดวกที่คุณต้องการใช้เป็นโปรแกรมเมอร์ พฤติกรรมของคลาสสตริงนี้เป็นที่รู้จักกันในนามสตริงฝึกงานใน. NET Eric Lippert มีบล็อกที่ดีมากที่นี่อธิบายแนวคิดนี้


8

ข้อใดข้อหนึ่งข้างต้น

มีหลายสิ่งที่ดีกว่าที่จะเป็นสังฆราช เช่นสิ่งที่เปลือกไม้สีเหมาะสมกับต้นไม้ฉันคิดว่าสีน้ำตาลคลุมเครือกับสีน้ำตาลมอส


7

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


7

ไม่มีใครพูดถึงว่าใน VisualStudio String จะมีรหัสสีแตกต่างกันไปตามสตริง ซึ่งเป็นสิ่งสำคัญสำหรับการอ่าน นอกจากนี้ตัวพิมพ์เล็กมักจะใช้สำหรับ vars และ type ไม่ใช่เรื่องใหญ่ แต่ String.Empty เป็นค่าคงที่ไม่ใช่ var หรือ type


String.Empty ไม่ใช่ค่าคงที่: ดูstackoverflow.com/questions/507923/…จริง ๆ แล้วมันเป็นตัวอย่างของคลาส String ตามการออกแบบ และมีการพูดถึงการระบายสีก่อนหน้านี้แม้ว่าจะซ่อนอยู่เล็กน้อย: stackoverflow.com/questions/263191/…
Michael

6

stringเป็นคำพ้องความหมายสำหรับSystem.Stringประเภทพวกเขาเหมือนกัน

ค่าเหมือนกัน: string.Empty == String.Empty == ""

ฉันจะไม่ใช้ตัวอักษรคงที่ในรหัสแทนstring.EmptyหรือString.Empty- ง่ายกว่าที่จะเห็นความหมายของโปรแกรมเมอร์

ระหว่างstringและStringฉันเหมือนกรณีที่ต่ำกว่าstringมากขึ้นเพียงเพราะผมใช้ในการทำงานร่วมกับ Delphi สำหรับจำนวนมากของปีที่ผ่านมาและรูปแบบ Delphi stringเป็นตัวพิมพ์เล็ก

ดังนั้นถ้าฉันเป็นเจ้านายของคุณคุณจะต้องเขียน string.Empty


6

ฉันจะชอบstring.Emptyมากกว่าString.Emptyเพราะคุณสามารถใช้งานได้โดยไม่จำเป็นต้องรวมusing System;ไว้ในไฟล์ของคุณ

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


2
ฉันเป็นสมาชิกคนเดียวของทีมฉันจะตัดสินใจได้อย่างไร โยนลูกเต๋าหรือไม่?
Gqqnbig

1
สำหรับผู้ที่อาจสงสัยว่ามันเป็นไปได้อย่างไรที่จะใช้string.Emptyค่าคงที่โดยไม่ต้องนำเข้าusing Systemเนมสเปซ - คำสำคัญใน C # จะถูกแปลงเป็นชื่อที่มีคุณสมบัติครบถ้วนซึ่งรวมถึงเนมสเปซก่อนที่จะเขียนเป็น MSIL ในเอาต์พุต * .dll หรือ * ไฟล์ exe ดังนั้นstring.Emptyได้รับการเขียนอย่างมีประสิทธิภาพSystem.String.Emptyใน MSIL โดยคอมไพเลอร์ และตามที่คุณอาจรู้อยู่แล้วว่าถ้าคุณพูดถึงชื่อประเภทที่ผ่านการรับรองคุณสามารถให้ข้ามไปที่การนำเข้าเนมสเปซที่ด้านบนของไฟล์รหัสของคุณ
RBT

5

ฉันไม่ได้สร้างความแตกต่าง อันสุดท้ายคือพิมพ์เร็วที่สุด :)


4

มันไม่สำคัญ - พวกมันเหมือนกันทุกประการ อย่างไรก็ตามสิ่งสำคัญคือคุณจะต้องสอดคล้อง

ป.ล. ฉันต่อสู้กับ "สิ่งที่ถูกต้อง" แบบนี้ตลอดเวลา


1
ในโลกสมัยใหม่ "ความสอดคล้อง" หมายถึงความสอดคล้องกันในทุกทีมทั่วโลกซึ่งเป็นหนึ่งในเป้าหมายของ StackOverflow ถ้าฉันอาจแนะนำให้ใช้ String.Empty
Pavel Radzivilovsky

1
บางภาษาไม่มีค่าคงที่ว่างเปล่าและทุกภาษาที่ฉันนึกได้ว่าอนุญาตให้ใช้สตริงที่มีความยาวเป็นศูนย์ "" ดังนั้นฉันจึงโหวตให้ "" เพื่อความสอดคล้องกับภาษาอื่น ๆ :)
TomXP411

4

มันเป็นการกำหนดลักษณะของโค้ดโดยสิ้นเชิง อย่างไรก็ตามนี่คือความคิดเห็นของฉัน :)

ฉันมักจะใช้ชื่อ BCL ประเภทเมื่อมีการเข้าถึงวิธีการคงคุณสมบัติและสาขา: String.EmptyหรือInt32.TryParse(...)หรือDouble.Epsilon

ฉันมักจะใช้คำหลัก C # เมื่อประกาศอินสแตนซ์ใหม่: int i = 0;หรือstring foo = "bar";

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


3

ฉันใช้อันที่สาม แต่อีกสองอันแรกดูจะแปลกน้อยกว่า string เป็นนามแฝงสำหรับ String แต่การได้เห็นพวกเขาข้ามการมอบหมายจะรู้สึกไม่ดี


3

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

[แก้ไข]

นอกจากนี้คุณอาจต้องการใช้อย่างใดอย่างหนึ่งstringหรือStringเพื่อความมั่นคงเสมอ แต่นั่นเป็นเพียงฉัน


ฉันเห็นด้วยกับคำพูดนี้ แต่ฉันยังมีชีวิตอยู่อย่างอันตรายเมื่อฉันขี้เกียจ ไม่ว่าในกรณีใดฉันไม่คิดว่าฉันจะมีโอกาสเขียนโค้ดที่ใช้สตริงก่อนที่จะกำหนดให้มันนอกการประกาศตัวแปร ในความเป็นจริงมันน่ารำคาญสำหรับฉันที่ฉันต้องเริ่มต้นสายของฉันเลยแม้จะมีความเสี่ยง
EnocNRoll - AnandaGopal Pardue

3

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

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

ถ้าคุณพิมพ์ string.EMpty หรือ Strng.Empty คอมไพเลอร์จะช่วยให้คุณรู้ว่าคุณทำผิด ทันที มันจะไม่รวบรวม ในฐานะนักพัฒนาคุณกำลังอ้างถึงความตั้งใจเฉพาะที่คอมไพเลอร์ (หรือผู้พัฒนารายอื่น) ไม่สามารถตีความผิดพลาดได้และเมื่อคุณทำผิดคุณไม่สามารถสร้างบั๊ก

ถ้าคุณพิมพ์ "" เมื่อคุณหมายถึง "" หรือในทางกลับกันคอมไพเลอร์จะทำสิ่งที่คุณบอกให้ทำอย่างมีความสุข ผู้พัฒนารายอื่นอาจจะหรืออาจไม่สามารถรวบรวมความตั้งใจที่เฉพาะเจาะจงของคุณ สร้างข้อผิดพลาด

นานมาแล้วที่สตริงสตริงเป็นสิ่งที่ฉันใช้ไลบรารีมาตรฐานที่กำหนดค่าคงที่ EMPTY_STRING เรายังคงใช้ค่าคงที่ในงบกรณีที่สตริงไม่อนุญาตให้ใช้

เมื่อใดก็ตามที่เป็นไปได้ให้คอมไพเลอร์ทำงานให้คุณและกำจัดโอกาสที่จะเกิดข้อผิดพลาดของมนุษย์ไม่ว่าจะเล็กเพียงใดก็ตาม IMO, สำคัญกว่านี้ "อ่านง่าย" เป็นคนอื่นได้อ้างถึง

ความจำเพาะและการบังคับใช้เวลารวบรวม มันคืออะไรสำหรับอาหารเย็น


3

ฉันใช้ "" เพราะจะมีสีเหลืองชัดเจนในรหัสของฉัน ... ด้วยเหตุผลบางประการ String.Empty เป็นสีขาวทั้งหมดในชุดรูปแบบ Visual Studio Code ของฉัน และฉันเชื่อว่ามีความสำคัญต่อฉันมากที่สุด


2

คอมไพเลอร์ควรทำให้เหมือนกันทั้งหมดในระยะยาว เลือกมาตรฐานเพื่อให้โค้ดของคุณอ่านได้ง่ายและติดกับมัน


2

ฉันเพิ่งดูรหัสและคำถามนี้โผล่เข้ามาในใจของฉันซึ่งฉันได้อ่านบางครั้งก่อน นี่เป็นคำถามของการอ่านอย่างแน่นอน

พิจารณารหัส C # ต่อไปนี้ ...

(customer == null) ? "" : customer.Name

VS

(customer == null) ? string.empty : customer.Name

ฉันเองพบว่าหลังน้อยกว่าคลุมเครือและอ่านง่ายขึ้น

ความแตกต่างที่เกิดขึ้นจริงนั้นเล็กน้อยมาก


1

ฉันคิดว่าข้อที่สองคือ "เหมาะสม" แต่บอกตามตรงฉันไม่คิดว่ามันจะสำคัญ คอมไพเลอร์ควรฉลาดพอที่จะคอมไพล์ใด ๆ ของรหัสไบต์เดียวกัน ฉันใช้ตัวเอง ""


1

ในขณะที่ความแตกต่างนั้นมีน้อยมากความแตกต่างก็ยังคงมีอยู่

1) "" สร้างวัตถุในขณะที่ String.Empty ไม่ได้ แต่วัตถุนี้จะถูกสร้างขึ้นหนึ่งครั้งและจะถูกอ้างอิงจากกลุ่มของสตริงในภายหลังหากคุณมีรหัสอื่น ""

2) สตริงและสตริงเหมือนกัน แต่ฉันอยากจะแนะนำให้ใช้ String.Empty (เช่นเดียวกับ String.Format, String.Copy เป็นต้น) เนื่องจากเครื่องหมายจุดแสดงถึงคลาสไม่ใช่ตัวดำเนินการและมีคลาสที่ขึ้นต้นด้วยอักษรตัวใหญ่สอดคล้องกับ มาตรฐานการเข้ารหัส C #


1
string.Empty คือ "" ตรวจสอบซอร์ส
dss539

1

ในhttp://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx :

อย่างที่เดวิดบอกไว้มีความแตกต่างระหว่างString.Emptyและ""มีขนาดค่อนข้างเล็ก แต่มีความแตกต่าง ""จริงสร้างวัตถุก็จะมีแนวโน้มที่จะดึงออกมาจากสระว่ายน้ำฝึกงานสตริง แต่ยังคง ... ในขณะที่String.Emptyสร้างวัตถุไม่ ... String.Emptyดังนั้นหากคุณกำลังมองหาจริงๆในท้ายที่สุดในประสิทธิภาพการใช้หน่วยความจำผมขอแนะนำให้ อย่างไรก็ตามคุณควรระลึกไว้เสมอว่าความแตกต่างนั้นสำคัญมากดังนั้นคุณจะไม่เคยเห็นมันในรหัสของคุณ ...
สำหรับSystem.String.Emptyหรือstring.EmptyหรือString.Empty... ระดับการดูแลของฉันต่ำ ;-)


1
โพสต์บล็อกของ MSDN นั้นในปี 2003 .... คุณแน่ใจหรือยังว่าเรื่องนี้ยังคงเป็นจริงสำหรับ. NET เวอร์ชันล่าสุด!
Carsten Schütte

@ CarstenSchütte: ดูเหมือนกับฉันว่าคุณลักษณะดังกล่าวไม่ได้มีวัตถุประสงค์เพื่อเปลี่ยนแปลงอย่างมาก ... และถ้าเป็นเช่นนั้นมีข่าวลือทางอินเทอร์เน็ตเกี่ยวกับเรื่องนี้
sergiol

3
@sergiol หากเขตข้อมูลมีประสิทธิภาพมากกว่าตัวอักษรนี่จะเป็นข้อบกพร่องด้านประสิทธิภาพอย่างไม่น่าสงสัย ดังนั้นจึงมีความหวังว่าจะได้รับการแก้ไขในตอนนี้
Konrad Rudolph

1

""สตริงที่ว่างเปล่าเป็นเหมือนเซตว่างเพียงแค่ชื่อที่ใช้ทุกคนที่จะเรียก นอกจากนี้ในสตริงภาษาทางการที่สร้างจากตัวอักษรที่มีความยาวเป็นศูนย์จะเรียกว่าสตริงว่าง ทั้งชุดและสายอักขระมีสัญลักษณ์พิเศษสำหรับมัน สตริงว่าง: εและชุดว่าง: ∅ หากคุณต้องการพูดถึงสตริงความยาวเป็นศูนย์คุณจะเรียกมันว่าสตริงว่างดังนั้นทุกคนรู้ว่าคุณหมายถึงอะไร ตอนนี้ในกรณีที่คุณตั้งชื่อมันว่าสตริงว่างทำไมไม่ใช้string.Emptyในรหัสมันแสดงให้เห็นถึงความตั้งใจที่ชัดเจน ข้อเสียคือมันไม่คงที่และดังนั้นจึงไม่สามารถใช้ได้ทุกที่เช่นในคุณสมบัติ (มันไม่คงที่ด้วยเหตุผลทางเทคนิคบางอย่างดูแหล่งอ้างอิง)


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