有人能解释一下c#中受保护的内部修饰符和受保护的内部修饰符的区别吗?看起来它们的行为是一样的。
当前回答
我已经把这些术语的定义读得很清楚了。
Protected:访问限制在类定义内以及从该类继承的任何类内。类型或成员只能通过同一类或结构中的代码或从该类派生的类中的代码访问。
内部:访问仅限于当前项目程序集中定义的类。类型或成员只能由同一类中的代码访问。
Protected-Internal:访问权限仅限于从包含类派生的当前程序集或类型。
其他回答
受保护的内部最佳套件:当您希望在来自另一个程序集的派生类中使用成员或类型,同时只想在父程序集中使用该成员或类型,而不从声明它的类派生时。 此外,如果您只想使用不从其他类派生的成员或类型,则在同一程序集中只能使用internal。
保护成员
类的受保护成员仅在包含类中可用(在其中声明了类),并且在程序集内部和程序集外部的派生类中可用。
表示驻留在程序集外部的类仅通过继承该类来使用其他程序集的受保护成员。
可以通过继承该类在程序集外部公开Protected成员,并仅在派生类中使用它。
注意:不能使用派生类中的对象访问受保护的成员。
内部成员
类的内部成员是可用的,或在程序集中创建对象或在派生类中访问,或者您可以说可以在程序集中的所有类中访问它。
注意:内部成员不能在程序集外部使用对象创建或在派生类中访问。
保护内部
Protected内部访问修饰符为Protected或Internal的组合。
受保护内部成员可以在其声明创建对象或通过继承该类的整个程序集中使用。并且只能在派生类的程序集之外访问。
注意:受保护的内部成员在同一程序集内作为内部成员工作,在程序集外作为受保护成员工作。
可以将protected internal看作是在同一个字段、属性或方法上应用两个访问修饰符(protected和internal)。
在现实世界中,想象一下我们为人们提供参观博物馆的特权:
城里的每个人都可以参观博物馆(内部)。 父母居住的城市以外的任何人都可以参观博物馆(受保护)。
我们可以这样把它们放在一起:
城内(内部)和城外(受保护)所有父母居住在这里的人都可以参观博物馆(受保护的内部)。
编程世界:
internal:该字段在程序集(项目)中的任何地方都可用。这就像说它在它的项目范围内是公共的(但不能在项目范围外访问,甚至不能被从该类继承的程序集之外的那些类访问)。该类型的每个实例都可以在该程序集(项目范围)中看到它。
Protected:仅仅意味着所有派生类都可以看到它(在程序集内部或外部)。例如,派生类可以使用:base.NameOfProtectedInternal查看其方法和构造函数内部的字段或方法。
所以,把这两个访问修饰符放在一起(protected internal),你就有了一些可以在项目内公开的东西,并且可以被那些在他们的作用域内继承了该类的人看到。
它们可以写在内部保护,并且不改变意思,但是方便写在内部保护。
下表显示了其中的差异。Protected internal与Protected相同,只是它还允许来自同一程序集中其他类的访问。
public——声明为public的成员(函数和变量)可以从任何地方访问。
private -私有成员不能从类外部访问。这是成员的默认访问说明符,即如果你没有为成员(变量或函数)指定访问说明符,它将被认为是私有的。因此,string PhoneNumber;相当于私有字符串PhoneNumber。
protected -受保护的成员只能从子类访问。
internal -只能在同一个程序集中访问它。
protected internal -它可以在同一个程序集中访问,也可以在派生类中访问。
推荐文章
- 如何强制LINQ Sum()返回0而源集合是空的
- 将值附加到查询字符串
- Selenium c# WebDriver:等待元素出现
- 我如何添加双引号的字符串,是在一个变量?
- 如何创建数组。包含不区分大小写的字符串数组?
- 检查字符串是否包含字符串列表中的元素
- 最好的方法在asp.net强制https为整个网站?
- 将字符串转换为System.IO.Stream
- 如何从枚举中选择一个随机值?
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头