ในการขีดเส้นใต้หรือเพื่อไม่ให้ขีดเส้นใต้นั่นคือคำถาม


130

มีปัญหาใด ๆ ที่ไม่นำหน้าฟิลด์ส่วนตัวที่มีเครื่องหมายขีดล่างใน C # หรือไม่หากเวอร์ชันไบนารีกำลังถูกใช้โดยภาษาเฟรมเวิร์กอื่น ๆ ? ตัวอย่างเช่นเนื่องจาก C # คำนึงถึงขนาดตัวพิมพ์คุณสามารถโทรหาฟิลด์ "foo" และทรัพย์สินสาธารณะ "Foo" และใช้งานได้ดี

นี้จะมีการใด ๆ ที่มีผลในภาษากรณีตายเช่น VB.NET จะมีโดยใด ๆ CLS ปฏิบัติ (หรืออื่น ๆ ) ปัญหาถ้าชื่อมีความแตกต่างโดยปลอกเท่านั้น?


18
จุดสำคัญของคำนำหน้าขีดล่างคือ BTW ไม่ใช่เพื่อจัดการกับปัญหาของเคส มันจะสามารถบอกฟิลด์และคนท้องถิ่นได้อย่างง่ายดายและชัดเจนเมื่ออ่านโค้ด ฉันจะใช้มันใน C # และ VB เหมือนกัน
Neil Hewitt

2
@NeilHewitt: ก็ยังป้องกันไม่ให้พารามิเตอร์ฟังก์ชั่นขัดแย้งกับตัวแปรสมาชิกซึ่งต้องการการเตรียมทุกอย่างของพวกเขาด้วยthisซึ่งดูด แก้ไข: ฉันเพียงแค่ตอบสนองต่อความคิดเห็นเก่าสี่ปี ...
เอ็ดเอส

เพียงเพื่อความชัดเจนมาตรฐานอย่างเป็นทางการเป็นที่นิยม_camelCase(อ่านได้อย่างเดียว) github.com/dotnet/corefx/blob/master/Documentation/…
Chris Marisic

ฉันชอบ _camelCase สำหรับร้านค้าสำรองส่วนตัว ie: ไฟล์ส่วนตัวที่เก็บข้อมูลที่กำหนดและเข้าถึงผ่านคุณสมบัติ ฉันไม่ชอบคุณสมบัติอัตโนมัติเพราะพวกเขาไม่สามารถเริ่มต้นเป็นค่าที่รู้จักในคำจำกัดความของชั้นเรียนและถ้าฉันต้องการผลข้างเคียงใน setter ฉันต้องการที่เก็บสำรองที่ประกาศไว้อย่างชัดเจน น่าเสียดายที่สิ่งนี้ได้รับการปรับปรุงใหม่เมื่อฉันใช้ ^ R ^ E ในตัวแก้ไข c # ดังนั้นฉันจึงต้องเพิ่มกลับเข้าไปทุกครั้ง
TomXP411

คำตอบ:


46

มันจะไม่มีผลกระทบ

ส่วนหนึ่งของคำแนะนำสำหรับการเขียนไลบรารีที่สอดคล้องกับ CLS คือไม่มีเอนทิตีสาธารณะ / ที่ได้รับการป้องกันที่แตกต่างกันในแต่ละกรณีเช่นคุณไม่ควรมี

public void foo() {...}

และ

public void Foo() {...}

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


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

2
PS โดยส่วนตัวแล้วฉันไม่ขีดเส้นใต้ใน C # สำหรับฉันมันเป็นความชอบส่วนบุคคลไม่ได้เป็นความเชื่อทางศาสนา
Binary Worrier

1
ฉันได้ทำทั้งสองวิธีและฉันต้องการที่จะทำให้ความคิดของฉันหนึ่งและทั้งหมดขึ้นอยู่กับความรู้: P
TheCodeJunkie

46
ฉันใช้เครื่องหมายขีดล่าง มันง่ายกว่าที่จะแยกแยะพวกเขาออกจากข้อโต้แย้งและตัวแปรท้องถิ่น
Rinat Abdullin

4
ฉันใช้ _ เฉพาะกับเขตข้อมูลส่วนตัว แต่ฉันแทบไม่มีเขตข้อมูลส่วนตัวเนื่องจากคุณสมบัติอัตโนมัติ 3.5 โดยทั่วไปครั้งเดียวที่ฉันมีเขตข้อมูลส่วนตัวคือถ้าฉันใช้การโหลดแบบสันหลังยาวในประเภทที่ไม่ใช่แบบดั้งเดิม
Chris Marisic

278

การอัปเดตที่สำคัญ (12 เมษายน 2559):

เราทราบดีว่ามาตรฐานภายในของทีม. NET CoreFX ยืนยันที่จะใช้เครื่องหมายขีดล่างโดยไม่ต้องให้ข้อมูลเชิงลึกเกี่ยวกับสาเหตุใด ๆ แต่ถ้าเรามองอย่างใกล้ชิดที่กฎ # 3 มันจะกลายเป็นที่เห็นได้ชัดว่ามีความเป็นระบบของ_, t_, s_คำนำหน้าที่แสดงให้เห็นว่าทำไม_ได้รับการคัดเลือกในครั้งแรก

  1. เราใช้_camelCaseสำหรับเขตข้อมูลภายในและส่วนตัวและใช้แบบอ่านอย่างเดียวเท่าที่จะทำได้ เขตคำนำหน้าเช่นกับ_เขตข้อมูลคงที่พร้อมและสาขาด้ายคงที่พร้อมs_ t_เมื่อใช้กับฟิลด์คงที่readonlyควรมาหลังจากstatic(เช่นstatic readonlyไม่readonly static)
  2. เราหลีกเลี่ยงthis.เว้นแต่จำเป็นจริงๆ

ดังนั้นหากคุณเป็นเหมือนทีมงาน. NET CoreFX ที่ทำงานเกี่ยวกับประสิทธิภาพที่สำคัญรหัส multithreaded ระดับระบบแสดงว่าคุณได้รับข้อเสนอแนะอย่างมากจาก:

  • ปฏิบัติตามมาตรฐานการเข้ารหัสและ
  • ใช้เครื่องหมายขีดล่างและ
  • อย่าอ่านคำตอบนี้อีก

มิฉะนั้นโปรดอ่านต่อ ...

คำตอบเดิม:

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

ขีดสัญกรณ์

  • แนะนำให้คุณใช้คำนำหน้า "_" ในชื่อของฟิลด์ส่วนตัว
  • มันยังบอกด้วยว่าคุณไม่ควรใช้ "สิ่งนี้" เว้นแต่จะจำเป็นจริงๆ

นี้สัญกรณ์

  • แนะนำให้คุณใช้ "สิ่งนี้" เสมอ เพื่อเข้าถึงสมาชิกอินสแตนซ์ใด ๆ

ทำไมเครื่องหมายนี้ถึงมีอยู่?

เพราะนี่คือสิ่งที่คุณเป็น

  • บอกพารามิเตอร์จากฟิลด์เมื่อแบ่งใช้ชื่อเดียวกัน
  • ตรวจสอบให้แน่ใจว่าคุณกำลังทำงานในบริบทของอินสแตนซ์ปัจจุบัน

ตัวอย่าง

public class Demo
{
   private String name;
   public Demo(String name) {
       this.name = name;
   }
}

ทำไมไม่มีเครื่องหมายขีดล่างอยู่?

บางคนไม่ชอบพิมพ์ "นี่" แต่พวกเขายังต้องการวิธีแยกความแตกต่างของเขตข้อมูลและพารามิเตอร์ดังนั้นพวกเขาจึงตกลงที่จะใช้ "_" ที่ด้านหน้าของเขตข้อมูล

ตัวอย่าง

public class Demo
{
   private String _name;
   public Demo(String name) {
      _name = name;
   }
}

บางคนอาจคิดว่ามันเป็นแค่เรื่องของรสนิยมส่วนตัวและทั้งสองวิธีนั้นดี / ไม่ดีเท่ากัน อย่างไรก็ตามมีบางแง่มุมที่สัญกรณ์นี้เป็นเครื่องหมายขีดล่าง:

ความชัดเจน

  • ขีดล่างของชื่อ clutters
  • สัญกรณ์นี้ทำให้ชื่อเหมือนเดิม

โหลดทางปัญญา

  • เครื่องหมายขีดล่างไม่สอดคล้องกันทำให้คุณจัดการฟิลด์ด้วยวิธีพิเศษ แต่คุณไม่สามารถใช้กับสมาชิกคนอื่น ๆ ทุกครั้งที่คุณต้องถามตัวเองว่าคุณต้องการทรัพย์สินหรือฟิลด์

  • สัญกรณ์นี้สอดคล้องกันคุณไม่ต้องคิดคุณแค่ใช้ "สิ่งนี้" เพื่ออ้างอิงถึงสมาชิกใด ๆ

UPDATE: ตามที่ชี้ให้เห็นต่อไปนี้ไม่ใช่จุดได้เปรียบ

ซ่อมบำรุง

  • เครื่องหมายขีดล่างคุณต้องจับตาดู_ขณะทำการเปลี่ยนโครงสร้างใหม่กล่าวว่าการเปลี่ยนเขตข้อมูลเป็นคุณสมบัติ (ลบ_) หรือตรงกันข้าม (เพิ่ม_)

  • สัญกรณ์นี้ไม่มีปัญหาดังกล่าว

เติมข้อความอัตโนมัติ

เมื่อคุณต้องการดูรายการสมาชิกอินสแตนซ์:

  • เครื่องหมายขีดล่างไม่ช่วยอะไรคุณมากนักเพราะเมื่อคุณพิมพ์ "_" ป๊อปอัพเติมข้อความอัตโนมัติจะแสดงฟิลด์ส่วนตัวและทุกประเภทที่มีอยู่จากแอสเซมบลีที่เชื่อมโยงซึ่งผสมกับสมาชิกอินสแตนซ์ที่เหลือ
  • สัญลักษณ์นี้ให้คำตอบที่ชัดเจนโดยพิมพ์ "สิ่งนี้" ที่คุณเห็นคือรายชื่อสมาชิกและไม่มีอะไรอื่น

ความคลุมเครือ

บางครั้งคุณต้องจัดการกับโค้ดโดยไม่ต้องใช้ Intellisense ตัวอย่างเช่นเมื่อคุณทำการตรวจสอบโค้ดหรือเรียกดูซอร์สโค้ดออนไลน์

  • เครื่องหมายขีดล่างไม่ชัดเจน: เมื่อคุณเห็นบางสิ่งบางอย่างบางสิ่งบางอย่างคุณไม่สามารถบอกได้ว่าบางสิ่งบางอย่างเป็นคลาสและ SomethingElse เป็นคุณสมบัติคงที่ ... หรืออาจเป็นบางสิ่งบางอย่างเป็นคุณสมบัติอินสแตนซ์ปัจจุบันซึ่งมีคุณสมบัติของ SomethingElse

  • สัญลักษณ์นี้มีความชัดเจน: เมื่อคุณเห็นบางสิ่งบางอย่างบางสิ่งบางอย่างมันสามารถหมายถึงคลาสที่มีคุณสมบัติคงที่เท่านั้นและเมื่อคุณเห็นสิ่งนี้บางสิ่งบางอย่างบางสิ่งบางอย่างคุณรู้ว่าบางสิ่งเป็นสมาชิกและ SomethingElse เป็นคุณสมบัติของมัน

วิธีการขยาย

คุณไม่สามารถใช้วิธีการส่วนขยายกับอินสแตนซ์ของตัวเองโดยไม่ใช้ "สิ่งนี้"

  • เครื่องหมายขีดล่างกำหนดว่าคุณไม่ต้องใช้ "สิ่งนี้" อย่างไรก็ตามด้วยวิธีการขยายที่คุณต้องทำ
  • สัญกรณ์นี้ช่วยให้คุณประหยัดจากความลังเลคุณมักจะใช้ "นี่" ระยะเวลา

การสนับสนุน Visual Studio

  • เครื่องหมายขีดล่างไม่มีการสนับสนุนในตัวใน Visual Studio
  • Visual Studio นี้รองรับสัญกรณ์อย่างเป็นธรรมชาติ:

    1. "นี้." คุณสมบัติ : ชอบฟิลด์ที่ไม่คงที่ทั้งหมดที่ใช้ในวิธีการคงที่ที่จะนำมาใช้กับthis.ใน C #

คำแนะนำอย่างเป็นทางการ

มีแนวทางอย่างเป็นทางการมากมายที่พูดอย่างชัดเจนว่า "อย่าใช้ขีดเส้นใต้" โดยเฉพาะใน C #


22
นี่คือคำตอบที่น่าอัศจรรย์ ขอบคุณที่สละเวลารวบรวมข้อมูลทั้งหมดนี้
Tigran

5
ไม่ได้มาจาก C ++ เพราะใน C ++ ขอสงวนตัวระบุที่ขึ้นต้นด้วยเครื่องหมายขีดล่างสำหรับการใช้ภาษาและไลบรารีมาตรฐาน
Rob G

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

6
การใช้เครื่องหมายขีดล่างไม่มีอะไรเกี่ยวข้องกับการเขียนโค้ดที่มีความสำคัญแบบมัลติเธรดหรือระดับระบบ ความสอดคล้องกันคือสิ่งที่สำคัญและทีม CoreFX เป็นเพียงทีมที่เห็นด้วยกับข้อตกลงเฉพาะ นี่เป็นคำตอบที่ดีเยี่ยมซึ่งได้รับการสนับสนุนด้วยการวิเคราะห์ที่ดีมากเมื่อเปรียบเทียบกับการตั้งชื่อการประชุม แต่ฉันเชื่อว่าส่วนเพิ่มเติมที่กล่าวว่า "ขีดล่างดีกว่าเพราะทีม CoreFX กล่าวเช่นนั้น" ลดคุณภาพของมันลงจริงๆ
ŞafakGür

5
ปัญหาของฉันคือฉันเข้าใจข้อสรุปเชิงตรรกะ en.wikipedia.org/wiki/ การอ้างอิง แต่เดี๋ยวก่อนฉันไม่ได้มีไว้สำหรับทุกคน
user603563

67

นำมาจากไฟล์ Microsoft StyleCop Help:

TypeName: FieldNamesMustNotBeginWithUnderscore

ตรวจสอบ: SA1309

สาเหตุ: ชื่อฟิลด์ใน C # เริ่มต้นด้วยเครื่องหมายขีดล่าง

คำอธิบายกฎ:

การละเมิดกฎนี้เกิดขึ้นเมื่อชื่อฟิลด์เริ่มต้นด้วยเครื่องหมายขีดล่าง

ตามค่าเริ่มต้น StyleCop จะปิดการใช้เครื่องหมายขีดล่าง, m_ และอื่น ๆ เพื่อทำเครื่องหมายฟิลด์คลาสท้องถิ่นเพื่อสนับสนุน 'this' อุปสรรค ข้อดีของการใช้ 'this' คือมันใช้ได้กับทุกประเภทองค์ประกอบรวมถึงวิธีการคุณสมบัติ ฯลฯ และไม่เพียง แต่ฟิลด์ทำให้การเรียกไปยังสมาชิกคลาสทั้งหมดสามารถจดจำได้ทันทีโดยไม่คำนึงว่าจะใช้โปรแกรมแก้ไขใดเพื่อดูรหัส ข้อดีอีกประการคือมันสร้างความแตกต่างอย่างรวดเร็วและเป็นที่รู้จักระหว่างสมาชิกอินสแตนซ์และสมาชิกคงที่ซึ่งจะไม่ถูกนำหน้า

ถ้าเขตข้อมูลหรือชื่อตัวแปรมีจุดมุ่งหมายเพื่อให้ตรงกับชื่อของรายการที่เกี่ยวข้องกับ Win32 หรือ COM และดังนั้นจึงต้องเริ่มต้นด้วยการขีดล่างวางเขตข้อมูลหรือตัวแปรภายในคลาส NativeMethods พิเศษ คลาส NativeMethods เป็นคลาสใด ๆ ที่มีชื่อลงท้ายด้วย NativeMethods และมีจุดประสงค์เป็นตัวยึดตำแหน่งสำหรับ Win32 หรือ COM wrappers StyleCop จะเพิกเฉยต่อการละเมิดนี้หากวางไอเท็มไว้ในคลาส NativeMethods

คำอธิบายกฎที่แตกต่างกันบ่งชี้ว่าการปฏิบัติที่ต้องการนอกเหนือจากด้านบนคือการเริ่มต้นฟิลด์ส่วนตัวด้วยตัวอักษรตัวเล็กและตัวอักษรสาธารณะที่มีตัวพิมพ์ใหญ่

แก้ไข: เป็นติดตามหน้าโครงการ StyleCop ตั้งอยู่ที่นี่: https://github.com/DotNetAnalyzers/StyleCopAnalyzers การอ่านไฟล์ช่วยเหลือจะช่วยให้เข้าใจอย่างถ่องแท้ว่าทำไมพวกเขาจึงแนะนำกฎโวหารหลากหลายรูปแบบ


7
ส่วนใหญ่เป็นประเภท "แนวทางปฏิบัติที่ดีที่สุด" เนื่องจากกฎระบุว่าการใช้คำนำหน้าด้วย "this" สามารถนำไปใช้กับสมาชิกที่ไม่คงที่ใด ๆ ได้ในขณะที่คำนำหน้าด้วยสิ่งอื่นอาจไม่สามารถใช้ได้เนื่องจากกฎไวยากรณ์ของภาษา คำหลัก "นี้" ทำให้ปลายทางชัดเจนโดยเจตนา
Scott Dorman

5
ฉันยังชอบวิธีการแก้ปัญหาที่ตั้งใจของภาษา ("นี้") มากกว่าวิธีการประดิษฐ์ของการรับรอบ
galaktor

10
นอกจากนี้ยังมีกฎในซอฟต์แวร์เดียวกันที่บอกว่าคุณไม่ควรมีสองเขตข้อมูลที่แตกต่างกันเฉพาะในกรณีที่ แล้วคุณจะทำอย่างไรกับตัวแปรที่มีการป้องกันซึ่งถูกห่อหุ้มโดยทรัพย์สินสาธารณะ?
Lilith River

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

14
StyleCop ดูเหมือนว่าจะบอกว่าถ้าผมอย่างต่อเนื่องใช้thisเมื่อพูดถึงสมาชิกของกลุ่มใด ๆ thisที่ฉันสามารถหาทุกสายให้กับสมาชิกทุกระดับได้ง่ายๆโดยการค้นหา ฉันไม่สามารถโต้เถียงกับสิ่งนั้นได้ แต่ฉันก็ไม่สามารถนึกถึงเวลาที่ฉันต้องทำเช่นนั้นได้ สิ่งสุดท้ายที่ฉันต้องการทำคือเพิ่มความน่าเบื่อให้กับการเข้ารหัสและทำให้รหัสของฉันหมดไปด้วยthis(ซึ่งเกือบจะเป็นภาษาฮังการี) เพราะแทบไม่มีประโยชน์ ความจริงก็คือถ้าฉันดูที่บรรทัดของรหัสสิ่งที่เริ่มต้นด้วยตัวพิมพ์ใหญ่หรือขีดล่างเป็นสมาชิกของชั้นสิ่งที่ต่ำกว่าเป็นท้องถิ่น
devuxer

27

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

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

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

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


14
ฉันจะใส่คำนำหน้าด้วย 'นี่' เสมอไม่ว่าฉันจะใส่เขตข้อมูลคุณสมบัติหรือวิธีการ
TheCodeJunkie

9
สำหรับฉันขีดเส้นใต้เป็นสัญกรณ์สั้น ๆ ของ "สิ่งนี้"
M4N

2
ใน R # คำแนะนำคืออย่าเรียกพารามิเตอร์ foo ทำไมไม่เรียกมันว่า 'คุ้มค่า' เพราะคุณรู้ว่ามันจะใช้ในการตั้งค่า Foo?
Thinkbeforecoding

17
@ มาร์ติน: ปัญหากับขีดเส้นใต้เป็นชวเลขสำหรับ "นี้" คือมันไม่สามารถนำไปใช้กับสมาชิกทุกคนในชั้นเรียนในขณะที่ "นี้" สามารถ ฉันคิดว่ารหัสอ่านง่ายขึ้น / สะอาดขึ้นด้วยคำหลัก "this" ในตัวอย่างของคุณ if (foo == x) จะอ้างถึงพารามิเตอร์ foo เสมอ
Scott Dorman

3
@TheCodeJunkie: มีจำนวนอักขระซ้ำซ้อนมากมายในฐานรหัสของคุณ
Ed S.

15

หลังจากทำงานในสภาพแวดล้อมที่มีกฎเกณฑ์ที่เฉพาะเจาะจงมากและไร้จุดหมายตั้งแต่นั้นฉันก็เริ่มสร้างสไตล์ของตัวเองขึ้นมา นี่คือประเภทหนึ่งที่ฉันพลิกไปมามาก ในที่สุดฉันก็ตัดสินใจว่าฟิลด์ส่วนตัวจะเป็น _field เสมอตัวแปรท้องถิ่นจะไม่มี _ และเป็นตัวพิมพ์เล็กชื่อตัวแปรสำหรับการควบคุมจะตามสัญกรณ์ฮังการีอย่างหลวม ๆ และพารามิเตอร์โดยทั่วไปจะเป็น camelCase

ฉันเกลียดthis.คำหลักมันเพิ่งเพิ่มรหัสเสียงมากเกินไปในความคิดของฉัน ฉันรัก Resharper ลบนี้ซ้ำซ้อน คำสำคัญ.

อัปเดต 6 ปี: ฉันกำลังวิเคราะห์ internals ของDictionary<TKey,T>สำหรับการใช้งานที่เฉพาะเจาะจงของการเข้าถึงพร้อมกันและ misread ฟิลด์ส่วนตัวที่จะเป็นตัวแปรท้องถิ่น ฟิลด์ส่วนตัวไม่ควรจะเป็นแบบแผนการตั้งชื่อเดียวกับตัวแปรท้องถิ่น หากมีการขีดเส้นใต้มันจะชัดเจนอย่างไม่น่าเชื่อ


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

15
ทำไมจึงต้องสร้าง 'มาตรฐาน' 'นี้.' บอกคุณวัตถุเป็นตัวแปรอินสแตนซ์ 'คลาส' บอกคุณว่ามันเป็นคลาสที่แปรปรวน ทุกอย่างอื่นคือตัวแปรสแต็ก เครื่องหมายขีดล่างอยู่ในกองเดียวกันของความคิดที่ไม่ดีที่ฮังการีสัญกรณ์ตอนนี้สลายตัว
Quarkly

4
@ DRAirey1 ง่ายเกินไปที่จะพลาดสิ่งนี้ เมื่อคุณต้องการมันและคุณก็ลงเอยทำสิ่งแปลก ๆ กับรัฐ
Chris Marisic

3
@ChrisMarisic แน่นอนว่าคุณยินดีรับฟังความคิดเห็นของคุณเกี่ยวกับการใช้งาน_แต่อย่าโพสต์ว่าเป็นมาตรฐานที่กำหนดไว้เมื่อไม่ชัดเจน
บดขยี้

3
ฉันทำให้คุณหลงทางที่ "ฉันยังคงสร้างสไตล์ของตัวเอง"
rory.ap

12

ฉันชอบขีดล่างเพราะจากนั้นฉันสามารถใช้ชื่อตัวพิมพ์เล็กเป็นพารามิเตอร์วิธีดังนี้:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

39
ประชาชนสตริง FirstName {รับ; ชุดส่วนตัว }
jason

3
คุณยังสามารถใช้ตัวพิมพ์เล็กเป็นพารามิเตอร์วิธีโดยใช้thisคำสำคัญ ทำที่จุดใบ้ในอย่างต่อเนื่องและความขัดแย้งเสมอ "เพื่อขีดหรือไม่":public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
มันเป็นอนาคตเพียงแค่ตอนนี้public string FirstName { get; }และผู้ตั้งค่ายังคงมีอยู่ในตัวสร้าง
Chris Marisic

ในตัวอย่างนี้ thisจะมีความจำเป็นในตัวสร้างเท่านั้น ไม่จำเป็นต้องใช้งานที่อื่น ดังนั้นfirstNameชื่อฟิลด์จึงใช้งานได้ดีมาก
โทมัส

9

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

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


4
สำหรับฉัน _ clutters ขึ้น _words เมื่อ _scanning อย่างรวดเร็วผ่านโค้ดมันจะกลายเป็นน้อยกว่าเพียงแค่อ่าน _and _more _like ต้องหยุดที่ _every _ เพื่อรับทราบและ _realize มันเป็น _not อักขระควบคุมของ _sort บางตัว นอกจากนี้ยังขัดขวางการเยื้องโดยการกดอักขระที่มีประโยชน์ตัวแรกในฟิลด์ชื่อหนึ่งคอลัมน์ทางด้านขวา ฉันมักไม่ชอบ c ++ เพราะส่วนใหญ่ c ++ - โปรแกรมเมอร์มักจะเขียนอย่างไม่น่าเชื่อสั้นและช้าต่อการอ่านสัญลักษณ์ / เครื่องเหมือนรหัสและฉันก็ชอบไม่ได้มีว่าในรหัส C # :)
Oskar Duveborn

23
สำหรับฉันแล้วสิ่งนี้ คลิกที่นี่เพื่อปิดกั้นรหัสนี้เมื่อสแกนอย่างรวดเร็วสแกนผ่านโค้ดมันจะกลายเป็นน้อยกว่าแค่อ่านมันและนี่คือสิ่งที่มันคล้ายกับการหยุดและสิ่งนี้ทุกอย่าง เพื่อรับทราบและสิ่งนี้ทำให้เป็นจริงไม่ใช่ตัวควบคุมของ some.sort นี้ ฉันมากต้องการที่จะหาสิ่งที่เป็นครั้งคราว_fieldFooหรือ_fieldBarมากกว่าที่จะมีการใช้งานของฉันรกขึ้นมาด้วยหรือthis.fieldFoo this.fieldBarฉันพบว่าthis.คำนำหน้ามีความสั่นสะเทือนมากกว่าขีดเส้นใต้
AggieEric

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

1
@AggieEric กดเล็บที่หัวตรงนั้น แค่อ่านประโยคของเขาก็ทำให้ฉันปวดหัว! ฉันพยายามที่จะยึดมั่นกับข้อเสนอแนะของ MS เป็นเวลาหลายปีในเรื่องนี้และฉันก็เลยthisรู้สึกเบื่อที่จะอ่านคำศัพท์สีฟ้าเล็ก ๆ น้อย ๆ ในทุก ๆ ที่ฉันตัดสินใจอย่างบ้าคลั่ง ตอนนี้ผมเคร่งครัดใช้thisสำหรับการอ้างอิงในคุณสมบัติเฉพาะหรือเมื่อฉันต้องชัดเจนแยกแยะระหว่างและthis baseแต่ละของเขาเองผมคิดว่า :-)
Riegardt เทน

1
ฉันคิดว่าเป็นเพราะในที่สุดการเริ่มต้นสิ่งที่มีเครื่องหมายวรรคตอนเจ็บทำให้สามารถอ่านได้ ดูเหมือนจะไม่รบกวนทุกคน แต่สำหรับฉันมันรู้สึกผิดปกติมากที่อ่านสิ่งที่เริ่มต้นด้วยเครื่องหมายวรรคตอน ยิ่งรหัสภาษาอังกฤษเหมือนกันฉันก็ยิ่งอ่านง่ายขึ้น และด้วย IDEs ที่ทันสมัยมันเป็นเรื่องง่ายที่จะบอกความแตกต่างระหว่างคนในท้องถิ่นและสมาชิกส่วนตัวเพราะพวกเขาน่าจะเป็นสีที่แตกต่างกัน
Tim Long

5

การแนะนำ Style Cop หรือไม่การขุดเข้าไปใน. NET Framework จะแสดงการใช้งาน "_" จำนวนมากสำหรับตัวแปรสมาชิก ไม่ว่าผู้สร้าง Style Cop จะแนะนำอะไรมันก็ไม่ใช่สิ่งที่พนักงาน MS ส่วนใหญ่ใช้ :) ดังนั้นฉันจะยึดติดกับขีดเส้นใต้ เนื่องจากฉันทำผิดพลาดน้อยกว่ามากโดยใช้เครื่องหมายขีดล่างแล้วสิ่งนี้ (ตัวอย่าง: using varName = varName แทน this.varName = varName มันติดอยู่ในตัวฉันจริงๆ)


3
แนะนำขีดล่างสำหรับคำแนะนำสไตล์. NET core: github.com/dotnet/corefx/wiki/Coding-style
landoncz

3

ฉันคิดว่าโดยและสาขาวิชาขนาดใหญ่เป็นข้อผิดพลาดในการออกแบบภาษา ฉันจะชอบมันถ้าคุณสมบัติของ C # มีขอบเขตในตัวของมันเอง:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

นั่นจะทำให้เป็นไปได้ที่จะหยุดใช้ฟิลด์ทั้งหมด

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


แก๊ง C # ดูเหมือนจะเห็นด้วยกับคุณกับ new int ส่วนตัว foo {รับ; set;} ไวยากรณ์น้ำตาล
Dana

โอ้แน่นอน สิ่งที่ฉันอธิบายที่นี่ไม่สามารถใช้งานได้โดยสิ้นเชิงหากปราศจากสิ่งนั้น
Robert Rossney

สิ่งที่คุณอธิบายคือ "คุณสมบัติที่ใช้งานอัตโนมัติ" น่าเสียดายที่ด้วย Visual Basic.NET สิ่งนี้ใช้ตัวแปร _prefix แบบ "ซ่อน" ที่อยู่เบื้องหลังคือถ้าคุณมีคุณสมบัติที่ใช้งานอัตโนมัติ "Public Property Foo As Integer" คุณจะไม่สามารถประกาศตัวแปรสมาชิก "Private _foo เป็น จำนวนเต็ม "

ไม่ฉันไม่ได้อธิบายคุณสมบัติที่ใช้งานอัตโนมัติอย่างน้อยก็ไม่ใช่ในตัวอย่างของฉัน ฉันอธิบายระดับการกำหนดขอบเขตที่ไม่มีอยู่ใน C # หรือ VB เป็นเรื่องโชคร้ายจริงๆที่ VB เลือกวิธีที่ไม่สำคัญเพื่อลบล้างชื่อของเขตข้อมูลสำรอง C # นั้นน่าเกลียดพอที่คุณจะไม่สร้างตัวแปรที่มีชื่อเดียวกันโดยบังเอิญ
Robert Rossney

3

เครื่องหมาย _fieldName สำหรับเขตข้อมูลส่วนตัวแตกหักง่าย ใช้ "นี่" สัญกรณ์เป็นไปไม่ได้ที่จะทำลาย คุณจะแยกเครื่องหมาย _ อย่างไร? สังเกต:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

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

ตัดกันด้วย Ruby ที่ชื่อของตัวแปร @my_numberผูกชื่อไว้ในขอบเขตและไม่สามารถแตกได้

แก้ไข: คำตอบนี้เป็นลบ ฉันไม่สนใจมันอยู่


11
มันเป็นคำวิจารณ์ที่ไม่ค่อยถูกต้องเกี่ยวกับการตั้งชื่อเพื่อบอกว่าเป็นไปได้สำหรับนักพัฒนาที่จะไม่ทำตาม
Robert Rossney

8
ว้าวคำจำกัดความของคุณของ“ ง่ายต่อการทำลาย” และของฉันก็เหมือนตรงกันข้าม คุณหมายถึง“ ง่ายต่อการทำลายโดยตั้งใจ” ในขณะที่คนอื่น ๆ ส่วนใหญ่อาจหมายถึง "ง่ายต่อการทำลายโดยไม่ตั้งใจ " ฉันจะปล่อยให้มันเป็นแบบฝึกหัดให้ผู้อ่านหาว่าอันไหนที่มีความเกี่ยวข้องมากกว่าในการเขียนโค้ดที่อ่านได้ ...
Konrad Rudolph

6
@ Konrad: คุณฟังอวดรู้เมื่อคุณพูดว่า "เป็นการออกกำลังกายกับผู้อ่าน" นี่ไม่ใช่ตำราคณิตศาสตร์
jcollum

3
ความรู้สึกเชิงลบที่น้อยลงเล็กน้อยในขณะนี้ :) ในขณะที่เราอาจพายเรือกับกระแสไฟฟ้าฉันก็ไม่ชอบอนุสัญญาขีดเส้นใต้ ในมุมมองของฉันมันไม่ต่างกับสัญกรณ์ฮังการีและบอกตามตรงก็ทำให้ตาของฉันมีเลือดออก (เจ็บอ่านง่าย) เราโยนเครื่องหมายฮังการีด้วย C # และถึงเวลาที่จะเพิ่มพูนร่องรอยสุดท้ายของการไม่ไว้วางใจ IDE ของคุณ
Tim Long

1
ฉันได้ยินมาว่า MS บอกว่าขีดเส้นใต้ไม่ควรใช้ในคู่มือสไตล์ C # blogs.msdn.microsoft.com/brada/2005/01/26/… - ส่วนที่ 2.6 - ดูเหมือนว่า Brad Abrams จะเห็นด้วยกับเราอย่างน้อย!
jcollum

1

เมื่อคุณต้องการให้แอสเซมบลีของคุณเป็นไปตาม CLS คุณสามารถใช้แอตทริบิวต์ CLSCompliant ในไฟล์ assemblyinfo ของคุณ คอมไพเลอร์จะบ่นเมื่อรหัสของคุณมีเนื้อหาที่ไม่สอดคล้องกับ cls

จากนั้นเมื่อคุณมี 2 คุณสมบัติที่แตกต่างกันเฉพาะในกรณีที่คอมไพเลอร์จะออกข้อผิดพลาด ในทางกลับกันเมื่อคุณมีเขตข้อมูลส่วนตัวและทรัพย์สินสาธารณะในระดับเดียวกันจะไม่มีปัญหา

(แต่ฉันยังนำหน้าสมาชิกส่วนตัวของฉันด้วยการขีดเส้นใต้เสมอมันยังช่วยให้ฉันชัดเจนเมื่อฉันอ่านรหัสของฉันว่าตัวแปรบางตัวเป็นเขตข้อมูลสมาชิก)


0

ฉันชอบที่จะใช้เครื่องหมายขีดล่างหน้าฟิลด์ส่วนตัวของฉันด้วยเหตุผลสองประการ มีการกล่าวถึงหนึ่งแล้วเขตข้อมูลโดดเด่นจากคุณสมบัติที่เกี่ยวข้องในรหัสและใน Intellisense เหตุผลที่สองคือฉันสามารถใช้การตั้งชื่อแบบเดียวกันไม่ว่าฉันจะเขียนโค้ดใน VB หรือ C #


1
โอ้โหนั่นฉลาดไหม? ไม่ขีดเส้นใต้หมายความว่า 'ดำเนินการต่อในบรรทัดถัดไป' ใน VB หรือไม่
JBRWilkinson

1
เฉพาะในกรณีที่ขีดล่างตามด้วยช่องว่าง
Rob Windsor

อักษรตัวแรกเป็นกรณีที่ต่ำกว่าหรือกรณีบนโดดเด่นออกมาดีสำหรับฉัน :)
ManoDestra

0

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

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