首页 新闻 会员 周边

请帮忙解释一下这段文字的含义是什么?(关于可访问域的问题)

0
悬赏园豆:40 [已关闭问题]

最近我在看书的时候,当读到"可访问域"的时候因为语言功底差,所以将书中部分文字摘抄下来请您指点一二。(请您详细的解释一些,不胜感激!)

1.>成员的可访问域(Accessibility domain)由程序文本的节组成,在这些节中对成员的方法是可以的

2.>在程序P的类型T中声明的嵌套成员M,其访问域是如下所指之一(注意M本身也可能是一个类型):

注意T为顶层成员!!(T本身不是嵌套类型)

     3.>如果M的已声明可访问性为protected internal ,设D表示P的程序文本和所有从T派生的类型(这些类型是在P的外部声明的)的程序文本的并集,则M的可访问域将是T与D的可访问域的交集

问题一:

这句话中程序文本的节指的是什么?

在这些节中对成员的方法是可以的又指的是什么?

还有3.>中这段话,我没有弄清什么并集什么交集?这段话的整体含义您能用一个小例子详细的阐述一下吗?

我知道我的问题比较多,请您耐心的帮助我一下,如果因为您因回答我的问题耽搁了较长的时间,当我找到答案后我会另外给您加分(30分),以表我的感谢之情。

我在期待中...

问题补充: @Ivony..: @路过秋天: 可能你们讲的都对,但是我提出的问题你们并没有告送我是啥意思呀?虽然没有得到正确的答案依然感谢诸位鼎立支持!
shuzhiguolu的主页 shuzhiguolu | 初学一级 | 园豆:32
提问于:2010-01-31 10:31
< >
分享
其他回答(2)
0

这本书可以扔掉了,就一个成员的访问域问题,讲的TMD的复杂,看来专家的本领就是把简单的东西讲到鬼都看不懂。

-------百度一下变量或成员的访问域问题,有很多例子,找个自己能看的懂的看

想想小学的四则运算,括号里的优先。就差不多了。

路过秋天 | 园豆:4787 (老鸟四级) | 2010-01-31 21:39
0

支持楼上的说法

ForFreeDom | 园豆:589 (小虾三级) | 2010-01-31 21:47
0

这本书的确是乱七八糟。。。。不知道是不是金山快译出品的。

 

查了一下,我可以很明确的告诉LZ,这几段东西是一个白痴用金山快译从英文版的C#规范翻译过来的,事实上你直接看中文的C#规范都比这好得多,尽管C#规范这样的东西并不适合初学者作为读物。相应的中文版C#规范的段落如下:

 

一个成员的可访问域 (accessibility domain) 由(可能是不连续的)程序文本节组成,从该域中可以访问该成员。出于定义成员可访问域的目的,如果成员不是在某个类型内声明的,就称该成员是顶级 (top-level) 的;如果成员是在其他类型内声明的,就称该成员是嵌套 (nested) 的。此外,程序的程序文本 (program text) 定义为包含在该程序的所有源文件中的全部程序文本,而类型的程序文本定义为包含在该类型(可能还包括该类型中的嵌套类型)的 class-bodystruct-bodyinterface-bodyenum-body 中的开始和结束(“{”和“}”)标记之间的全部程序文本。

预定义类型(如 object、int 或 double)的可访问域是无限制的。

在程序 P 中声明的顶级未绑定类型 T(第 4.4.3 节)的可访问域定义如下:

  • 如果 T 的已声明可访问性为 public,则 T 的可访问域是 P 的以及引用 P 的任何程序的程序文本。
  • 如果 T 的已声明可访问性为 internal,则 T 的可访问域是 P 的程序文本。

从这些定义可以推断出:顶级未绑定类型的可访问域始终至少是声明了该类型的程序的程序文本。

构造类型 T<A1, ...,AN> 的可访问域是未绑定的泛型类型 T 的可访问域和类型参数 A1, ...,AN 的可访问域的交集。

在程序 P 内的类型 T 中声明的嵌套成员 M 的可访问域定义如下(注意 M 本身可能就是一个类型):

  • 如果 M 的已声明可访问性为 public,则 M 的可访问域是 T 的可访问域。
  • 如果 M 的已声明可访问性是 protected internal,则设 D 表示 P 的程序文本和从 T 派生的任何类型(在 P 的外部声明)的程序文本的并集。M 的可访问域是 T 与 D 的可访问域的交集。
  • 如果 M 的已声明可访问性是 protected,则设 D 表示 T 的程序文本和从 T 派生的任何类型的程序文本的并集。M 的可访问域是 T 与 D 的可访问域的交集。
  • 如果 M 的已声明可访问性为 internal,则 M 的可访问域是 T 的可访问域与 P 的程序文本的交集。
  • 如果 M 的已声明可访问性为 private,则 M 的可访问域是 T 的程序文本。

从这些定义可以看出:嵌套成员的可访问域总是至少为声明该成员的类型的程序文本。还可以看出:
成员的可访问域包含的范围决不会比声明该成员的类型的可访问域更广。

直观地讲,当访问类型或成员 M 时,按下列步骤进行计算以确保允许进行访问:

  • 首先,如果 M 是在某个类型(相对于编译单元或命名空间)内声明的,则当该类型不可访问时将会发生编译时错误。
  • 然后,如果 M 为 public,则允许进行访问。
  • 否则,如果 M 为 protected internal,则当访问发生在声明了 M 的程序中,或发生在从声明 M 的类派生的类中并通过派生类类型(第 3.5.3 节)进行访问时,允许进行访问。
  • 否则,如果 M 为 protected,则当访问发生在声明了 M 的类中,或发生在从声明 M 的类派生的类中并通过派生类类型(第 3.5.3 节)进行访问时,允许进行访问。
  • 否则,如果 M 为 internal,则当访问发生在声明了 M 的程序中时允许进行访问。
  • 否则,如果 M 为 private,则当访问发生在声明了 M 的类型中时允许进行访问。
  • 否则,类型或成员不可访问,并发生编译时错误。

在下面的示例中

public class A
{
    public static int X;
    internal static int Y;
    private static int Z;
}

internal class B
{
    public static int X;
    internal static int Y;
    private static int Z;

    public class C
    {
         public static int X;
         internal static int Y;
         private static int Z;
    }

    private class D
    {
         public static int X;
         internal static int Y;
         private static int Z;
    }
}

类和成员具有下列可访问域:

  • A 和 A.X 的可访问域无限制。
  • A.Y、B、B.X、B.Y、B.C、B.C.X 和 B.C.Y 的可访问域是包含程序的程序文本。
  • A.Z 的可访问域是 A 的程序文本。
  • B.Z 和 B.D 的可访问域是 B 的程序文本,包括 B.C 和 B.D 的程序文本。
  • B.C.Z 的可访问域是 B.C 的程序文本。
  • B.D.X 和 B.D.Y 的可访问域是 B 的程序文本,包括 B.C 和 B.D 的程序文本。
  • B.D.Z 的可访问域是 B.D 的程序文本。

如示例所示,成员的可访问域决不会大于包含它的类型的可访问域。例如,即使所有的 X 成员都具有公共级的已声明可访问性,但除了 A.X 外,所有其他成员的可访问域都受包含类型的约束。

如第 3.4 节中所描述的那样,基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都由派生类型继承。这甚至包括基类的私有成员。但是,私有成员的可访问域只包括声明该成员的类型的程序文本。在下面的示例中

 

class A
{
    int x;

    static void F(B b) {
         b.x = 1;      // Ok
    }
}

class B: A
{
    static void F(B b) {
        b.x = 1;      // Error, x not accessible
    }
}

类 B 继承类 A 的私有成员 x。因为该成员是私有的,所以只能在 A 的 class-body 中对它进行访问。因此,对 b.x 的访问在 A.F 方法中取得了成功,在 B.F 方法中却失败了。

 

你可以到X:\Program Files\Microsoft Visual Studio 9.0\VC#\Specifications\2052找到中文文档,如果你有安装中文版的VS。没有也不要紧,去MSDN下一个VS Express版本就好了,免费的。

Ivony... | 园豆:289 (菜鸟二级) | 2010-02-01 10:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册