我有一个我声明为内部的c#静态类。我还在其中声明了一个静态属性。我宣布它是公开的。现在,当公共属性封装在内部类中时,它是否会限制其范围。
这是一个小代码片段:
internal static class A
{
public static int RollCount
{
get { return _rollCount; }
}
}
先谢谢
答案 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();
}
}
}