C#需要私有关键字吗?

SLa*_*aks 25 c# keyword language-lawyer

(受此评论的启发)

是否存在需要使用private关键字的情况?
(换句话说,省略关键字会导致不同行为的情况)

Dav*_*Yaw 47

public class Foo
{
    public int Bar { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

省略"私人"一词会改变可访问性.

  • @SLaks:当然,C#2.0六年前出货,所以"C#2.0的新手"有点像矛盾.在很长一段时间内,酒店的混合可访问性已经成为该语言的一个特色. (7认同)
  • @Eric:是的.我想知道C#1是否需要`private`. (3认同)
  • 有趣的是,当将访问修改器应用于属性或索引器中的访问器(getter/setter)时,您将限制**该getter/setter的可访问性,与没有修改器时的访问者相比.在C#的所有其他情况下,为成员指定访问修改程序**放宽了对该成员的访问权限(因为没有任何访问修改程序的默认设置是最受限制的访问权限). (3认同)

Jep*_*sen 8

省略关键字[ private]会导致不同行为的情况

David Yaw的回答给出了最常见的情况.这是另一个:

Account_generated.cs:

// Generated file. Do not edit!

public partial class Account
{
  ...

  private partial class Helper
  {
    ...
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

AccountHandCoded.cs:

public partial class Account
{
  ...

  public partial class Helper
  {
    ...
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不会编译.第一个"部分"的Account 要求的嵌套类Helperprivate.因此,手工编码器Helper公开的尝试必定会失败!

但是,如果类的第一部分只是省略了private关键字,那么所有都会编译.

因此对于partial类(和结构,接口),访问级别的声明

partial class Name
Run Code Online (Sandbox Code Playgroud)

意味着"允许该类的其他'部分'决定可访问性应该是什么".

而明确给出默认可访问性(internal适用于非嵌套类型和嵌套类型private)意味着"此类必须具有最受限制的访问权限,而其他"部分"不能改变这一事实".