1

可能重复:
为什么 Visual Studio 默认不创建公共类?

msdn链接告诉我们

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx

Class 的默认成员可访问性是私有的

请说明默认情况下是内部还是私有?

4

5 回答 5

8

所有成员的默认值是“您可以指定的最私密的” 1

因此默认情况下是嵌套类型private,但默认情况下是顶级类型internal

namespace Foo
{
    class ThisIsInternal
    {
        class ThisIsPrivate
        {
        }
    }
}

所有类型的规则都是相同的——不管是类、接口、结构、枚举还是委托。


1除了特定的属性 getter/setter 略有例外,当您使属性更加私密时,您只能明确说明属性的一部分。

// The getter is public, the setter is private
public string Foo { get; private set; }
于 2013-02-02T09:39:17.167 回答
2

Class 的默认成员可访问性是私有的

您将成员(nested class)可访问性与non-nested类可访问性混淆了。我从您在问题中给出的链接中提取了以下内容。

不嵌套在其他类型中的顶级类型只能具有内部或公共可访问性。这些类型的默认可访问性是 internal ,reference

嵌套类的可访问性默认情况下是私有的。

于 2013-02-02T09:29:10.773 回答
2

在您提到的文章中,明确规定如果Class 在另一个 class 内,则默认情况下访问将是私有的。访问级别可以更改

无法将顶级类创建为私有

于 2013-02-02T09:39:37.130 回答
1

这是我们的测试对象:

class AccessibilityTest
{
    class Nested {}
    struct NestedStruct {}
    enum NestedEnum { A }
    int Field;
    void Method() {}
}

使用 Visual Studio 2012 编译类,然后在自己喜欢的反射工具中反编译。结果是:

internal class AccessibilityTest
{
    private class Nested
    {
    }
    [StructLayout(LayoutKind.Sequential, Size = 1)]
    private struct NestedStruct
    {
    }
    private enum NestedEnum
    {
        A
    }
    private int Field;
    private void Method()
    {
    }
}

可以看出,顶级类型默认是内部的。默认情况下,嵌套成员是私有的。

于 2013-02-02T09:38:37.133 回答
1

一个类有时默认是内部的(当顶级时)有时是私有的(当嵌套时),这可能看起来很奇怪。然而,这仅仅意味着默认情况下所有访问修饰符都是最大限制的。这也意味着私有这个词的几乎所有用法都是多余的——只有那些在属性访问器上的用法才有意义(它们可以限制对其他非私有属性的访问)。

所以我更喜欢将默认值视为一致的——即在概念上是私有的,并且关键字不一致——internal有时意味着保持本地上下文,有时意味着授予对整个程序集的访问权限:-)。而且private几乎总是没有任何意义——它是纯粹的样板,因此最好省略(属性访问器除外)。

于 2013-02-02T10:35:50.403 回答