Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类在.net中是私有的还是内部默认的?_C#_.net - Fatal编程技术网

C# 类在.net中是私有的还是内部默认的?

C# 类在.net中是私有的还是内部默认的?,c#,.net,C#,.net,可能重复: msdn链接告诉我们 类的默认成员可访问性是私有的 请解释默认情况下它是内部的还是私有的 类的默认成员可访问性是私有的 您将成员(嵌套类)可访问性与非嵌套类可访问性混淆。我从你在问题中给出的链接中摘录了以下内容 未嵌套在其他类型中的顶级类型只能具有 内部或公共可访问性。这些文件的默认可访问性 类型是内部的 不过,嵌套类的可访问性在默认情况下是私有的 类的默认成员可访问性是私有的 您将成员(嵌套类)可访问性与非嵌套类可访问性混淆。我从你在问题中给出的链接中摘录了以下内容 未嵌套在其

可能重复:

msdn链接告诉我们

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

请解释默认情况下它是内部的还是私有的

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

您将成员
(嵌套类)
可访问性与
非嵌套类可访问性混淆。我从你在问题中给出的链接中摘录了以下内容

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

不过,嵌套类的可访问性在默认情况下是私有的

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

您将成员
(嵌套类)
可访问性与
非嵌套类可访问性混淆。我从你在问题中给出的链接中摘录了以下内容

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


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

下面是我们的测试主题:

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()
    {
    }
}

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

这是我们的测试主题:

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()
    {
    }
}

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

所有成员的默认值为“您可以指定的最私有的”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; }

所有成员的默认值为“您可以指定的最私密”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; }

在您提到的文章中,明确指出,如果类位于另一个类中,那么默认情况下访问将是私有的可以更改访问级别


不可能将顶级类创建为private

在您提到的文章中,很明显,如果类位于另一个类中,那么默认情况下访问将是private可以更改访问级别


不可能将顶级类创建为私有类

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


因此,我更倾向于将默认值视为一致的,即概念上是私有的,关键字不一致-
internal
有时意味着保持上下文的局部性,有时意味着授予对整个程序集的访问权:-)。而且
private
几乎总是没有任何意义-它是纯样板文件,因此最好不要使用它(除了在属性访问器中)。

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


因此,我更倾向于将默认值视为一致的,即概念上是私有的,关键字不一致-
internal
有时意味着保持上下文的局部性,有时意味着授予对整个程序集的访问权:-)。而且
private
几乎总是没有任何意义-它是纯样板文件,因此最好不要使用它(除了在属性访问器中)。

但是嵌套类型不是这样。但是嵌套类型不是这样。如果要用反射来检查这一点,请注意,嵌套类型和非嵌套类型也可以使用不同的属性集。对于非嵌套类型,应选中
typeof(ThisIsInternal).Public
typeof(ThisIsInternal).NotPublic
。对于嵌套类型,使用
typeof(ThisIsPrivate).IsNestedPublic
typeof(ThisIsPrivate).IsnestedFamorasem
typeof(ThisIsPrivate).IsNestedFamily
typeof(ThisIsPrivate).IsNestedPrivate
。在嵌套类型上使用非嵌套类型的属性(反之亦然)不会给出答案。如果要使用反射检查这一点,请注意,嵌套类型和非嵌套类型也可以使用不同的属性集。对于非嵌套类型,应选中
typ