没有访问修饰符的方法

54

好的,这个问题困扰着我...我知道我在某个地方读到过它,但Google没有帮助。

如果一个方法没有指定访问修饰符,它的可访问级别是什么?

void Foo()
{
    //code
} 

我想说 internal,但我不确定。

8个回答

60

类型的默认可访问性是 internal,但该类型的成员的默认可访问性取决于这个类型。

一般来说,的成员默认情况下是private,而结构体的成员则默认为public。这也因语言而异;对于C++,结构体的默认访问修饰符为public,而对于C#,则为private。


7
你们确定要这样点踩吗?如果我在一个C#类中放置一个没有访问修饰符的方法,C# 3.0编译器会将其构建为私有方法。 - Steve Guidi
1
Steve是正确的。类方法的默认可访问性是“private”。你可以自己试试看。 - Michael Petrotta
1
这个答案是正确的。我在VS2010中验证过了,因为我最初也以为它是错误的。 - Donnie
3
在C++中,struct的成员默认为public,但根据MSDN页面所述(该页面从其他答案中链接过来),在C#中,struct的成员默认为private - Daniel Pryden
1
-1 是因为两个权威参考资料都说在 C# 中,struct 的成员默认是 private。(其中 MSDN 是一个,另一个是《C# 程序设计语言》第三版。) - Daniel Pryden
1
成员变量的默认访问级别,无论是结构体还是类,默认情况下为私有(private),如果未指定。以下是支持此说法的MSDN链接。在“类和结构体可访问性”一节的第二段中可以看到明显的说明: https://msdn.microsoft.com/zh-cn/library/ms173121.aspx - RBT

24
假设这是一个C#方法,因为你打了“.net”标签。
人们需要区分“成员”可访问性和“类”可访问性。

21

是的,internal 是类的默认访问级别,但 private 是成员变量的默认访问级别。


12

对于一个类:如果没有指定访问修饰符,则默认为 internal。

对于一个方法:如果没有指定访问修饰符,则默认为 private。


8

来自Anders Hejlsberg等人所著的The C# Programming Language, Third Edition,第10.3.5节("类成员-访问修饰符")第434页:

class-member-declaration可以声明五种可能的访问权限之一(§3.5.1):publicprotected internalprotectedinternalprivate。除了protected internal组合外,如果指定了多个访问修饰符,则会在编译时出错。当不包括任何访问修饰符时,默认为private

然后在第11.2节("结构成员")第539页中:

除了§11.3中指出的差异,§10.3至§10.14提供的类成员描述也适用于结构成员。

第11.3节未提及任何访问修饰符,因此我理解没有指定访问修饰符的struct成员默认为private。这与MSDN所述以及我的经验相符。


5

哦,等等,还有一件事…

interface方法声明在定义时默认是public的。因此,下面这个实现也是public的,没有显式指定访问修饰符。

public class MyClass : IEqualityComparer<MyClass>
    bool IEqualityComparer<MyClass>.Equals(MyClass x , MyClass y) {}
}

顺便提一下,接口方法不能是私有的。 - Dragon
哦,是的...推荐继承EqualityComparer,而不是实现接口。请参阅“备注”。 - radarbob

0
希望这张来自MSDN的截图可以澄清所有问题。

enter image description here


0

在.NET中,类方法默认为私有和密封的。 这意味着该方法仅在类内部可见,并且不能被继承类覆盖。


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