Jay*_*Jay 63 .net c# access-modifiers c#-7.2
C#7.2引入了private protected modifier.
我总是保护对具有属性的字段的访问,允许通过Get/Set方法进行访问,因为我通常不希望我的对象的内部状态被我自己的类以外的任何东西修改.
我试图理解为什么C#语言团队添加了这个功能.经过广泛搜索谷歌,阅读和观看"什么是新的"媒体(我看过Mads Torgerson的新闻稿,详细信息和视频),我仍然没有更聪明.
对我来说,这似乎允许开发人员打破Liskov替换原则,但这可能是因为我不明白为什么现在存在此功能.
我理解它是如何使用的,而不是为什么 - 请有人提供一个真实的使用示例而不是MSDN文档中的人为例子吗?
Evk*_*Evk 64
在C#7.2之前我们有protected internal修饰符.这实际上意味着受保护的OR内部,即 - 成员A可以访问子类以及当前程序集中的任何类,即使该类不是类的子类A(因此放宽了"受保护"所暗示的限制).
private protected真的意味着保护和内部.也就是说 - 成员只能访问同一个程序集中的子类,而不能访问程序集之外的子类(因此"受保护"所暗示的限制变窄 - 变得更加严格).如果在程序集中构建类的层次结构并且不希望其他程序集中的任何子类访问该层次结构的某些部分,那么这非常有用.
我们可以举出Jon Skeet 在评论中提供的例子.假设你上课了
public class MyClass {
}
Run Code Online (Sandbox Code Playgroud)
并且您希望能够仅在当前程序集中继承它,但不希望允许直接实例化此类,除非在此类层次结构中.
可以使用内部构造函数实现仅在当前程序集内继承
public class MyClass {
internal MyClass() {
}
}
Run Code Online (Sandbox Code Playgroud)
除了使用当前类层次结构之外,可以使用受保护的构造函数来实现防止直接实例化:
public class MyClass {
protected MyClass() {
}
}
Run Code Online (Sandbox Code Playgroud)
要获得两者 - 你需要private protected构造函数:
public class MyClass {
private protected MyClass() {
}
}
Run Code Online (Sandbox Code Playgroud)
Sur*_*yan 10
对于双字访问修饰符,我有这个概念 - 第一个访问器与另一个组件相关,第二个访问器与定义它的组件相关.
保护内部
在另一个程序集中受保护:只能在子类中访问.
当前程序集中的内部:当前程序集中的每个人都可以访问.
私人保护
让我们假设您有一个内部类SomeHelper,您希望将其用作公共抽象基类实现的一部分:
public abstract class Test
{
// Won't compile because SomeHelper is internal.
protected SomeHelper CreateHelper()
{
return new SomeHelper();
}
public int Func(int x)
{
var helper = CreateHelper();
return helper.DoSomething(x);
}
}
internal class SomeHelper
{
public virtual int DoSomething(int x)
{
return -x;
}
}
Run Code Online (Sandbox Code Playgroud)
这将无法编译,因为您无法使用受保护的方法返回内部类型.你唯一的办法就是不要SomeHelper以这种方式使用,也不要SomeHelper公开.
(你可以创建SomeHelper一个受保护的内部类Test,但如果SomeHelper打算供其他不从基类派生的类使用,那么它就无法工作.)
随着该private protected功能的引入,您可以这样声明CreateHelper():
private protected SomeHelper CreateHelper()
{
return new SomeHelper();
}
Run Code Online (Sandbox Code Playgroud)
现在它将编译,您不必暴露您的内部.
| 归档时间: |
|
| 查看次数: |
4504 次 |
| 最近记录: |