【问题标题】:What does the "private" modifier do?“私人”修饰符有什么作用?
【发布时间】:2010-09-13 08:10:23
【问题描述】:

考虑到“private”是类成员的默认访问修饰符,为什么甚至需要关键字?

【问题讨论】:

  • 冗余部为您带来!
  • @Kiwi:关于您的编辑 - 这也是班级的默认设置,而不仅仅是班级成员,对吧?
  • 类的默认值是内部的,而不是私有的。
  • 布拉德:那应该是“冗余部”:)

标签: c# .net private access-modifiers private-members


【解决方案1】:

这里有一定的错误信息:

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

嗯,这取决于你在说什么。对于一个类型的成员,它是私有的。对于顶级类型本身,它是内部的。

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

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

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

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

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

就个人而言,我在是否明确的问题上犹豫不决。使用默认值的“优点”是它突出显示您正在制作的东西比最严格的级别更明显的任何地方。明确指定的“亲”是对不了解上述规则的人来说更明显,这表明您已经考虑了一点。

Eric Lippert 采用显式形式,我也开始采用这种方式。

请参阅http://csharpindepth.com/viewnote.aspx?noteid=54 了解更多信息。

【讨论】:

  • 在某些版本的 .NET 中,struct 成员的默认修饰符不是“public”吗?还是我对其他事情感到困惑?
  • @Konamiman:我不记得了。也许在预发布中?
  • 我第一次接触 .NET 是在 2003 年,v1.1。也许我确实无意中阅读了一些预发布文档。
  • 恕我直言,显式形式更好。要考虑的另一件事是默认值可能会随着时间而改变。即使在这种情况下不太可能,我个人认为明确通常是更好的方法。
  • @Zohar:我同意明确表示,但我认为默认值随时间变化的想法是不现实的。不妨考虑一下private含义随时间变化的可能性。
【解决方案2】:

它是给你(和未来的维护者)的,而不是编译器。

【讨论】:

    【解决方案3】:

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

    这可能是因为我的 Java 背景默认是“包”(大致相当于 C# 中的“内部”),所以这种差异一直困扰着我。我发现明确性更可取。

    我现在也使用 ReSharper,它默认是显式的,所以它只会确认和强化我的偏见 :)

    【讨论】:

      【解决方案4】:

      private 修饰符解释意图。

      私有成员变量不适用于类外的直接操作。可能会或可能不会为变量创建 get/set 访问器。

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

      private 修饰符(以及其他类似的修饰符)可能是编写自我记录代码的有用方式。

      【讨论】:

        【解决方案5】:

        正如 Jon Skeet 在他的书C# In Depth 中所指出的,C# 中有一个地方需要 private 关键字来实现效果。

        如果我没记错的话,private 关键字是创建私有作用域的属性 getter 或 setter 的唯一方法,当它的对立面的可访问性大于私有可访问性时。示例:

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

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

        【讨论】:

          【解决方案6】:

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

          来自C# Language Specification 3.0 (msdn) 第 3.5.1 节

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

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

          【讨论】:

            【解决方案7】:

            为了完整性。有些人实际上更喜欢在他们的代码中明确说明他们方法的访问修饰符。

            【讨论】:

              【解决方案8】:

              为了对称和符合喜欢一切都明确的编码风格(我个人喜欢它......)

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

                  一些编码风格建议您首先放置所有“公共”项目,然后是“私人”项目。如果没有“private”关键字,您就无法这样做。

                  更新:我没有注意到“c#”标签,所以我的回答更多地适用于 C++ 而不是 C#。

                  【讨论】:

                  • 嗯,可见性在 C# 中不像在 C++ 中那样是模态的。 private 关键字在它不是默认的时候是必要的(并且有这样的时候,比如类声明),但是在方法前面加上“private”确实是多余和不必要的。
                  • 没错,但问题实际上并没有提到 C#。
                  • 哦,完全正确!很容易错过柔和蓝色的中蓝色位。
                  • 来吧,你有6000声望。该系统的工作方式可能不会让您感到惊讶。 :)
                  • 如果我停下来阅读标签,我就不能成为“西部最快的枪”! :)
                  【解决方案11】:

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

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

                  VS:

                  int x;
                  
                  public    string y;
                  protected float  z;
                  

                  【讨论】:

                    【解决方案12】:

                    正如Robert Paulson 在他的回答中所说,private 修饰符不仅用于成员,还用于类型。这变得很重要,因为类型的默认值是 internal,如果您使用 InternalsVisibleToAttribute,它可能会意外泄漏。

                    【讨论】:

                      【解决方案13】:

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

                      因此,如果您想将其设为私有,请使用私有。

                      【讨论】:

                      • 如果一个类型没有嵌套,则默认为内部类型,非嵌套类型不能声明为私有(超出内部可见性,它们会是私有的吗?)
                      猜你喜欢
                      • 2015-11-26
                      • 1970-01-01
                      • 2011-02-15
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-05-08
                      • 2017-12-22
                      • 2012-11-24
                      • 2014-05-16
                      相关资源
                      最近更新 更多