คุณตั้งชื่อตัวแปรส่วนตัวใน C # ได้อย่างไร [ปิด]


25

แนวปฏิบัติที่ดีที่สุดคืออะไรหลักการจัดการการตั้งชื่อที่ยอมรับกันทั่วไปสำหรับตัวแปรส่วนตัวใน C #

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. ตัวเลือกอื่น ๆ ที่ลึกลับ

คุณใช้อันไหนและเพราะอะไร (บริษัท ของฉันค่อนข้างใหม่สำหรับ C # และฉันต้องการเลือกวิธี "ยอมรับในอุตสาหกรรม" มากที่สุดเพื่อลองใช้มาตรฐานการเข้ารหัสของเรา)


ทำไมไม่ใช้คุณสมบัติการใช้งานอัตโนมัติ? msdn.microsoft.com/en-us/library/bb384054.aspx
Kyle Ballard

1
C # มีมาตรฐานสำหรับสิ่งนี้โปรดดูstackoverflow.com/questions/14967/…
Tamara Wijsman

7
มันไม่ดีที่จะพูดถึงตัวแปรส่วนตัวในที่สาธารณะ ขออภัยที่ต้องทำ
Mark C

ฉันใช้เหมือนกับ azheglov (m_someVariable) โดยมีข้อยกเว้นว่าฉันจะใช้ _someVariable ภายในขอบเขตของวิธีการเท่านั้น
ลอร์ด-fu

7
@ มาร์คฉันคิดว่ามันควรจะเป็น "สมาชิกส่วนตัว" เพื่อที่จะเป็นแนวทาง
EpsilonVector

คำตอบ:


44

แนวทางการออกแบบคลาส MSDN http://msdn.microsoft.com/en-us/library/ta31s3bc.aspxแนะนำตัวเลือกที่ 1 - myInteger

ฉันมักจะใช้สไตล์นี้ ฉันไม่ชอบส่วนตัวสำหรับตัวละคร _


1
ฉันไม่ชอบตัวอักษร _ จนกระทั่ง resharper เพิ่มการจับคู่สตริงกลางลงใน Intellisence ตอนนี้ผมสามารถพิมพ์และมันจะตรงกับในmyInteger _myIntegerแต่ฉันไม่รู้ว่า MSDS บอกว่าห้ามใช้ _
Vaccano

4
หากคุณใช้ตัวเลือกที่ 1 ฉันจะทราบได้อย่างไรว่าmyIntegerตัวแปรท้องถิ่นเป็นวิธีการหรือสมาชิกคลาสส่วนตัว
Wizard79

4
@Lorenzo this.myInteger;)
TWith2Sugars

12
แต่ ... "นี่" คือ 4 ตัวอักษรและ "_" เป็นเพียงตัวเดียว! จริงๆแล้วแนวทางนั้นมีเหตุผลหลายอย่าง แต่ที่สำนักงานของฉันทุกคนชอบขีดเส้นใต้และเกลียดการได้เห็น "this.Foo" ไม่ว่าด้วยเหตุผลใดก็ตาม บางครั้งแนวทางเดียวที่สำคัญก็คือว่าที่ทำงานของคุณบังคับให้คุณ
CodexArcanum

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

25

ฉันใช้ตัวเลือก # 4 ด้านบน:

private int _myInteger;

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


5
ฉันไม่เห็นด้วยที่จะอ่านง่ายโดยเฉพาะถ้าคุณต้องทำงานกับตัวแปรหลายตัว
Restuta

15

ฉันใช้รูปแบบการตั้งชื่อต่อไปนี้:

  • 1st (myInteger) สำหรับตัวแปรที่กำหนดขอบเขต
  • 2nd (MyInteger) สำหรับคุณสมบัติสาธารณะ
  • 4th (_myInteger) สำหรับตัวแปรส่วนตัว

14

ฉันคิดว่าตัวเลือก 4 เป็นตัวเลือกที่อ่านง่ายที่สุดจริง ๆ ช่วยให้คุณไม่ต้องทำสิ่งนี้:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

นอกจากนี้ยังทำให้สมาชิกเอกชนทุกคนเห็นได้ชัดเจนขึ้น ในตัวอย่างต่อไปนี้ heck ageมาจากไหน หากไม่มีผู้thisคัดเลือกจึงเป็นการยากที่จะบอก

private void Method()
{
    var x = 2;
    var y = age + x;
}

นี่เป็นวิธีที่เข้าใจง่ายกว่า:

private void Method()
{
    var x = 2;
    var y = _age + x;
}

1
ฉันเคยสาบานด้วยตัวอย่างแรกของคุณ แต่หลังจากลองใช้ตัวเลือก # 4 สักพักฉันชอบใช้ขีดเส้นใต้เป็นส่วนนำหน้าสำหรับฟิลด์ส่วนตัว
Jeremy Wiebe

2
ฉันพูดว่าใช้ 1 สำหรับตัวแปรส่วนตัวใช้ 4 สำหรับตัวแปรส่วนตัวที่ใช้ในคุณสมบัติ
Evan Plaice

2
ฉันต้องไม่เห็นด้วยกับ ChaosPandoin สำหรับฉันการใช้งาน Method () ง่ายต่อการอ่าน ทันทีที่ฉันเห็นตัวแปรอายุ (หรือ _age) และสังเกตเห็นว่ามันไม่ได้ประกาศในวิธีการฉันรู้ว่ามันจะต้องประกาศที่อื่นในชั้นเรียน รอบคัดเลือกนี้แย่มาก แต่อย่างน้อยมันก็ จำกัด อยู่ที่วิธีการสร้าง
David Kennedy

10

ก่อนอื่น PascalCasing สงวนไว้สำหรับคุณสมบัติสาธารณะ consts วิธีการและอื่น ๆ ของคลาส ดังนั้นฉันจะข้าม 2 และ 5

ประการที่สองสัญกรณ์ฮังการีไม่ได้รับการสนับสนุนในโลก NET ดังนั้น (เอ่อฉันคิดว่า) 3 ถูกต้องแล้ว สมมติว่าเป็นสิ่งที่เกิดขึ้นกับ 3

ใบนั้นมี camelCasing และ _camelCasing ฉันมักจะใช้ _camelCasing สำหรับตัวแปรคลาสและ camelCasing แบบเก่าธรรมดาสำหรับตัวแปรที่กำหนดขอบเขตให้กับเมธอดหรือแคบกว่า ปลอก Camel เป็นมาตรฐานที่ได้รับการยอมรับที่ใช้สำหรับการโต้แย้งวิธีชื่อตัวแปรป้องกัน / ส่วนตัวและตัวแปรภายในวิธีการหรือขอบเขตที่แคบลง

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


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

1
@ ไม่สามารถมันไม่ชัดเจนใน intellisense โปรดจำไว้ว่าเขตข้อมูล (ตัวแปรที่มีคลาสที่มีขอบเขต) มีไอคอนเกือบจะเหมือนกันกับตัวแปรที่กำหนดขอบเขตวิธีดังนั้นพวกเขาจึงดูเหมือนกันถ้าคุณไม่ได้มองอย่างใกล้ชิด เครื่องหมายขีดเส้นใต้ช่วยแยกแยะความแตกต่างทางสายตาและจัดกลุ่มเข้าด้วยกันซึ่งช่วยหากคุณไม่ได้ใช้บ่อย (ซึ่งคุณไม่ควรเป็นเพราะรัฐเป็นศัตรูของการเขียนโปรแกรมปราศจากข้อบกพร่อง)
ฉีกออก

ฉันไม่เคยพูดอะไรเกี่ยวกับ Intellisense ฉันกำลังพูดถึงความแตกต่างระหว่าง Color.ClassMethod () และ myColor.InstanceMethod () คือควรเห็นได้ชัดว่าเนื่องจาก Color เป็นคลาส ClassMethod () เป็นวิธีการเรียน
ทางเลือก

@math คุณก่อน: I don't understand why you would use _camelCasing for class variables คุณหลังจาก: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()ขอโทษฉันในขณะที่ฉันสับสน ฟังฉันใช้ตัวแปรคลาสไม่ค่อยดังนั้นจึงเป็นการดีที่จะได้รับการเตือนชื่อของพวกเขาโดยการกดปุ่ม _ และให้พวกเขาทั้งหมดปรากฏขึ้นใน intellisense ดีและจัดกลุ่ม
ฉีกออก

2
@ คณิตศาสตร์: เมื่อจะพูดว่า "ตัวแปรระดับ" เขาหมายถึงฟิลด์ส่วนตัว (ส่วนตัว) คุณดูเหมือนจะตีความสิ่งที่เขาพูดว่าหมายถึงสมาชิกคงที่; แต่นั่นไม่ใช่สิ่งที่เขาพูด
ด่านเต่า

4

private int integer

หากคุณสับสนระหว่างสมาชิกและตัวแปรในขอบเขตในเมธอดคุณอาจต้องทำการปรับโครงสร้างใหม่


+1: นั่นคือสิ่งที่ฉันเชื่อว่าเป็นประเด็น BTW: ฉันเห็นที่มาของมัน แต่ชื่อintegerนั้นน่าจะเป็นถ้อยคำที่ดีกว่าvalueหรือเปล่า?
Wolf

2

ฉันเชื่อว่าวิธีที่ดีที่สุดที่จะทำ (ใน C # /. net ต่อไป) คือการรวมกันของ 2 และ 6:

private int MyInteger { get; set; }

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


2

ฉันเลือก # 4 เพราะนั่นคือสิ่งที่ SSCLI ดูเหมือน แต่จริง ๆ แล้วฉันไม่สนใจเรื่องการตั้งชื่อตัวแปรส่วนตัวมากนัก สาธารณะเป็นเรื่องที่แตกต่าง

BTW คุณลืม m_MyInteger


2

ฉันจะไม่เรียกมันว่า "ฉัน" อะไร!

แต่ฉันจะบอกว่า

class C
{
     int VariableName { get; set; }
}

ค่อนข้างบ่อยครั้งนี้ดีกว่าการมีตัวแปรที่ชัดเจน ถ้าฉันมีตัวแปรส่วนตัวที่ชัดเจนฉันจะเรียกมันว่าint _variableName;


1

ใน C ++ ฉันมักจะใช้ _ เนื่องจากฉันสลับผู้แก้ไขจำนวนมากซึ่งไม่อนุญาตให้ฉันดูว่าเป็นส่วนตัวหรือไม่

สำหรับ C # ฉันมักจะทิ้ง _ ไปเนื่องจาก Visual Studio อนุญาตให้ฉันดูว่าเป็นส่วนตัวหรือไม่

ฉันมักจะใช้วิธี Camel Case เพื่อทำสิ่งนี้


1

ฉันใช้ 4 ( private int _myInteger;) เพราะ:

private int myInteger;

นี่คือวิธีที่ฉันตั้งชื่อตัวแปรท้องถิ่นของฉัน

private int MyInteger;

นี่คือวิธีที่ฉันตั้งชื่อค่าคงที่

private int mMyInteger;

นี่ไม่ใช่สไตล์ C #

private int _MyInteger;

มันดูแปลก ๆ


1

ด้วยเครื่องหมายขีดล่าง

บิลแว็กเนอร์อธิบายว่าทำไมในที่มีประสิทธิภาพ C # แต่ฉันไม่เคยจะตั้งชื่อเป็นจำนวนเต็มของฉันจำนวนเต็ม , สิ่งที่ดีกว่าเช่น _age หรือ _length การรวม TypeName ในชื่ออินสแตนซ์เป็นวิธีปฏิบัติที่น่ากลัว ชื่อควรอธิบายด้วยตนเองและเนื่องจาก C # เป็นประเภทที่ปลอดภัยสามารถพบได้ตลอดเวลา


1
ใช่มันเป็นตัวอย่างแม้ว่า
Vaccano

1

คุณต้องให้ตัวอย่างที่เฉพาะเจาะจงมากขึ้น แต่:

private int count, private int badFileCount,private static readonly int ReconnectAttemptsLimit

โดยวิธีการที่คุณจะได้รับทั้งหมดนี้ฟรีMSFT Stylecopเมื่อคุณติดตั้งและเริ่มใช้ล่าสุดและยิ่งใหญ่ที่สุด


0

ฉันไปตามตัวเลือก 5: private int _MyFoo

ฉันไม่เห็นความได้เปรียบในการแข่งขันอย่างแท้จริงใน _myFoo


0

ใช้ camelCasing สำหรับตัวแปรส่วนตัวเช่น myInteger

พิจารณาก่อนหน้า_ว่าตัวแปรเป็นการสำรองข้อมูลสำหรับคุณสมบัติเพื่อลดความสับสน -
ตัวแปร_myPropertyสำหรับคุณสมบัติMyProperty


0

ฉันมี ReSharper ชื่อตัวแปรของฉันไม่เพียง แต่ฉัน แต่ทุกคนก็ทำได้เช่นกัน มีโครงการความสอดคล้องจำนวนมาก


0

IDesign C # Coding ของ Juval Lowyเป็นที่นิยมมาก มาตรฐานนี้แนะนำให้นำหน้าตัวแปรสมาชิกส่วนตัวด้วยคำนำหน้า "m_" (ตัวเลือก 6) นั่นคือสิ่งที่เราทำในทีมของเรา

private int m_myInteger;

ตัวเลือก 4 ( _myInteger) เป็นรูปแบบที่ยอมรับได้ของมาตรฐานนี้

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

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