作为GitHub上Roslyn文档的一部分,有一个名为语言功能实现状态的页面,具有C#和VB的计划语言功能.
我无法理解的一个功能是private protected访问修饰符:
private protected string GetId() { … }
Run Code Online (Sandbox Code Playgroud)
还有一个C#语言设计笔记页面,它解释了许多新功能,但不是这个.
Eric Lippert在评论中说:
您的错误在于将修饰符视为增加限制.实际上,修饰符总是减少限制.请记住,默认情况下,事物是"私人的"; 只有通过添加修饰符才能减少限制.
是什么意思private protected?我什么时候可以使用它?
对于支持访问修饰符的所有不同概念,例如字段,属性,方法和类,如果未指定,则隐含哪些访问修饰符?
在尝试使用Typescript的时候,我意识到模块中的类(用作命名空间)不可用于其他类,除非我export在它们之前编写了关键字,例如:
module some.namespace.here
{
export class SomeClass{..}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我可以使用上面这样的代码:
var someVar = new some.namespace.here.SomeClass();
Run Code Online (Sandbox Code Playgroud)
但是我只是想知道为什么使用这个关键字而不是仅仅使用public在方法级别使用的关键字来表示方法或属性应该是外部可访问的.那么为什么不使用相同的机制来使类和接口等在外部可见?
这将产生如下结果的代码:
module some.namespace.here
{
public class SomeClass{..}
}
Run Code Online (Sandbox Code Playgroud) 如果我没有明确说明方法或实例变量的默认访问修饰符是什么?
例如:
package flight.booking;
public class FlightLog
{
private SpecificFlight flight;
FlightLog(SpecificFlight flight)
{
this.flight = flight;
}
}
Run Code Online (Sandbox Code Playgroud)
此构造函数的访问修饰符是受保护的还是包的?同一个包中的其他类可以flight.booking调用这个构造函数吗?
据我所知,private是默认无处不在C#中(也就是说,如果我不写public,protected,internal等这将是private默认情况下).(如果我错了,请纠正我.)
那么,编写该关键字的原因是什么,或者为什么它甚至存在于成员中?
例如,当自动生成事件处理程序时,它看起来像这样:
private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
但是,如果暗示和默认,为什么它甚至写私人?只是为了让新手开发人员(不知道它是C#默认值)知道它是私有的吗?或者编译器有区别吗?
此外,是否存在写"私人"(单独)会改变会员的可访问性的情况?
我正在编写一个由两部分组成的小型Python模块:
起初,我决定通过使用它在函数内部定义它来"隐藏"这个实现类,但这妨碍了可读性,如果多个函数重用同一个类,则不能使用它.
那么,除了评论和文档字符串之外,是否有一种机制将类标记为"私有"或"内部"?我知道下划线机制,但据我所知它只适用于变量,函数和方法名称.
我对一些文档使用的术语"包私有"以及"默认访问"的使用感到有些困惑.包私有和默认访问都不是protected的同义词吗?
在Java中,private访问修饰符被认为是安全的,因为它在类之外是不可见的.然后外界也不知道那种方法.
但我认为Java反射可以用来打破这个规则.考虑以下案例:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Run Code Online (Sandbox Code Playgroud)
现在从另一个班级我将获得信息:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
此时我只是认为私有方法安全,因为做上面的事情我们必须知道方法名称.但是如果包含由其他人编写的私有方法的类我们没有那些可见性.
但是,由于下面的代码行,我的观点变得无效.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Run Code Online (Sandbox Code Playgroud)
现在这method[]包含了上面需要做的所有事情.我的问题是,有没有办法避免使用Java反射这类事情?
我引用Java文档中的一些观点来澄清我的问题.
选择访问级别的提示:
如果其他程序员使用您的类,您希望确保不会发生滥用错误.访问级别可以帮助您执行此操作.使用对特定成员有意义的最严格的访问级别.除非你有充分的理由不使用私人.
class Test{
public static void main(String arg[]){
System.out.println("**MAIN METHOD");
System.out.println(Mno.VAL);//SOP(9090);
System.out.println(Mno.VAL+100);//SOP(9190);
}
}
class Mno{
final static int VAL=9090;
static{
System.out.println("**STATIC BLOCK OF Mno\t:"+VAL);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道static在加载类时执行的块.但是在这种情况下,类中的实例变量Mno是final因为static块没有执行.
为什么会这样?如果我删除它final,它会工作正常吗?
首先分配哪个内存,static final变量或static块?
如果由于final访问修饰符而没有加载类,那么变量如何获取内存?
面向对象编程中的公共,私有和受保护是什么?
access-modifiers ×10
java ×4
c# ×2
private ×2
typescript ×2
c#-6.0 ×1
c#-7.2 ×1
class ×1
definition ×1
module ×1
oop ×1
protected ×1
public ×1
python ×1
reflection ×1
static ×1
terminology ×1