作者:ahdung
链接:https://www.zhihu.com/question/263468057/answer/269458014
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
你还漏了一个:【程序集】。
我先说包含关系吧:
程序集|命名空间【包含】类|结构体|接口|枚举|委托。由于类、结构体这些东西在说明这种问题时并没有区别,所以下文可能只拿类说事。
第一层:程序集、命名空间
这俩是平级的,都是对类/结构体等东西的归纳,只不过前者是物理上的,后者是逻辑上的,或者说名义上的。
一个程序集中的类,可以分属多个命名空间,比如mscorlib.dll中的string类属于System命名空间,Registry类属于Micorosft.Win32命名空间;
一个命名空间下的类,亦可能分布在不同程序集中,比如System命名空间下的string和Uri俩类,就分别在mscorlib.dll和System.dll俩程序集中;
大概可以这样类比:程序集好比一个人定居的国度,命名空间好比这个人的国籍,当我们说常居中国的人,他们中可能有中国人、美国人等多种国籍的人;当我们说中国人时,他们可能分布在世界各国。
注意点:
- 要使用一个类,前提有两个:一是引入它所在的程序集,二是using它的命名空间,或者在类名前带上命名空间使用
- 类这些东西不一定要在某个具名的命名空间,这个时候,它是在一个叫global的全局空间下,可以通过global::ClassName访问它
- 命名空间可以嵌套,如System.Windows.Forms,但这里面不存在包含关系,也就是属于A.B下的类跟A没有一毛钱关系,A和A.B是并列的两个命名空间,没有从属,别以为using了A,就可以直接敲B.ClassName来用
第二层:类、结构体、接口、枚举、委托
这些东西也是平级的,只是功能上的不同。其中类和结构功能相似,某些地方可以替用,具体可以了解专门讲它俩的文章,这里不赘述。大体来讲,类/结构体是对相关数据和行为的归纳,是容纳大量代码的地方,我觉得很难通过讲解让你明白在设计上,哪些东西应该归在一个类,哪些应该另起一个类,这是需要通过大量实践才能意会的东西。倒是有一个经验可供参考,就是想象自己写的东西是给别人调的,哪些该自己做好,哪些不该自己负责,哪些该公开,哪些该隐藏,把权责弄清,规划时就有点数。
至于接口、枚举、委托,这些东西也都跟设计有关,到你觉得需要用到这些东西的时候,自然就会理解。刚接触时是很难通过讲解弄明白的,还是那句,只可意会。当然也可能是我表达能力有限。
注意点:
- 类/结构体可以包含字段、属性、方法等东西,统称类成员
- 类/结构体可以嵌套,具体来说就是,类中可以再定义类和结构体,结构体中也可以再定义结构体和类;接口、枚举、委托可以也可以定义在类/结构体中,但反过来,这三者里面不能嵌套任何东西;需要明白嵌套只是个安置问题,A里面定义B,A和B并没有从属关系,更不是父子关系,无非就是只能用A.B这种方式来访问B,当然,B的访问级别受A的影响,B的访问级别只能<=A
就这么地,有误之处欢迎指出,感谢。