เหตุผลใดที่ต้องเขียนคีย์เวิร์ด "ส่วนตัว" ใน C #


109

เท่าที่ผมรู้ว่าprivateเป็นค่าเริ่มต้นทุกที่ใน C # (หมายถึงว่าถ้าผมไม่ได้เขียนpublic, protected, internalฯลฯ มันจะเป็นprivateค่าเริ่มต้น) (กรุณาแก้ไขฉันถ้าฉันผิด)

แล้วเหตุผลที่ต้องเขียนคีย์เวิร์ดนั้นคืออะไรหรือทำไมถึงมีไว้สำหรับสมาชิก?

ตัวอย่างเช่นเมื่อตัวจัดการเหตุการณ์สร้างขึ้นโดยอัตโนมัติจะมีลักษณะดังนี้:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

แต่ทำไมมันถึงเขียนว่าเป็นส่วนตัวถ้าเป็นนัยและเป็นค่าเริ่มต้น? เพียงเพื่อให้นักพัฒนามือใหม่ (ที่ไม่รู้ว่าเป็นค่าเริ่มต้น C #) รู้ว่ามันเป็นส่วนตัว? หรือคอมไพเลอร์มีความแตกต่างกันอย่างไร

นอกจากนี้ยังมีกรณีที่การเขียน "ส่วนตัว" (คนเดียว) จะเปลี่ยนการเข้าถึงของสมาชิกหรือไม่?


18
IIRC ประเภท "ระดับบนสุด" จะเป็นinternalค่าเริ่มต้นอย่างไรก็ตาม
Jeff Mercado

4
ค่าเริ่มต้นสำหรับทุกสิ่งไม่ได้เป็นส่วนตัวตามที่ระบุไว้และโดยทั่วไปแล้วจะเป็นการดีกว่าที่จะเปิดเผยอย่างชัดเจน
James Michael Hare


ค่าเริ่มต้นสำหรับทุกอย่างคือ "เป็นส่วนตัวที่สุด" เห็นได้ชัดว่าคลาสที่ไม่ซ้อนกันต้องไม่เป็นส่วนตัวหรือไม่มีสิ่งใดสามารถสร้างอินสแตนซ์หรือใช้งานได้ แต่สมาชิกจะเป็นแบบส่วนตัวโดยค่าเริ่มต้นและคลาสที่ซ้อนกันจะเป็นแบบส่วนตัวโดยค่าเริ่มต้น โดยค่าเริ่มต้นทุกอย่างใน C # จะมีระดับการมองเห็นที่ จำกัด มากที่สุด
Ryan Lundy

คำตอบ:


171

AFAIK ส่วนตัวเป็นค่าเริ่มต้นทุกที่ใน C # (หมายความว่าถ้าฉันไม่เขียนสาธารณะป้องกันภายในและอื่น ๆ มันจะเป็นส่วนตัวตามค่าเริ่มต้น) (กรุณาแก้ไขฉันถ้าผิด)

นี่ไม่เป็นความจริง. ประเภทที่กำหนดภายในเนมสเปซ (คลาสโครงสร้างอินเทอร์เฟซ ฯลฯ ) จะอยู่ภายในโดยค่าเริ่มต้น นอกจากนี้สมาชิกภายในประเภทต่างๆยังมีความสามารถในการเข้าถึงเริ่มต้นที่แตกต่างกัน (เช่นสาธารณะสำหรับสมาชิกอินเทอร์เฟซ) สำหรับรายละเอียดโปรดดูระดับการช่วยสำหรับการเข้าถึงบน MSDN

นอกจากนี้

แล้วเหตุผลที่ต้องเขียนคีย์เวิร์ดนั้นคืออะไรหรือทำไมถึงมีอยู่?

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


1
@ Wayne: เขามีคำตอบที่ได้คะแนนสูงกว่า Jon Skeet แต่เขาไม่สมควรได้รับ ... คำตอบของ Jon นั้นแม่นยำกว่ามาก
aleroot

2
นี่คือความแตกต่างที่ไม่มีจุดหมาย ประเภทภายในเนมสเปซเป็นประเภทภายในโดยค่าเริ่มต้นเนื่องจากไม่สามารถเป็นส่วนตัวได้ตามค่าเริ่มต้น มิฉะนั้นจะไม่มีอะไรใช้พวกเขาได้ พวกเขายังคงถูก จำกัด เท่าที่จะทำได้โดยค่าเริ่มต้น
Ryan Lundy

1
ความสามารถในการเข้าถึงของสมาชิกเริ่มต้นสำหรับคลาส inisde และโครงสร้างเป็นแบบส่วนตัว ตรวจสอบที่นี่: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca

แต่องค์ประกอบภายในเนมสเปซไม่สามารถเป็นprivateได้
Shimmy Weitzhandler

นอกจากนี้getและเป็นsetค่าเริ่มต้นในการเข้าถึงคุณสมบัติของตัวเอง
AustinWBryan

119

AFAIK ส่วนตัวเป็นค่าเริ่มต้นทุกที่ใน C #

ไม่มากค่าเริ่มต้นคือ "การเข้าถึงที่ จำกัด มากที่สุดสำหรับการประกาศนี้" ตัวอย่างเช่นด้วยประเภทระดับบนสุดค่าเริ่มต้นคือinternal; privateสำหรับชนิดที่ซ้อนกันเริ่มต้นคือ

แล้วเหตุผลที่ต้องเขียนคีย์เวิร์ดนั้นคืออะไรหรือทำไมถึงมีอยู่?

มันทำให้ชัดเจนซึ่งดีด้วยเหตุผลสองประการ:

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

ส่วนสุดท้ายของคุณ:

นอกจากนี้ยังมีกรณีที่การเขียน "ส่วนตัว" (คนเดียว) จะเปลี่ยนการเข้าถึงของสมาชิกหรือไม่?

ใช่สำหรับการทำให้ครึ่งหนึ่งของทรัพย์สินมีข้อ จำกัด มากกว่าที่อื่น:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

ฉันเคยใช้ค่าเริ่มต้นในทุกที่ที่ทำได้ แต่ฉันเชื่อมั่น (ส่วนหนึ่งโดย Eric Lippert) ว่าการทำให้ชัดเจนว่าคุณคิดเกี่ยวกับเรื่องนี้และตัดสินใจที่จะทำสิ่งที่เป็นส่วนตัวเป็นความคิดที่ดี

ส่วนตัวผมต้องการมีวิธีการทำที่สำหรับปิดผนึก / เปิดผนึกเกินไปสำหรับประเภทการประกาศ - อาจจะไม่ได้มีการเริ่มต้น ฉันสงสัยว่านักพัฒนาหลายคน (รวมตัวเองด้วยหากฉันไม่ระวัง) ออกจากชั้นเรียนโดยไม่ปิดผนึกเพียงเพราะใช้ความพยายามน้อยกว่าการปิดผนึก


+1. การใช้คีย์เวิร์ดอื่นที่ไม่เกี่ยวข้องเพื่อส่งสัญญาณเจตนาทางความหมายจะมีประโยชน์แม้ว่าพื้นหลัง Java ของฉันจะทำให้การใช้finalตัวอย่างทั่วไปมากขึ้น
jprete

1
@minitech: วิธีอื่น ๆ ก็ใช้ได้เช่นกัน แต่มีประโยชน์น้อยกว่า ทั้งหมดนี้เปิดตัวใน C # 2
Jon Skeet

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

+1 "สำหรับประเภทที่ซ้อนกันค่าเริ่มต้นเป็นส่วนตัว" - ฉันเพิ่งทราบเรื่องนี้เมื่ออ่านคำตอบของคุณ ขอบคุณ!
Nordin

5
@ พงษ์สำหรับ C # มีกฎง่ายๆข้อหนึ่งคือโดยค่าเริ่มต้นทุกอย่างจะเป็นส่วนตัวเท่าที่จะเป็นไปได้ รายการในเนมสเปซเช่นคลาสที่ไม่ซ้อนกันไม่สามารถเป็นแบบส่วนตัวได้เนื่องจากไม่มีสิ่งใดสามารถใช้ได้ สามารถเป็นได้เฉพาะภายในหรือสาธารณะเท่านั้น โดยค่าเริ่มต้นจะเป็นแบบภายใน สิ่งที่อยู่ภายในของสิ่งอื่น (enums ภายในคลาสคลาสที่ซ้อนกันคุณสมบัติฟิลด์วิธีการ ... ) เป็นส่วนตัวโดยค่าเริ่มต้น
Ryan Lundy

11

privateเพิ่มความยุ่งเหยิงทางสายตา สำหรับคนที่ยืนยันว่ามันทำให้สิ่งที่ชัดเจนฉันจะถาม: คุณทำเช่นนี้กับคณิตศาสตร์ด้วยหรือไม่? ตัวอย่างเช่น:

var answer = a + b / c;

คุณพบว่าไม่ชัดเจนโดยไม่มีวงเล็บซ้ำซ้อนb / cหรือไม่?

กฎใน C # นั้นง่ายมากโดยค่าเริ่มต้นทุกอย่างจะใกล้เคียงกับความเป็นส่วนตัวมากที่สุด ดังนั้นหากคุณต้องการบางสิ่งบางอย่างที่จะเป็นมากขึ้นที่มองเห็นได้กว่าค่าเริ่มต้นให้เพิ่มส่วนขยาย มิฉะนั้นอย่าเพิ่มคำหลักที่ไม่จำเป็นลงในโค้ดของคุณ


1
ฉันเคยเห็นด้วยกับสิทธินี้ก่อนที่จะถามคำถาม แต่บางคนเขียน VB, C ++ บางคนก็ F # (มาจากภาษาที่ใช้งานได้อื่น ๆ เช่น Haskell อาจ?) ดีกว่าที่พวกเขาทำใน C # ดังนั้นสำหรับพวกเขา (และสำหรับเราถ้าเราลืมเรื่องนี้หลังจาก 2 ปีที่ไม่มี c # ing) จะดีกว่าถ้า accessors มีความชัดเจน อย่าประเมินผลกระทบที่เกิดจากการเรียนรู้อย่างง่าย ๆ ในโครงการนักพัฒนาจำนวนมากมาจากภูมิหลังซึ่งอาจไม่สะท้อนถึงเครื่องมือที่เลือกและพวกเขาต้องการอุปกรณ์ช่วยเรียนรู้แม้ในรหัสการผลิตสิ่งนี้ก็ไม่เลวเลย (และเรารู้ว่าหลาย ๆ รหัส C # แย่มากดังนั้นความช่วยเหลือบางอย่างช่วยเราด้วย)
Camilo Martin

3
แน่นอนว่าใน VB ค่าเริ่มต้นนั้นโหดร้าย ฉันคิดว่าการเปิดเผยเริ่มต้นมีFriendไว้สำหรับสมาชิกเช่น C # ตั้งค่าการมองเห็นเป็นค่าเริ่มต้นอย่างถูกต้อง: สิ่งต่างๆจะถูกตั้งค่าให้มองเห็นได้น้อยที่สุดเว้นแต่จะมีการเปลี่ยนแปลง จากสิ่งที่ฉันสามารถหาได้ดูเหมือนว่า C ++ จะเป็นจริง (ยกเว้นโครงสร้าง) (ดูเหมือนจะไม่เป็นความจริงสำหรับ F #)
Ryan Lundy

6
มันแปลกกับผมว่าผู้คนจำนวนมากอยู่ในความโปรดปรานของเพราะมันลดลงในภาพวุ่นและยังผู้คนจำนวนมากอยู่ในความโปรดปรานของการพิมพ์เปล่าvar private
Ryan Lundy

2
ฉันจะไปไกลถึงการโต้แย้งว่าความยุ่งเหยิงของภาพขัดขวางความสามารถในการอ่าน!
binki

1
โหวตเพิ่มแม้ว่าฉันจะชอบใช้วงเล็บในกรณีตัวอย่างคณิตศาสตร์ของคุณ
Marc.2377

7

เท่าที่ฉันรู้ส่วนตัวเป็นค่าเริ่มต้นทุกที่ใน C #

การประกาศความเป็นส่วนตัวอย่างชัดเจนหมายความว่าคุณรู้ว่าเป็นส่วนตัว ไม่ใช่แค่คิดเท่านั้นเพราะเท่าที่ทราบมันเป็นค่าเริ่มต้น นอกจากนี้ยังหมายความว่าคนอื่นที่ดูรหัสจะรู้ว่ามันคืออะไร

ไม่มีคือ "ฉันคิดว่ามันเป็น", "ผมค่อนข้างมั่นใจว่ามันคือ" ฯลฯมันก็คือ และทุกคนอยู่ในหน้าเดียวกัน

ฉันไม่ใช่ผู้พัฒนาC # ถ้าผมจะทำงานร่วมกับโค้ดบางส่วนที่ไม่ได้ประกาศอย่างชัดเจนส่วนตัวผมก็อาจจะถือว่ามันเป็นภายใน

ฉันไม่ชอบเมื่อสิ่งต่างๆถูกกำหนดโดยปริยาย ไม่ชัดเจนเท่ากับเวลาที่กำหนดไว้อย่างชัดเจน


ฟังดูสมเหตุสมผลฉันลืมพื้นฐานของภาษาที่ฉันเคยรู้ดีกว่าด้วยซ้ำ
Camilo Martin

6

ความสามารถในการอ่าน - ทุกคนอาจไม่ทราบว่าส่วนตัวเป็นพฤติกรรมเริ่มต้น

เจตจำนง - ให้การบ่งชี้ที่ชัดเจนว่าคุณได้ประกาศให้ทรัพย์สินนั้นเป็นส่วนตัวโดยเฉพาะ (ไม่ว่าด้วยเหตุผลใดก็ตาม)


5

ความสามารถในการอ่านการแสดงเจตนาเป็นเหตุผลสำคัญสองประการที่ฉันคิดได้


เห็นด้วย เช่นหากคุณกำลังทำงานร่วมกับนักพัฒนาซอฟต์แวร์รายอื่นโดยใช้โค้ดเล็กน้อยการตั้งค่าบางอย่างเป็นส่วนตัวจะช่วยบ่งชี้เจตนาของคุณ นอกจากนี้ยังมีประโยชน์เมื่อคุณย้อนกลับไปที่รหัสของคุณหลังจากผ่านไปหลายปีและ IDE ของคุณสามารถบอกคุณได้ว่าควรเข้าถึงวิธีใดแบบสาธารณะสำหรับชั้นเรียนนั้น
Aaron Newton

3

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

อีกเหตุผลที่ดีเพราะFxCopบอกให้คุณทำ


+1 ฉันเพิ่งสังเกตเห็นเกี่ยวกับ FxCop ที่บ่นว่าฉันลบตัวปรับแต่งส่วนตัวตอนนี้เมื่อฉันสร้างขึ้นพร้อมกับการเปลี่ยนแปลง
Camilo Martin

2

ผู้คนจำนวนมาก (เช่นฉัน!) มักจะเขียนโปรแกรมเป็นภาษาต่างๆ การมีความชัดเจนกับสิ่งต่างๆเช่นนี้ทำให้ฉันไม่จำเป็นต้องจำรายละเอียดลึกลับทั้งหมดของภาษาทั้งหมดที่ฉันเขียนโปรแกรม


1
ฉันจะไม่บอกว่า "ตัวปรับการเข้าถึงเริ่มต้นคือprivate" เป็นรายละเอียดที่ลึกลับ ... แต่ฉันเข้าใจประเด็นนี้ วันก่อนฉันมีปัญหาในการจำว่ากรอบงานที่ฉันใช้เมื่อสัปดาห์ที่แล้ว ( MEF ) ทำงานอย่างไร
Camilo Martin

0

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


4
คุณกำลังคิดถึง C ++ ใน C # แม้ในโครงสร้างสมาชิกจะเริ่มต้นเป็นส่วนตัว

3
โครงสร้างไม่มีการเข้าถึงแบบสาธารณะโดยค่าเริ่มต้นโปรดดู: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.