Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#需要private关键字吗?_C#_Keyword_Language Lawyer - Fatal编程技术网

C#需要private关键字吗?

C#需要private关键字吗?,c#,keyword,language-lawyer,C#,Keyword,Language Lawyer,(灵感来自) 是否曾经有过需要使用private关键字的情况? (换句话说,省略关键字会导致不同的行为)private与运行时行为无关。这是为了使您的应用程序可维护。private隐藏的内容只能通过public或protected成员影响其类外的代码 因此,对于运行时行为,答案是“否”,对于开发人员行为,答案是“是” public class Foo { public int Bar { get; private set; } } 省略“private”一词会改变可访问性 省略关键字[

(灵感来自)

是否曾经有过需要使用
private
关键字的情况?

(换句话说,省略关键字会导致不同的行为)

private
与运行时行为无关。这是为了使您的应用程序可维护。
private
隐藏的内容只能通过
public
protected
成员影响其类外的代码

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

public class Foo
{
    public int Bar { get; private set; }
}
省略“private”一词会改变可访问性

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

David Yaw的回答给出了最常见的情况。这里还有一个:

账户中生成.cs

// Generated file. Do not edit!

public partial class Account
{
  ...

  private partial class Helper
  {
    ...
  }

  ...
}
public partial class Account
{
  ...

  public partial class Helper
  {
    ...
  }

  ...
}
AccountHandCoded.cs
中:

// Generated file. Do not edit!

public partial class Account
{
  ...

  private partial class Helper
  {
    ...
  }

  ...
}
public partial class Account
{
  ...

  public partial class Helper
  {
    ...
  }

  ...
}
上面的代码将不会编译。
Account
的第一个“部分”要求嵌套类
Helper
private
。因此,手工编码者将
助手
公开的尝试必须失败

然而,如果类的第一部分只是省略了
private
关键字,那么所有的类都可以编译

因此,对于
partial
类(以及结构、接口),无访问级别声明

partial class Name
表示“允许该类的其他‘部分’决定可访问性应该是什么”

而明确给出默认的可访问性(对于非嵌套类型是
内部的
,对于嵌套类型是
私有的
),则意味着“这个类必须具有尽可能受限的访问权限,其他“部分”不能改变这一事实”。

在C#7.2版及更高版本中

private protected
关键字组合是成员访问修饰符。从包含类派生的类型可以访问受私有保护的成员,但只能在其包含程序集中访问


正确。斯莱克斯:当然,C#2.0是六年前发布的,所以“C#2.0新手”有点自相矛盾。很长一段时间以来,属性中的混合可访问性一直是该语言的一个特点。@Eric:True。我想知道在C#1中是否需要
private
。有趣的是,当对属性或索引器中的访问器(getter/setter)应用访问修改器时,与没有修改器时相比,您限制了该getter/setter的可访问性。在C#中的所有其他情况下,指定成员的访问修改器会放松对该成员的访问(因为没有任何访问修改器的默认值是可能的最受限的访问)。@EricLippert删除
private
关键字也很重要的另一种情况(参见我的新答案)对C#2来说也是“新的”。现在已经是八年前了,如果我能正确增加你的年数的话。SLaks提出的在C#1中该关键字总是可以省略的猜想仍然成立。问题似乎更多的是,如果完全省略访问修饰符,那么默认情况下几乎总是导致
private
访问。不过,正如张贴的两个答案所表明的那样;它只是“几乎”。我已经删除了我的答案,因为事实证明你不能在命名空间作用域中有一个私有委托。
private
非嵌套类型没有任何意义;它将与
内部
相同。