ภายในเทียบกับสาธารณะใน c #


92

ฉันต้องการทราบความแตกต่างระหว่างตัวปรับการมองเห็นpublicและinternalการมองเห็น

เราควรใช้internalในชั้นเรียนเมื่อใดและเมื่อpublicใด ฉันกำลังสับสนกับเมื่อวิธีการที่ควรจะเป็นหรือpublicinternal

ฉันอ่านว่าinternalสามารถเข้าถึงได้ผ่านแอสเซมบลีในขณะที่publicสามารถใช้ผ่านแอสเซมบลีที่ความแตกต่างอยู่

คำตอบ:


101

public สามารถมองเห็นได้จากทุกที่

internal สามารถมองเห็นได้ภายในชุดประกอบเท่านั้น

คุณมักจะใช้ภายในเพื่อปกป้อง API ภายในเท่านั้น ตัวอย่างเช่นคุณสามารถแสดงวิธีการที่มากเกินไปได้หลายวิธี:

public int Add(int x, int y)
public int Add(int x,int y, int z)

ซึ่งทั้งสองเรียกวิธีการภายใน

internal int Add(int[] numbers)

จากนั้นคุณสามารถเพิ่มความซับซ้อนให้กับวิธีการได้ แต่ "ป้องกัน" โดยใช้วิธีการจัดซุ้มซึ่งอาจช่วยให้โปรแกรมเมอร์เรียกวิธีการได้อย่างถูกต้อง (วิธีการใช้งานกับพารามิเตอร์อาร์เรย์อาจมีขีด จำกัด ของค่าโดยพลการตัวอย่างเช่น)

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


5
ในคลาสภายในฉันสามารถประกาศวิธีการสาธารณะ .. ?
NoviceToDotNet

ไม่เพราะจะทำให้เกิดความขัดแย้ง คอมไพเลอร์จะบอกคุณถึงสิ่งนี้และไม่สามารถคอมไพล์ได้
Program.X

14
@ Program.X: จริงๆแล้วคุณทำได้และคอมไพเลอร์ไม่ได้บอกอะไรคุณเลย
หรือผู้ทำแผนที่

อันที่จริงฉันมาที่นี่เพื่อดูว่านี่เป็นฟีเจอร์จริงหรือไม่ ลองนึกภาพการทำชั้นและวิธีการทั้งหมดinternal publicหากคุณต้องการการมองเห็นที่สูงขึ้นคุณสามารถตั้งค่าทั้งชั้นเรียนpublicอีกครั้ง แต่ฉันไม่แน่ใจว่ามันหมายถึงการใช้แบบนี้หรือไม่ ก็เลย googling ต่อไป ... แก้ไข Et voilàหัวข้อเดิม: stackoverflow.com/questions/9302236/…
ecth

31

internalมีประโยชน์เมื่อคุณต้องการประกาศสมาชิกหรือพิมพ์ภายใน DLL ไม่ใช่ภายนอกนั้น ...
โดยปกติเมื่อคุณประกาศสมาชิกตามที่Publicคุณสามารถเข้าถึงได้จาก DLL อื่น ๆ Internalแต่ถ้าคุณต้องการที่จะประกาศอะไรบางอย่างที่เป็นสาธารณะเพียงภายในห้องสมุดชั้นของคุณคุณสามารถประกาศเป็น
ในการป้องกันอย่างเป็นทางการ: สมาชิกภายในสามารถมองเห็นได้เฉพาะในชุดประกอบปัจจุบัน ...


11

internalยังมีประโยชน์เมื่อเขียนแบบทดสอบหน่วย InternalsVisibleToแอตทริบิวต์ให้การทดสอบของคุณวิธีการภายในการเข้าถึงการชุมนุมในรหัสของคุณประกอบ กล่าวคือคุณสามารถทดสอบวิธีการที่ปรากฏเป็นส่วนตัวต่อโลกภายนอกโดยไม่ต้องใช้การสะท้อนกลับ


6

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


4

นอกจากนี้คุณสมบัติที่ทำเครื่องหมายว่าinternalจะส่งBindingExpression path errorถ้าใช้สำหรับ DataBinding ใน WPF ดังนั้นสิ่งเหล่านี้จะต้องpublicทำงานได้อย่างถูกต้องแม้ว่า DataBinding จะเกิดขึ้นภายในแอสเซมบลีเดียวกันก็ตาม


1

โดยทั่วไปpublicวิธีการควรเป็นไปตามมาตรฐานที่สูงมากสำหรับความทนทาน (ไม่ใช่การขัดข้องหรือข้อมูลเสียหายเนื่องจากการป้อนข้อมูลที่ไม่ถูกต้อง) และการรับรู้ด้านความปลอดภัย (ไม่อนุญาตให้ป้อนข้อมูลที่ไม่คาดคิดเพื่อเรียกใช้ประโยชน์) แต่สำหรับinternal, protectedและprivateวิธีการก็มักจะเป็นเหตุผลที่จะเป็นไปตามมาตรฐานที่ผ่อนคลายมากขึ้นตั้งแต่หนึ่งมีการควบคุมเต็มรูปแบบผ่านสิ่งที่ปัจจัยการผลิตแต่ละวิธีจะได้รับ

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

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


-3

หากคุณสามารถอ้างอิงแอสเซมบลีจากภายนอกได้แสดงว่าคุณมีขอบเขตคลาสภายในและคลาสสาธารณะ

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