Does C# need the private keyword?

2019-01-22 12:47发布

(inspired by this comment)

Is there ever a situation in which you need to use the private keyword?
(In other words, a situation in which omitting the keyword would result in different behavior)

4条回答
Lonely孤独者°
2楼-- · 2019-01-22 13:04
public class Foo
{
    public int Bar { get; private set; }
}

Omitting the word 'private' would change the accessibility.

查看更多
beautiful°
3楼-- · 2019-01-22 13:06

private isn't about the runtime behaviour. It's to make your application maintainable. What's hidden by private can only ever affect the code outside its class through the public or protected members.

So the answer is 'no' for runtime behaviour, 'yes' for developer behaviour!

查看更多
贪生不怕死
4楼-- · 2019-01-22 13:12

In C# version 7.2 and later.

The private protected keyword combination is a member access modifier. A private protected member is accessible by types derived from the containing class, but only within its containing assembly.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private-protected

查看更多
We Are One
5楼-- · 2019-01-22 13:21

a situation in which omitting the keyword [private] would result in different behavior

David Yaw's answer gave the most usual situation. Here is another one:

In Account_generated.cs:

// Generated file. Do not edit!

public partial class Account
{
  ...

  private partial class Helper
  {
    ...
  }

  ...
}

In AccountHandCoded.cs:

public partial class Account
{
  ...

  public partial class Helper
  {
    ...
  }

  ...
}

The above code will not compile. The first "part" of Account requires the nested class Helper to be private. Therefore the attempt by the hand-coder to make Helper public must fail!

However, had the first part of the class simply omitted the private keyword, all would compile.

So for partial classes (and structs, interfaces), the access-level-free declaration

partial class Name

means "the other 'parts' of this class are allowed to decide what the accessibility should be".

Whereas explicitly giving the default accessibility (which is internal for non-nested types and private for nested ones) means "this class must have the most restricted access possible, and the other 'parts' cannot change that fact".

查看更多
登录 后发表回答