C#需要使用private关键字吗?

28

(受这个评论的启发)

在IT技术中,是否存在需要使用 private 关键字的情况?
换言之,省略此关键字会导致不同的行为吗?


我已经删除了我的答案,因为事实证明在命名空间范围内无法拥有私有委托。 - Yuriy Faktorovich
没错。一个private的非嵌套类型没有任何意义;它与internal相同。 - SLaks
4个回答

47
public class Foo
{
    public int Bar { get; private set; }
}
省略“private”这个词会改变访问权限。

1
正确。我不确定为什么我没想到那个。 - SLaks
请注意,这个功能(混合可见性访问器)是C# 2.0的新功能。 - SLaks
7
当然,C# 2.0已经发布了六年,因此“对C# 2.0的新功能”有点矛盾。属性中的混合访问已经成为该语言的特性很长一段时间了。 - Eric Lippert
3
@Eric: 确实。我在想C# 1中是否需要使用private关键字。 - SLaks
3
有趣的是,当在属性或索引器中对访问器(getter/setter)应用访问修饰符时,与没有修饰符相比,您会限制该getter/setter的可访问性。在C#的所有其他情况下,指定成员的访问修饰符会放宽对该成员的访问(因为默认情况下没有任何访问修饰符是最受限制的访问)。 - Jeppe Stig Nielsen
1
@EricLippert 取消 private 关键字对另一种情况也会造成影响(请参阅我的新回答),这也是 C# 2 中的“新”功能。如果我正确理解你的年份计算,那么现在已经过去八年了。SLaks 的推测是,在 C# 1 中始终可以省略该关键字。 - Jeppe Stig Nielsen

8

如果省略关键字 [private] 将导致不同的行为

David Yaw的回答给出了最常见的情况。这里是另一个例子:

Account_generated.cs文件中:

// Generated file. Do not edit!

public partial class Account
{
  ...

  private partial class Helper
  {
    ...
  }

  ...
}

AccountHandCoded.cs 文件中:
public partial class Account
{
  ...

  public partial class Helper
  {
    ...
  }

  ...
}

上述代码将无法编译。 帐户 的第一个“部分”需要嵌套类Helper private。因此,手写代码中尝试将Helper设置为公共的尝试将失败!

但是,如果类的第一部分简单地省略了private关键字,则所有内容都会编译。

因此,对于partial类(和结构体、接口),访问级别自由声明。

partial class Name

意为“这个类的其他‘部分’可以决定可访问性应该是什么”。

而明确地给出默认可访问性(非嵌套类型的默认可访问性为internal,嵌套类型的默认可访问性为private)意味着“这个类必须具有最受限制的访问权限,其他‘部分’不能改变这个事实”。


1

private并不涉及运行时行为,而是为了使您的应用程序易于维护。被private隐藏的内容只能通过publicprotected成员影响其类外部的代码。

因此,答案对于运行时行为是“否”,对于开发人员行为是“是”!


1
问题似乎更多地涉及到如果完全省略访问修饰符,它几乎总是默认为private访问。正如现在发布的两个答案所建议的那样,这只是“几乎”。 - Andrew Barber

1

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