12 2019 档案
摘要:readonly英文译义是只读属性,在上篇与const的对比,是说 1 在运行时为readonly字段赋值的,看到编译出来的CIL代码中readonly字段还是变量。 同样是字段(面对对象的术语),const修饰是常量的意思,那么,又为何有readonly的出现呢? 难道就是因为它是在运行时赋值的嘛
阅读全文
摘要:常量应是恒定不变,如果修改它,在使用它的程序集中不一定能反映出最新改变。 如一个程序集引用了另一个程序集中的常量,常量值将直接编译到引用程序集中。所以,如果被引用程序集中的值发生改变,而引用程序集没有重新编译,那么引用程序集将继续使用原始值而非新值。 将来可能改变的值应指定为readonly。 re
阅读全文
摘要:在这段时间的学习中,有这样的话。 在面向对象术语中,在类中存储数据的变量称为成员变量。 这个术语在C#中,更标准、更符合规范的术语是字段,它是与包容类型关联的具名存储单元。 所以,字段是面向对象的一个术语。 而局部变量,我没有找到相关书籍材料,暂时理解为运用在方法中。 1 const是常量的意思。
阅读全文
摘要:有的类不含任何实例字段,所以用static关键字修饰该类。 C#编译器自动在CIL代码中把它标记为abstract和sealed,这会将类指定为不可扩展。 ps:自然没有实例成员,这个类是有静态成员。 最终会生成CIL代码,还是个加修饰符的类。 所以,以前自己不能理解静态和实例的区别,先不要从内存或
阅读全文
摘要:设计对象时,程序员要考虑字段和方法应声明为静态还是基于实例。 一般应将不需要访问任何实例数据的方法声明为静态方法,将需要访问实例数据的方法声明为实例方法。 静态字段主要存储对应于类的数据; 实例字段主要存储和对象关联的数据。
阅读全文
摘要:除了静态字段和方法,C#还支持静态构造函数,用于对类进行初始化。 静态构造函数不显式调用。 “运行时”在首次访问类时自动调用静态构造函数。 由于静态构造函数不能显式调用,所有不允许任何参数。 静态构造函数的作用,是将类中的静态数据初始化成特定值。(而实例构造函数也是初始化实例成员) 设计规范 最好在
阅读全文
摘要:只记录回忆点 和静态字段一样,直接在类名后访问静态方法。 属性也可声明为static,使用静态属性几乎肯定比使用公共静态字段好,因为公共静态字段在任何地方都能调用,而静态属性至少提供一定程度的封装。 从C#6.0开始,整个NextId都可简化为带初始化器的自动实现属性。
阅读全文
摘要:只记录回忆点 使用static关键字定义能由多个实例共享的数据; 和实例字段一样,静态字段也可在声明时初始化; 和实例字段不同,未初始化的静态字段将获得默认值,所以,没有显式赋值的静态字段也是可以访问的。
阅读全文
摘要:C#3.0新增了对象初始化器,用于初始化对象中所有可以访问的字段和属性。 具体地说,调用构造函数创建对象时,可在后面的一对大括号中添加成员初始化列表。 这样在创建对象时指定必要的数据,又提供了一种方式。 但不得不说,这都是表面上编码的工作。对象初始化器,只是一个语法糖。最终生成的CIL代码和创建对象
阅读全文
摘要:之前,对new操作符有过或多或少的描述。 new操作符返回,对实例化好的对象的一个引用。 这样,我认为有参数的构造函数完成了前几篇记录的初衷,保证了数据的有效性。 注意 既在声明中又在构造函数中赋值的情况。最终生效的是构造函数内部的赋值,它会覆盖声明时的赋值。 如果不细心,很容易就会以为对象实例化后
阅读全文
摘要:上次说到考虑数据的有效性,提供一种方式在创建对象时指定必要的数据。就是使用构造函数。 如果类没有显式定义的构造函数,C#编译器会在编译时自动添加一个。 但这个构造函数不获取参数,称为默认构造函数。仍就是没有无效数据的对象。
阅读全文
摘要:只记录回忆点 现在已为类添加了用于存储数据的字段,接着应考虑数据的有效性。可用new操作符实例化对象,但这一可能创建包含无效数据的员工对象。 实例化一个对象后立即对尚未初始化的字段进行赋值,但假如忘了初始化,编译器也不会发出警告。 为了解决可能忘记的问题,于是出现了构造函数; 必须提供一种方式在创建
阅读全文
摘要:只记录回忆点 如果为LastName赋了无效的值,代码就会抛出异常。拦截赋值,并通过字段风格的API对参数进行验证,这是属性的优点之一。 一个好的实践是从属性的实现中访问属性的支持字段。换言之,要一直使用属性,不要直接调用字段。 可移除属性的取值方法或赋值方法来改变属性的可访问性。 只有赋值方法的属
阅读全文
摘要:只记录回忆点 自动实现的属性 从C#3.0起属性语法有了简化版本。 在属性中声明支持字段,并用取值方法和赋值方法来获取和设置该字段。由于这是十分常见的设计,而且代码比较琐碎; 所以,现在允许在声明属性时不添加取值或赋值方法,也不声明任何支持字段。 一切都自动实现。简化了写法,也使代码更易读。 此外,
阅读全文
摘要:只记录回忆点 使用private关键字封装密码,禁止从类的内部访问。但这种形式的封装通常过于严格。 所以,传统方式是将字段标记为私有,再提供取值和赋值方法来访问和修改数据。 不过,这样的传统方式是,会影响Employee类的可编程性。导致只能调用方法来访问数据。 于是,就有了属性。考虑到经常会用到这
阅读全文
摘要:只记录回忆点 实例方法,无记录内容; 使用this关键字 可在类的实例成员内部获取对该类的引用;C#允许用关键字this显式指出当前访问的字段或方法是包容类的实例成员。 虽然可为所有本地类成员引用添加this前缀,但设计规范是若非必要就不要在代码中“添乱”。 参数要像局部变量那样使用camelCas
阅读全文
摘要:只记录回忆点 面向对象设计的一个核心部分是分组数据来建立特定结构。 在面向对象术语中,在类中存储数据的变量称为成员变量。这个术语在C#中很好理解,但更标准、更符合规范的术语是字段,它是与包容类型关联的具名存储单元。 实例字段是在类的级别上声明的变量,用于存储与对象关联的数据。 声明实例字段 访问实例
阅读全文
摘要:只记录回忆点 定义类首先指定关键字class,后跟一个标识符; 设计规范:不要在一个源代码文件中放多个类;要用所含公共类型的名称命名源代码文件; C#使用new关键字实例化对象;要用new操作符指示“运行时”为Employee对象分配内存、实例化对象,并返回对实例的引用; 虽然有专门的new操作符分
阅读全文
摘要:学习了控制流程以及如何声明方法之后,就可以学习如何定义自己的类型了。 这是任何C#程序的核心构造。 正是由于C#支持类以及根据类来创建对象,所以我们说C#是一种面向对象语言。 本章介绍C#面向对象编程的基础知识。重点在于如何定于类,可将类理解成对象的模板。 面向对象编程的一个关键优势是不必从头创建新
阅读全文
摘要:1类的声明和实例化 2实例字段(声明实例字段、访问实例字段、const和readonly修饰符) 3实例方法 4访问修饰符 5属性(声明属性、命名规范、提供属性验证、只读和只写属性、为取值方法和赋值方法指定访问修饰符、属性作为虚字段使用、属性和方法调用不允许作为ref和out参数使用) 6构造函数和
阅读全文