【问题标题】:In what situation a class is not affected to a accessibility level?在什么情况下,类不会影响到可访问性级别?
【发布时间】:2014-05-22 19:09:56
【问题描述】:

这里很简单。我想知道 c#(可能还有任何 oo 语言)中的一个类什么时候可以既不是“公共”、“私有”、“受保护”...

我问这个问题是因为当我在 Visual Studio 中创建一个类时,它会为我生成一个没有像这样的可访问性修饰符的类存根:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myNamespace
{
    class myClass
    {
    }
}

而且每次我都不太注意这部分代码,而是在其他地方引用它,最后运行并得到一个不一致的可访问性错误。

那么在什么情况下一个类可以,也许应该只是“类”而不是公共的或任何东西?我很难找到合适的地方。

是否有默认的可访问性修饰符?

【问题讨论】:

    标签: c# visual-studio oop


    【解决方案1】:

    C# 中的一般规则是“默认值是私有的,您可以显式声明它”。所以:

    namespace Foo
    {
        class Bar  // Implicitly internal class Bar
        {
            int x; // Implicitly private int x
    
            void Baz() {} // Implicitly private void Baz() {}
    
            class Nested // Implicitly private class Nested
            {
            }
        }
    }
    

    ...您不能将顶级(非嵌套)类声明为private,但您可以将嵌套类声明为私有。

    唯一这种规则被打破的情况是属性,其中 getter 或 setter 的默认值是“与整体属性声明相同”,您只能指定 更多 getter/setter 上的限制性修饰符。例如:

    internal string Foo { get; private set; }
    

    有一个内部吸气剂。然而,整个属性遵循第一条规则 - 因此它默认为私有。

    【讨论】:

    • 非常清楚,感谢属性的例外情况!
    【解决方案2】:

    internal 是顶级类的默认值。

    如果它嵌套在另一个类中..那么它是private

    查看文档:http://msdn.microsoft.com/en-us/library/ms173121.aspx

    在命名空间中直接声明的类和结构,如果没有指定访问修饰符,则默认为 internal。

    类成员和结构成员(包括嵌套类和结构)的访问级别默认为私有。

    【讨论】:

      【解决方案3】:

      来自Access Modifiers (C# Programming Guide)

      在命名空间中直接声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的或内部的。 如果未指定访问修饰符,则默认为内部。

      (强调)该页面继续提到嵌套类和成员的默认(和其他允许的)可访问性。

      【讨论】:

        猜你喜欢
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多