ตัวดัดแปลงการเข้าถึงภายในและส่วนตัว


คำตอบ:


516

ภายในสำหรับขอบเขตแอสเซมบลี (เช่นเข้าถึงได้จากรหัสใน. exe หรือ. dll เดียวกันเท่านั้น)

ส่วนตัวสำหรับขอบเขตของคลาส (เช่นสามารถเข้าถึงได้จากรหัสในคลาสเดียวกันเท่านั้น)


6
ฉันมีคำถามอย่างรวดเร็ว; ถ้าฉันประกาศคลาสเป็นส่วนตัวในเนมสเปซภายในแอสเซมบลีกับคลาสที่อยู่ภายในฉันสามารถเข้าถึงคลาสนั้นภายในแอสเซมบลีในทั้งสองกรณีดังนั้นอะไรคือความแตกต่างระหว่างคลาสส่วนตัวและคลาสภายใน หรือเป็นโมดิฟายเออร์ส่วนตัวและภายในในแง่ของคลาสที่ใช้เมื่อซ้อนคลาสภายในคลาส?
mayotic

2
ฉันเพิ่มเฉพาะโครงการ / แอสเซมบลีเป็นข้อมูลอ้างอิงของโครงการอื่นและทั้งส่วนตัวเช่นเดียวกับภายในป้องกันไม่ให้ฉันเข้าถึงคลาสนี้โดยเฉพาะใน namespace ดังนั้นอีกครั้ง ... ความแตกต่างระหว่างคลาสส่วนตัวและภายในคืออะไร ขอบคุณ
mayotic

9
คุณไม่สามารถประกาศคลาสระดับบนสุดเป็นแบบส่วนตัวได้ คอมไพเลอร์จะหยุดคุณ
TheGateKeeper

6
@NetSkay: ถ้าคุณประกาศคลาสส่วนตัวภายในคลาสสาธารณะคลาสนี้จะไม่สามารถเข้าถึงได้โดยคลาสอื่นในแอสเซมบลีของคุณ แต่ถ้าคุณประกาศคลาสนี้ว่าเป็นภายในก็จะสามารถเข้าถึงได้ในแอสเซมบลี แม้ว่าพวกเขาทั้งสองจะไม่สามารถเข้าถึงได้นอกการชุมนุม
Yogesh Jindal

2
หากคุณมาจากพื้นหลัง VB.NET คำสำคัญ "ภายใน" ของ C # จะเทียบเท่ากับคำหลัก "เพื่อน" ของ VB.NET
Brain2000

207

ค้นหาคำอธิบายด้านล่าง คุณสามารถตรวจสอบลิงค์นี้เพื่อดูรายละเอียดเพิ่มเติมได้ที่ http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html

ส่วนตัว: - สมาชิกส่วนตัวสามารถเข้าถึงได้เฉพาะภายในประเภทของตัวเอง (ชั้นเรียนของตัวเอง)

ภายใน: - สมาชิกภายในสามารถเข้าถึงได้เฉพาะภายในแอสเซมบลีโดยการสืบทอด (ชนิดที่ได้รับ) หรือตามอินสแตนซ์ของคลาส

ป้อนคำอธิบายรูปภาพที่นี่

เอกสารอ้างอิง:

dotnetbull - ตัวดัดแปลงการเข้าถึงใน c # คืออะไร


17
ที่น่าสนใจที่ให้การเข้าถึงที่กว้างกว่าProtected Internal Protected
Dan Bechard

9
@ แดนเห็นด้วยอย่างถี่ถ้วน มันอาจจะเป็นประโยชน์ในการอ่านและคิดว่าเป็นprotected internal protected OR internal
chessofnerd

7
อะไรWith Typeหมายถึง?
James Wierzba

@Dan ใช่ฉันคิดว่ามันก็จะทำหน้าที่เป็นตารางความจริงและANDเมทริกซ์ที่ | จริงเท็จ | เท็จ | protected internalเท็จ ไม่ง่าย แต่มันเป็นความจริง | | จริง | OR'dจริงเท็จเช่นถ้า
ferr

1
อนึ่ง C # 7.2 เพิ่งเพิ่มตัวแก้ไข "ที่ได้รับการป้องกันและภายใน" ถึงแม้ว่าคำหลักที่เลือกไว้private protectedจะไม่ง่ายนัก สำหรับรายละเอียด: docs.microsoft.com/en-us/dotnet/csharp/language-reference/ ......
Joe Sewell

70

internalสมาชิกสามารถมองเห็นรหัสทั้งหมดในแอสเซมบลีที่พวกเขาจะประกาศมา
(และแอสเซมบลีอื่นอ้างอิงโดยใช้[InternalsVisibleTo]คุณลักษณะ )

privateสมาชิกสามารถมองเห็นได้เฉพาะในชั้นเรียนที่ประกาศ (รวมถึงคลาสที่ซ้อนกัน)

ไม่สามารถประกาศคลาส outer (ที่ไม่ซ้อนกัน) privateเนื่องจากไม่มีขอบเขตที่จะทำให้เป็นส่วนตัว

เพื่อตอบคำถามที่คุณลืมขอให้protectedสมาชิกเป็นเหมือนprivateสมาชิก แต่ยังปรากฏให้เห็นในทุกชั้นเรียนที่รับประเภทการประกาศ (แต่ในนิพจน์อย่างน้อยประเภทของคลาสปัจจุบัน)


8

เอกชน - การห่อหุ้มในคลาส / ขอบเขต / โครงสร้าง ect '

ภายใน - การห่อหุ้มในการประกอบ


6

สมาชิกส่วนตัวสามารถเข้าถึงได้เฉพาะภายในร่างกายของชั้นเรียนหรือโครงสร้างที่พวกเขาจะประกาศ

ภายในประเภทหรือสมาชิกจะสามารถเข้าถึงได้เฉพาะภายในไฟล์ในการชุมนุมเดียวกัน


ดังนั้นการใช้สิ่งนี้แตกต่างกันอย่างไร ฉันยังไม่เข้าใจ: X
เดดฟิช

4
ส่วนตัวสามารถเข้าถึงได้จากภายในระดับเท่านั้นภายในสามารถเข้าถึงได้จากภายในสภา (โครงการใน VS VS ไฟล์ dll / exe)
Jesper Fyhr Knudsen

3

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

Entity Framework ใช้ประโยชน์จากการเข้าถึงประเภทนี้ได้ดี


0

สมาชิกภายในสามารถเข้าถึงได้ภายในชุดประกอบ (เข้าถึงได้ในโครงการเดียวกันเท่านั้น)

สมาชิกส่วนตัวสามารถเข้าถึงได้ภายในชั้นเดียวกัน

ตัวอย่างสำหรับมือใหม่

มี 2 ​​โครงการในโซลูชัน (Project1, Project2) และ Project1 มีการอ้างอิงถึง Project2

  • วิธีสาธารณะที่เขียนใน Project2 จะสามารถเข้าถึงได้ใน Project2 และ Project1
  • วิธีการภายในที่เขียนใน Project2 จะสามารถเข้าถึงได้ใน Project2 เท่านั้น แต่ไม่สามารถใช้ใน Project1
  • วิธีส่วนตัวที่เขียนใน class1 ของ Project2 จะสามารถเข้าถึงได้ในคลาสเดียวกันเท่านั้น มันจะไม่สามารถเข้าถึงได้ในคลาสอื่น ๆ ของโครงการ 2 ไม่ได้อยู่ในโครงการ 1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.