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