C#第五节

1、具有入口点 (entry point) 的程序集称为应用程序 (application),应用程序运行时,将创建新的 应用程序域(application domain)。同一台计算机上可能会同时运行着同一个应用程序的若干个实例,此时,每一个 实例都拥有各自的应用程序域。

#此入口点方法总是被命名为 Main,可以具有下列签名之一:
static void Main() {...} 
static void Main(string[] args) {...} 
static int Main() {...} 
static int Main(string[] args) {...} 

2、声明空间

  • 在程序的所有源文件中,namespace-member-declarations 若没有被置于任何一个 namespacedeclaration 下,则属于一个称为全局声明空间 (global declaration space) 的组合声明空间。
  • 在程序的所有源文件中,一个 namespace-member-declarations 若在 namespace-declarations 中具有相 同的完全限定的命名空间名称,它就属于一个组合声明空间。 
  • 每个类、结构或接口声明创建一个新的声明空间。除了重载实例构造函数声明和静态构造函数声明外,类或结构成员声明不能引入与该类或结构同名的成员,类、结构或 接口允许声明重载方法和索引器。,类或结构允许重载实例构造函数和运算符的声明。
  • 每个委托声明创建一个新的声明空间。名称通过形参(fixed-parameters 和 parameter-arrays)和 type-parameters 引入此声明空间。 
  • 每个枚举声明创建一个新的声明空间。名称通过 enum-member-declarations 引入此声明空间。 
  • 每个方法声明、索引器声明、运算符声明、实例构造函数声明和匿名函数均创建一个称为 局部变量 声明空间 (local variable declaration space) 的新声明空间。名称通过形参(fixed-parameters 和 parameter-arrays)和 type-parameters 引入此声明空间

3、成员的声明可用于控制对该成员的访问。成员的可访问性是由该成员的声明可访问性和直接包含它的那个类型的可访问性(若它存在)结合起来确定的

4、成员的 已声明可访问性(declared accessibility) 可以是下列类型之一: 

  • Public,选择它的方法是在成员声明中包括 public 修饰符。public 的直观含义是“访问不受限制”
  • Protected,选择它的方法是在成员声明中包括 protected 修饰符。protected 的直观含义是“访问范围限定于它所属的类或从该类派生的类型”。 
  • Internal,选择它的方法是在成员声明中包括 internal 修饰符。internal 的直观含义是“访问范围限定于此程序”,当前program中。 
  • Protected internal(意为受保护或内部的),选择它的方法是在成员声明中包括 protected 和 internal 修饰符。
  • protected internal 的直观含义是“访问范围限定于此程序或那些由它所属的类派生的类型”。 
  • Private,选择它的方法是在成员声明中包括 private 修饰符。private 的直观含义是“访问范围限定于它所属的类型” 当前class中

5、默认修饰符

  • 命名空间隐式地(不显示出来)具有 public 已声明可访问性。在命名空间(namespace)声明中不允许使用访问修饰符。
  • 编译单元或命名空间中声明的类型可以具有 public 或 internal 已声明可访问性,默认的已声明 可访问性为 internal 
  • 类(class里面)成员可具有五种已声明可访问性中的任何一种,默认为 private 已声明可访问性。(声明为命名空间成员的类型(指class)只能具有 public 或 internal 已声明可访问性。) 
  • 结构成员可以具有 public、public 或 private 已声明可访问性并默认为 private 已声明可访问性,这是因为结构是隐式地密封的。结构的成员若是在此结构中声明的(也就是说,不是由该结构从它的基类中继承的),则不能具有 protected 或 protected internal 已声明可访问性。(请注意,声明为结构成员的类型可具有 public、internal 或 private 已声明可访问性,而声明为命名空间成员的类型只能具有 public 或 internal 已声明可访问性。)
  •  接口成员隐式地具有 public 已声明可访问性。在接口成员声明中不允许使用访问修饰符 
  • 枚举成员隐式地具有 public 已声明可访问性。在枚举成员声明中不允许使用访问修饰符。 

6、可访问域

  • 成员不是在某个类型内声明的,就称该成员是顶级 (toplevel) 的;如果成员是在其他类型内声明的,就称该成员是 嵌套 (nested) 的。
  • 程序的程序文本(program text) 定义为包含在该程序的所有源文件中的全部程序文本,而类型的程序文本定义为包含在该类型可能还包括该类型中的嵌套类型)的 type-declaration 中的所有程序文本

7、可访问性约束

  • 类类型的直接基类必须至少与类类型本身具有同样的可访问性
  • 接口类型的显式基接口必须至少与接口类型本身具有同样的可访问性。 
  • 委托类型的返回类型参数类型必须至少与委托类型本身具有同样的可访问性。 
  • 常量的类型必须至少与常量本身具有同样的可访问性。 
  • 字段的类型必须至少与字段本身具有同样的可访问性。 
  • 方法的返回类型和参数类型必须至少与方法本身具有同样的可访问性。 
  • 属性的类型必须至少与属性本身具有同样的可访问性。 
  • 事件的类型必须至少与事件本身具有同样的可访问性。 
  • 索引器的类型和参数类型必须至少与索引器本身具有同样的可访问性。 
  • 运算符的返回类型和参数类型必须至少与运算符本身具有同样的可访问性。 
  • 实例构造函数的参数类型必须至少与实例构造函数本身具有同样的可访问性。 

8、签名是对类、结构和接口的成员实施 重载 (overloading) 的机制: 

 

 9、

  

 10、

 

 

 11、一个对象的内存管理生存周期如下:

  • 当创建对象时,为其分配内存,运行构造函数,将该对象被视为活对象。 
  • 在后续执行过程中,如果不会再访问该对象或它的任何部分(除了运行它的析构函数),则将该对 象视为不再使用,可以销毁。
  • 一旦对象符合销毁条件,在稍后某个时间将运行该对象的析构函数
  • 一旦运行对象的析构函数,如果该对象或它的任何部分无法由任何可能的执行继续(包括运行析构 函数)访问,则该对象被视为不可访问,可以回收。
  • 最后,在对象变得符合回收条件后,垃圾回收器将释放与该对象关联的内存 

12、默认值:对于所有 simple-types,默认值是由所有位都置零的位模式产生的值:

  •   对于 sbyte、byte、byte、ushort、int、uint、long 和 ulong,默认值为 0。
  • 对于 char,默认值为 '\x0000'。 
  • 对于 float,默认值为 0.0f。
  • 对于 double,默认值为 0.0d。
  • 对于 decimal,默认值为 0.0m。
  • 对于 bool,默认值为 false。 

13、C# 语言的类型划分为两大类: 值类型 (Value type) 和 引用类型 (reference type)。第三种类型是指针,只能用在不安全代码

14、值类型和引用类型都可以为 泛型类型 (generic type),泛型类型采用一个或多个 类型参数 。类型参数可以指定值类型和引用类型。

15、一个值类型或是结构类型,或是枚举类型。

  • 所有值类型从类 System.ValueType 隐式继承,后者又从类 object 继承。任何类型都不可能从值类型 派生,因此,所有值类型都是隐式密封的
  • 隐式密封:就是指不能被派生的类型
  • System.ValueType 本身不是 value-type, 而是 class-type,所有 value-type 都从它自动派生。 
  • 所有值类型都隐式声明一个称为 默认构造函数 (default constructor) 的公共无参数实例构造函数,默认构造函数返回一个零初始化实例,他就是该值类型的默认值。简言之就是声明值类型是设置一个默认值
  • //i和J都被赋值为0
    int i = 0;  
    int j = new int(); 
    View Code
  •  1 value-type:
     2  struct-type 
     3 enum-type 
     4 struct-type:
     5  type-name 
     6 simple-type
     7   nullable-type 
     8 simple-type:
     9  numeric-type 
    10 bool 
    11 numeric-type:
    12  integral-type 
    13 floating-point-type
    14  decimal 
    15 integral-type: 
    16 sbyte 
    17 byte 
    18 short 
    19 ushort 
    20 int 
    21 uint 
    22 long 
    23 ulong 
    24 char 
    25 floating-point-type: 
    26 float 
    27 double 
    28 nullable-type: 
    29 non-nullable-value-type   ? 
    30 non-nullable-value-type: 
    31 type enum-type: 
    32 type-name
    View Code 

 16、结构类型是一种值类型,它可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态 构造函数和嵌套类型。

17、简单类型 simple type,C# 提供称为 简单类型 (simple type) 的预定义结构类型集。简单类型通过保留字标识,而这些保留字只是 System 命名空间中预定义结构类型的别名

  • literals:字面量,大多数simple type 通过literals来创建值 

18、浮点型,C# 支持两种浮点型:float 和 double

  • 正零和负零。大多数情况下,正零和负零的行为与简单的值零相同
  • 正无穷大和负无穷大,例如,1.0 / 0.0 产生正无 穷大,而 –1.0 / 0.0 产生负无穷大。
  • 非数字 (Not-a-Number) 值,常缩写为 NaN ,NaN 是由无效的浮点运算(如零被零除)产生的。 

19、可以为 null 的类型可以表示其 基础类型 (underlying type) 的所有值和一个额外的 null 值。可以为 null 的 类型写作 T?

  • 其中 T 是基础类型。此语法是 System.Nullable<T> 的简写形式,这两种形式可以互换 使用
  • 类型为 bool 的 HasValue 属性 
  • 类型为 T 的 Value 属性 
  • HasValue 为 true 的实例称为非 null。非 null 实例包含一个已知值,,可通过 Value 返回该值。 
  • HasValue 为 false 的实例称为 null。null 实例有一个不确定的值。尝试读取 null 实例的 Value 将导致引 发 System.InvalidOperationException。访问可以为 null 的实例Value属性的过程称作解包upwrapping
  • 为一个给定值创建可以为 null 的类型的非null实例的过程称作包装wrapping)比如new Int?(1),new T?(x) 

20、引用类型,引用类型是类类型、接口类型、数组类型或委托类型

  • 1、引用类型值是对该类型的某个实例 (instance) 的一个引用,后者称为对象 (object),引用类型值对对象值的引用
    reference-type: 
    class-type 
    interface-type 
    array-type 
    delegate-type 
    class-type: 
    type-name 
    object 
    dynamic 
    string 
    interface - type:
    type-name 
    array-type: 
    non-array-type  
    rank-specifiers 
    non-array-type: 
    type 
    rank-specifiers: 
    rank-specifier 
    rank-specifiers   
    rank-specifier 
    rank-specifier: 
    [   dim-separatorsopt   ]
    dim-separators: , 
    dim-separators   , 
    delegate-type: 
    type-nam
    View Code

    null 值比较特别,它兼容于所有引用类型,用来表示“没有被引用的实例

20-1、 类类型 

  • 类类型定义包含数据成员、函数成员和嵌套类型的数据结构,
  • 其中数据成员包括常量和字段
  • 函数成员包括方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静态构造函数。
  • 类类型支持继承,继承是派生类可用来扩展和专门化基类的一种机制
  •  

     object 类类型是所有其他类型的最终基类。关键字 object 只是预定义类 System.Object 的别名。

  • dynamic(动态) 类型与 object 一样,可以引用任何对象。 在将运算符应用于 dynamic 类型的表达式时,其解析会推迟到程序运行时进行。

  • dynamic(动态) 类型,因此,如果运算符不能合法地应用于引用的对象,在编译过程中不会报 告任何错误。而是在运行时解析运算符失败时,会引发异常。 
  • string 类型是直接从 object 继承的密封类类型。string 类的实例表示 Unicode 字符串。 
  • 一个接口定义一个协定实现某接口的类或结构必须遵守该接口定义的协定。一个接口可以从多个基接 口继承,而一个类或结构可以实现多个接口。 
  • 数组是一种数据结构,它包含可通过计算索引访问的零个或更多个变量。数组中包含的变量(又称数组的元素)具有相同的类型,该类型称为数组的元素类型
  • 委托是引用一个或多个方法的数据结构,,委托不仅存储了一个对该方法入口点的引用,还存储了 一个对相应的对象实例的引用,该方法就是通过此对象实例被调用的。传一个方法
  • 装箱和拆箱的概念是 C# 的类型系统的核心,它在 value-types 和 reference-types 之间架起了一座桥梁, 使得任何 value-type 的值都可以转换为 object 类型的值
  • 装箱转换允许将 value-type 隐式转换为 reference-type(值类型转化为引用类型)

 21、构造类型:类型实参编写在紧跟在泛型类型的名称后面的尖括号(< 和 >) 中。至少包括一个类型实参的类型称为构造类型

  • 泛型类型声明本身表示未绑定的泛型类型 (unbound generic type),它通过应用类型实参 (type argument) 被用作构成许多不同类型的“蓝图”。

22、表达式树 (Expression tree) 允许匿名函数表示为数据结构而不是可执行代码。

  • 表达式树是 System.Linq.Expressions.Expression<D> 形式的表达式树类型 (expression tree type) 的值,其中 D 是任何委托类型。对于本规范的其余部分,我们将使用简写形式 Expression<D> 引用这些类型。 如果存在从匿名函数到委托类型 D 的转换,则也存在到表达式树类型 Expression<D> 的转换。不过, 匿名函数到委托类型的转换会生成一个引用该匿名函数的可执行代码的委托,而到表达式树类型的转换 则会创建该匿名函数的表达式树表示形式。 

 

posted on 2020-03-10 21:32  HelloOcean  阅读(137)  评论(0)    收藏  举报

导航