6.1类型的各种成员

在一个类型中可以定义0个或多个以下种类的成员:

  • 常量:是指出数据值恒定不变的一个符号。这些符号通常用于使代码更容易阅读和维护。常量通常与类型关联,不与类型的实例关联。从逻辑上讲,常量始终是静态成员。常量就是一个符号,编译时编译器就会将该符号替换成实际值
    public sealed class SomeType{private const Int32 SomeConstant = 1;}

  • 字段:字段表示一个只读或可读可写的数据值。字段可以是静态的,这种情况下,字段被认为是类型状态的一部分。字段也可以是实例(非静态),这种情况下,字段被认为是对象状态的一部分。强烈建议将字段声明为私有的,防止类型或对象的状态被该类型外部的代码破坏。详见第7章。
  • 实例构造器:将对象的实例字段初始化为良好初始状态的一种特殊方法。
    public sealed class SomeType{public SomeType(Int32 x) { }public SomeType() { }}

  • 类型构造器:将类型的静态字段初始化为良好初始状态的一种特殊方法。
    public sealed class SomeType{static SomeType() { }}

  • 方法:方法是一种特殊的函数,作用是更改或查询一个类型或对象的状态。作用于类型时,称为静态方法;作用于对象时,称为实例方法。方法一般会对类型或对象的字段执行读写操作。详见第8章。
  • 操作符重载: 操作符重载实际是一种方法,它定义了将一个特定的操作符作用于对象时,应该如何操作这个对象。
  • 转换符重载:转换操作符是定义如何隐式或显示的将对象从一种类型转型为另一种类型的方法。
  • 属性:领用属性(property),可以使用一种简单的、字段风格的语法来设置或查询类型或对象的部分逻辑状态,同时保证状态不被遭到破坏。作用于类型的称为静态属性,作用于对象的称为实例属性。属性可以是没有参数的,也可以是有多个参数的。详见第10章。
  • 事件:利用静态事件,一个类型可以向一个或多个静态或实例方法发送通知。而利用实例事件,一个对象可以向一个或多个静态或实例方法发送通知。提供事件的类型或对象的状态发生改变,通常就会引发事件。事件包含两种方法,允许静态或实例方法登记或注销对该事件的关注。详见第11章。
    public sealed class SomeType{public event EventHandler SomeEvent;}

  • 类型:类型可定义嵌套于其中的其他类型。通常用这个办法将一个大的、复杂的类型分解成更小的构建单元(building block),以简化实现。
    public sealed class SomeType{private class SomeNestedType { }}

无论使用什么编程语言,它的编译器都必须能处理你的源代码,为上述列表中的每一种成员生成元数据和IL代码。

无论使用的编程语言是什么,元数据的格式都是完全一致的。正是因为这个特点,才使CLR成为公共语言运行时。

CLR使用公共元数据格式决定常量、字段、构造器、方法、属性和事件在运行时的行为。元数据是整个.Net Framework开发平台的关键,它实现了编程语言、类型和对象的无缝集成。

6.2类型的可见性

在文件范围内定义类型时,可以将类型的可见性指定为public和internal。

public类型不仅对它的定义程序集中的所有代码可见,还对其他程序集中的代码可见。

internal类型仅对定义程序集中的所有代码可见,对其他程序集中的代码不可见

定义类型时,如果不显式指定类型的可见性,C#编译器默认将类型的可见性设为internal(两者中较有限的那一个)。

6.3成员的可访问性

在代码中引用一个成员时,成员的可访问性(accessibility)指出这种引用是否合法。

  • private:成员只能由 包含该成员的类型或任何嵌套类型中的方法访问。
  • protected:访问仅限于当前类型和其派生类型
  • internal:访问仅限于所属程序集中的方法访问。
  • internal (or) protected:访问仅限于当前程序集其派生类型(派生类型可以不属于当前程序集)。
  • public:访问不受限制,成员可由任何程序集的任何方法访问。

当然,任何成员想要被别人访问到,都必须在一个可见的类型内定义。

例如,如果程序集AssemblyA定义了一个internal类型,该类型有一个public方法,那么程序集AssemblyB中的代码不能调用AssemblyA中的public方法,因为internal类型对于AssemblyB是不可见的。

在C#中,如果没有显式声明成员的可访问性,编译器通常默认选择private(限制最大的那个)。CLR要求接口类型所有成员都具有public可访问性。

6.4静态类

静态类是不能实例化的,例如Console,Math,Environment和ThreadPool类。

静态类只有static静态成员。我们直接使用它的属性与方法,静态类最大的特点就是共享,作用是将一组相关的成员组合到一起。

例如Math类中定义了一组执行数学运算的方法。Math 类:为三角函数、对数函数和其他通用数学函数提供常数和静态方法。

static关键字只能应用于类,不能应用于结构(值类型)。这是因为CLR总是允许值类型实例化。

静态类的主要特点如下:

  • 它们仅包含静态成员。
  • 它们不能被实例化。
  • 它们是密封的。
  • 它们不能包含实例构造函数。

C#编译器对静态类进行了如下限制:

  • 静态类必须直接从基类System.Object派生,从其他任何基类派生没有任何意义。继承只适用于对象,而你不能创建静态类的实例
  • 静态类不能实现任何接口,这是因为只有使用类的一个实例时,才可以调用类的接口方法
  • 静态类只能定义静态成员(字段、方法、属性和事件),任何实例成员都将导致编译器报错
  • 静态类不能作为字段、方法参数或局部变量使用,因为它们都代表引用了一个实例的变量,这是不允许的
  • 静态类在编译后,会生成一个被标记为abstract和sealed的类,同时编译器不会生成实例构造器(.ctor方法)

在类或结构内部定义的类型称为嵌套类型。例如:

class Container
{class Nested{Nested() { }}
}

通过static关键字修饰的成员,是属于类。而实例成员是属于对象。在这个类第一次加载的时候,这个类下面的所有静态成员会被加载。

实例构造函数:使用 new 表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量

class CoOrds
{public int x, y;// constructorpublic CoOrds(){x = 0;y = 0;}public CoOrds(int x, int y){this.x = x;this.y = y;}
}
class MainClass
{static void Main(){CoOrds p1 = new CoOrds();CoOrds p2 = new CoOrds(5, 3);}
}

6.5 局部类型

partial这个关键字告诉C#编译器,一个类、结构或者接口的定义源代码可能要分散到一个或多个源代码文件中。

局部类型适用于以下情况:

  • 类型特别大,不宜放在一个文件中实现。
  • 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
  • 需要多人合作编写一个类。

局部类型的注意点:

  • 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
  • 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。

转载于:https://www.cnblogs.com/chrisghb8812/p/5618278.html

第6章 类型和成员基础相关推荐

  1. 《CLR via C#》读书笔记 之 类型和成员基础

    第六章 类型和成员基础 2013-02-27 6.2 类型的可见性 6.3 成员的可访问性 6.6 组件.多态和版本控制 6.2 类型的可见性 返回 类有两种可见性: (1)       public ...

  2. 类型的设计--类型和成员基础(一)

    6.1类型和成员基础 6.2类型的可见性 6.3成员的可见性 CLR术语 C#术语 描述 Private private 成员只有定义该成员的类型中的方法或该类型的所有嵌套类型中的方法访问 Famil ...

  3. 类型的设计--类型和成员基础(二)

    6.6组件.多态和版本控制 C#关键字 类型 方法/属性/事件 常量/字段 abstract 表示该类型不能构建实例 表示在构建派生类型的实例之前派生类型必须重写并实现这个成员 (不允许) virtu ...

  4. 《CLR via C#》读书笔记---06 类型和成员基础

    核心知识归纳图 6-1 类型中成员的本质 颜色归一 编译器支持了C#提供的各种各样的类型成员,CLR对其一无所知,都是IL代码 大小不同 不同的类型成员因复杂度不同,编译器映射出的IL代码量也不尽相同 ...

  5. 第1章 数据库系统与SQL基础知识!什么是SQL数据库系统?SQL类型?

    第1章  数据库系统与SQL基础知识 1.1  数据库系统基本概念 数据库和SQL构成了整个数据库系统,两者一个是用来存储数据,一个是用来读取数据.本节通过简单的概念入手,让读者对数据库系统有个大概的 ...

  6. 第三章 VB程序设计语言基础

    第三章 VB程序设计语言基础 一 VB中的数据与运算 二 标准函数 三 三种基本结构(顺序,判定,循环) 一 VB中的数据与运算 3.1.1 数据类型 3.1.2 变量与常量 3.1.3 运算符和表达 ...

  7. c/c++对象模型大总结:第5-8章、数据成员的存取与布局

    深度探索c++对象模型大总结.中 --第五~八章 作者:July.吴黎明. 声明:版权所有,侵权必究. 二零一一年三月十八日. 本文接上一篇 c++对象模型大总结:第1-4章.对象初探与构造函数,而写 ...

  8. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  9. 计算机硬件部分可称为裸机,上财信管PPT第3章 计算机硬件与软件基础.ppt

    文档介绍: 第三章计算机硬件与软件基础1上海财经大学信息管理与工程学院陈岗计算机是可以存储.检索和操纵数据的电子设备.一个完整的计算机系统应包括计算机硬件和计算机软件两大部分.计算机硬件是指计算机系统 ...

最新文章

  1. QT关联容器QMap,QHash的Key值自动排序问题
  2. 爱心志愿者义工俱乐部公告
  3. 4k hidpi 黑苹果_【ITX小钢炮】黑苹果安装经验分享
  4. 决定以太坊未来的三个关键扩容项目
  5. 网络层协议简介之ICMP和ARP
  6. POJ 2942 Knights of the Round Table ★(点双连通分量+二分图判定)
  7. CTF dotNet逆向分析
  8. python学习中遇到的问题
  9. 2019 最全支付宝高级Java现场面试37题
  10. 一个好用的导出excel数据为protobuf的工具
  11. win2003服务器中:无法连接ACCESS数据库/sql数据库正常 .net程序生成的dll文件拒绝访问问题...
  12. 脚本_批量修改md为hexo标准post格式[博]
  13. JAVA各种加密与解密方式(精挑版)
  14. 最简单易懂的C语言代码实现最小二乘法线性拟合直线
  15. 博弈论学习(一)——基础
  16. 【教程】CoreAVC+Haali安装及设置简易教程(KMPlayer)(2)
  17. PB 9.0 连接系统自带数据库步骤
  18. 基于python的数字印刷体识别_不告诉你我用了它配合Python简简单单开发OCR识别,带你识别手写体、印刷体、身份证等N种,附代码!...
  19. 西门子SIMATIC S7-1500,ET 200SP,HMI触摸屏面板产品型号
  20. Android Binder -- AIDL 原理

热门文章

  1. vue checkbox双向绑定_Vue的双向绑定
  2. mysql connector cpp_MySQL Connector/C++(一)
  3. 西昌学院计算机科学与技术好不好,西昌学院好不好评价怎么样
  4. oracle建共享dblink,oracle建多个dblink
  5. C语言丨线性表(二):线性链表(单链表)
  6. C++socket编程(七):7.3 http的响应协议
  7. golang基础语法
  8. linuxweb集群mysql_企业web高可用集群实战之lvs+keepalived+mysql
  9. java remove map_Java HashMap remove()方法
  10. 几何画板手机版_钉钉+几何画板+手写板,网络授课变简单