C#中的内部关键字

时间:2011-04-07 21:14:02

标签: c#

我有一个我声明为内部的c#静态类。我还在其中声明了一个静态属性。我宣布它是公开的。现在,当公共属性封装在内部类中时,它是否会限制其范围。

这是一个小代码片段:

internal static class A
{    
    public static int RollCount
    {
           get { return _rollCount; }
    }

}

先谢谢

6 个答案:

答案 0 :(得分:12)

  

我有一个我声明为内部的c#静态类。我还在其中声明了一个静态属性。我宣布它是公开的。现在,当公共属性封装在内部类中时,它是否会限制其范围。

严格要求,不。实体的范围被定义为程序文本的区域,其中该实体可以通过其非限定名称引用该区域。无论类的可访问域如何,属性的范围都是相同的;属性的范围包括类的主体和任何子类的主体。

您实际想要问的问题是“内部类的公共财产的辅助功能域是什么?”实体的可访问域是可访问该实体的程序文本区域。答案是“内部类的公共属性的可访问域与类的可访问域相同”。内部类的可访问性域是声明它的程序。

答案 1 :(得分:6)

成员不能比它所在的类更明显。拥有公共成员的内部或私有类并不是错误,因为如果你想创建类,你不必编辑每个成员声明比开始时更加明显。

答案 2 :(得分:2)

由于您的外部代码永远无法访问A,因此永远无法访问A.PayRollCount。

答案 3 :(得分:1)

该属性的 可见性 辅助功能域(不是范围)实际上受到辅助功能域的限制。它所定义的类,是的。因此,在编写代码时,此属性实际上是internal

但是,在某些情况下,public访问可能会产生影响:如果您将typeof(A)传递给某些通常无法看到class A的代码,并且该代码会对Type对象,该属性为public用于反射。

答案 4 :(得分:0)

是的,此方法的范围仅限于包含程序集。为了调用静态方法,你需要使用包含类,因为这个类是内部的,只能在声明它的程序集中可见(除非你当然使用反射)。

答案 5 :(得分:0)

如果您希望将Factory模式用于代码的外部用户,这可能非常有用,因为您可以将接口实现为内部类,然后通过Factory方法将其公开给您的朋友。

您的代码:

//Library.dll
namespace Library
{
    using System;
    public static class Factory
    {
        public static IFoo CreateFoo()
        {
            return new Foo();
        }
    }
    public interface IFoo
    {
        void DoSomething();
    }
    class Foo : IFoo
    {
        public void DoSomething()
        {
            Console.WriteLine("The internal foos public method is called from another assembly!!");
        }
    }
}

消费者代码:

//Console.exe
namespace Console
{
    using Library;
    class Program
    {
        static void Main(string[] args)
        {
            //var foo = new Foo(); Compilation error

            var foo = Factory.CreateFoo();
            foo.DoSomething();
            System.Console.ReadLine();
        }
    }
}