Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 什么是;“私人”;你怎么办?_C#_.net_Private_Access Modifiers_Private Members - Fatal编程技术网

C# 什么是;“私人”;你怎么办?

C# 什么是;“私人”;你怎么办?,c#,.net,private,access-modifiers,private-members,C#,.net,Private,Access Modifiers,Private Members,考虑到“private”是类成员的默认访问修饰符,为什么还要使用关键字呢?它是为您(以及未来的维护人员)提供的,而不是为编译器提供的。明确性。我从不使用默认值,总是显式添加修饰符 这可能是因为我的Java背景,默认值是“package”(大致相当于C#中的“internal”),所以这种差异一直困扰着我。我发现清晰更可取 我现在也使用ReSharper,默认为显式,因此它只确认并强化了我的偏见:)为了对称,为了符合喜欢一切都显式的编码风格(我个人喜欢…)一些编码风格建议您将所有“公共”项放在第一

考虑到“private”是类成员的默认访问修饰符,为什么还要使用关键字呢?

它是为您(以及未来的维护人员)提供的,而不是为编译器提供的。

明确性。我从不使用默认值,总是显式添加修饰符

这可能是因为我的Java背景,默认值是“package”(大致相当于C#中的“internal”),所以这种差异一直困扰着我。我发现清晰更可取


我现在也使用ReSharper,默认为显式,因此它只确认并强化了我的偏见:)

为了对称,为了符合喜欢一切都显式的编码风格(我个人喜欢…)

一些编码风格建议您将所有“公共”项放在第一位,然后是“私人”项。如果没有“private”关键字,你就不能这样做


更新:我没有注意到这个“C++”标签,所以我的答案更多地应用于C++而不是C。有些人实际上更喜欢在代码中明确说明方法上的访问修饰符。

实际上,如果类或结构没有使用访问修饰符声明,则默认为内部


因此,如果要将其设置为私有,请使用private。

私有修饰符解释意图

私有成员变量不用于类外的直接操作。可以为变量创建get/set访问器,也可以不为变量创建

私有方法不打算在类之外使用。这可能仅用于内部功能。或者可以将默认构造函数设为私有,以防止在不传入值的情况下构造类


private修饰符(以及其他类似的修饰符)是编写自文档代码的一种有用方法。

使用private明确表示您的意图,并为支持您的代码的其他人留下线索;)

Private只是类型上方法的默认值,但是Private修饰符在其他地方使用

来自第3.5.1节

根据成员声明发生的上下文,只允许某些类型的已声明可访问性。此外,当成员声明不包含任何访问修饰符时,声明发生的上下文将确定默认声明的可访问性

  • 命名空间隐式地具有公共声明的可访问性。命名空间声明上不允许使用访问修饰符
  • 在编译单元或名称空间中声明的类型可以具有公共或内部声明的可访问性和默认值 到内部声明的可访问性
  • 类成员可以具有五种声明的可访问性中的任意一种,默认为私有声明的可访问性。(请注意,声明为类成员的类型可以具有五种声明的可访问性中的任意一种,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
  • 结构成员可以具有公共、内部或私有声明的可访问性,并且默认为私有声明的可访问性,因为结构是隐式密封的。结构中引入的结构成员(即,不是该结构继承的)不能具有受保护或受保护的内部声明可访问性。(请注意,声明为结构成员的类型可以具有公共、内部或私有声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
  • 接口成员隐式地具有公共声明的可访问性。接口成员声明上不允许使用访问修饰符
  • 枚举成员隐式地具有公共声明的可访问性。枚举成员声明上不允许使用访问修饰符

我通常不使用private,但我发现它对排列代码很有用:

private   int    x;
public    string y;
protected float  z;
VS:


正如Jon Skeet在他的书《C#Depth》中指出的那样,C#中有一个地方需要使用private关键字才能达到效果

如果我的内存使用正确,那么当私有关键字的对立面具有大于私有可访问性时,私有关键字是创建私有范围的属性getter或setter的唯一方法。例如:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

实现这一点需要private关键字,因为附加的属性可访问性修饰符只能缩小范围,而不能扩大范围。(否则,您可能已经能够创建一个私有(默认)属性,然后添加一个公共修饰符。)

正如他在回答中所说的,
private
修饰符不仅用于成员,也用于类型。这一点变得很重要,因为类型的默认值是
内部
,如果您使用

则可能会无意中泄漏。此处存在一定数量的错误信息:

“默认访问修饰符不是私有的,而是内部的”

那要看你在说什么了。对于类型的成员,它是私有的。对于顶级类型本身,它是内部的

“Private只是类型上方法的默认值”

不,它是一个类型的所有成员的默认值——属性、事件、字段、运算符、构造函数、方法、嵌套类型以及我忘记的任何其他内容

实际上,如果类或结构未使用访问修饰符声明,则默认为内部

仅适用于顶级类型。对于嵌套类型,它是私有的

除了限制一部分而不是另一部分的属性访问之外,默认设置基本上总是“尽可能地限制”

就我个人而言,我对是否明确的问题犹豫不决。使用默认设置的“优点”是,它会在任何地方突出显示您正在使某些内容比最严格的级别更可见。明确指定它的“专业”是,对于那些不了解上述规则的人来说,它更为明显,这表明您已经考虑了一点

埃里克·利珀特与泰晤士报同行
public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}