C#中的默认访问修饰符

13
如果我创建一个类似下面这样的新对象,它默认会有哪个访问修饰符?
Object objectA = new Object();
8个回答

33
任何成员都将始终具有最严格的访问级别 - 因此在这种情况下,objectA 的可访问性是 private。(假设它是一个实例变量。如果它是一个局部变量,那么它没有任何访问规则,因此没有意义。)
所以这样:
class Foo
{
    Object objectA = new Object();
}

等价于这个:

internal class Foo
{
    private Object objectA = new Object();
}

"默认为最私有"是指对于类型,其可访问性取决于上下文。这意味着:

class Outer
{
    class Nested
    {
    }
}

等同于这个:

internal class Outer
{
    private class Nested
    {
    }
}

这是因为你不能拥有一个私有的非嵌套类。

只有在属性声明中才有一种情况可以使用显式访问修饰符使其比没有更加私有:

public string Name { get; set; } // Both public

public string Name { get; private set; } // public get, private set

1
似乎你应该在其中一个类中包含一个实际的成员字段,并展示它也会转换为“private”,不是吗?在我看来,这是OP最关心的主要问题:成员字段的可访问性。 - Dan Tao
@Dan:第一句话不是已经解释了吗?这个例子旨在演示对于类型,默认访问权限如何根据上下文而变化。这是在回答第一句话中的实际问题之后提供的额外信息。 - Jon Skeet
@Jon:是的,我只是觉得在实际的代码示例中包含它会特别生动形象;这就是全部。我认为展示有修饰符和没有修饰符的代码之间的等价性是很好的。 - Dan Tao
通常我会说访问修饰符应该明确声明(我认为StyleCop也同意这一点)。顺便提一下,基于“private”表示不可在其自身范围之外访问的前提条件,对于外部类而言,“private”和“internal”在技术上不是等价的,因为它的作用域是整个程序集本身。 - Flynn1179
我不知道有私有设置,谢谢你提供的信息! - Richard J. Ross III
显示剩余3条评论

3
默认情况下,它是私有的。

3
void Foo()
{
    // private in method scope
    Object objectA = new Object();
}

class Bar()
{
    // private in class scrope
    Object objectA = new Object();
}

2
作为一个类成员:private
如果它是在方法体内声明的局部变量,则在该方法外部无法访问。但我猜你已经知道了这一点。

2

对于类成员和结构体成员,包括嵌套的类和结构体,默认为私有。

对于类和结构体,默认为 internal。

你可以查看 MSDN 进行进一步阅读。


所以你可以给我发电子邮件 orenab1@gmail.com。但是你不能偏爱我的回答,而忽略更好的回答。同时,这里不允许使用非英语语言。请尊重规定 (-: - Oren A

0

类/类型本身将默认为“internal”。您创建的对象将默认为“private”。


0

默认情况下,类和结构体被声明为内部的!

这里阅读更多信息。


嵌套类型不是...请查看我的答案。 - Jon Skeet
OP询问的是对象,而不是类型。 - Dan Tao

0

类的访问修饰符是 internal。

变量的访问修饰符是 private。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接