类的用法,C#和TS非常相似,UTS和TS基本保持一致。实际开发中,C#的所有代码都必须在类中,而TS的客户端开发,则很少会用到class,主要使用type或interface,为什么?正文解释。
一、类和对象
1.1 C#中定义类和创建对象
//创建一个类,有两个属性成员Name和Age
class Person
{
//***字段或属性如果没有初始化,框架自动赋默认值
//其中数值类型为0,布尔为false,字符为'\0',其它引用类型为null
public string Name {
get; set; }
public int Age {
get; set; }
}
class Program
{
static void Main()
{
// 实例化 Person 类,也叫创建对象
Person person1 = new Person();
person1.Name = "张三";
person1.Age = 25;
Console.WriteLine($"{person1.Name} 的年龄是 {person1.Age}");
}
}
/*C#中new创建实例的过程
1、分配内存空间来存储该对象
2、字段或属性初始化,如果没有显式赋值,则赋值相应类型的默认值
3、调用构造函数,如果有给字段或属性赋值,则会覆盖第2步的值
如果没有显式创建构造函数,系统会自动创建一个无参数构造函数,如果有,则不会自动创建议
*/
1.2 TS/UTS中定义类和创建对象
class Person {
//***TS不要求初始化,但UTS中要求必须初始化
name: string;
age: number = 0;
}
// 实例化 Person 类,也叫创建对象
let person1 = new Person();
person1.name = "张三";
person1.age = 25;
console.log(`${
person1.name} 的年龄是 ${
person1.age}`);
/*TS中new创建实例的过程
1、创建一个空对象
2、将这个对象的原型设置为类的原型对象(详见原型章节)
3、执行类的构造函数,将新创建的对象作为 this 上下文,并在构造函数中进行属性初始化
如果没有显式创建构造函数,系统会自动创建一个无参数构造函数,如果有,则不会自动创建议
*/
二、类的成员
2.1 C#的常量、字段、属性、方法和事件成员
2.1.1 类的可见修饰词
- public: 可以被任何代码访问,建议都加public
- internal: 只能在当前程序集内被访问,默认值
2.1.2 类的成员的可见修饰词
- public: 可以被任何代码访问
- protect internal:只能在类内部、派生类或当前程序保中被访问
- internal: 只能在当前程序集内被访问
- protect:只能在类的内部和派生类中被访问
- private: 只能在类的内部被访问,默认值
2.1.3 类的实例成员和静态成员
- 实例成员:类实例化后,才能访问和修改,数据保存在实例化后的对象中,正常创建的都是实例成员
- 静态成员:直接通过类名访问和修改,数据保存在类型元数据中,使用static修饰。实际上类的实例也可以访问静态成员,静态成员是被所有实例共享的
2.1.4 类的成员代码示例
//1、类的成员定义====================================================================
//本例中还少两个成员,构造函数和索引器。构造函数下节重点说,索引器极少用到。
public class MyClass
{
//1.1 常量字段(编译时)--------------------------------------------
public const int MYCONST1 = 10; //常量,具有静态特征,类和实例都能访问,全大写
public static const int MYCONST2 = 10; //静态常量,只能通过类访问,比较常用
//1.2 常量字段(运行时),使用readonly,在下节构造函数中说明----------
//1.3 字段---------------------------------------------------------
private int _myField1 = 10; //私有的实例字段,初始化,_小驼峰
public string myField2; //公有的实例字段,未初始化,默认值为null,小驼峰
public static int myField3 = 20; //公有的静态字段,初始化
//1.4 属性---------------------------------------------------------
//实例属性,完整格式,属性一般都是public,习惯用大驼峰
//属性本质上是方法,是对字段的封装,数据保存在后台字段上
//读取和修改属性时,实际上是调用get和set方法,每次都会调用
private int _myProperty1; //未初始化,默认值为0
public int MyProperty1
{
get {
return _myProperty; }
set {
_myProperty = value; }
}
public string MyProperty2 //简写方式①:方便写getter和setter语句
{
get => _myProperty2;
set => _myProperty2 = value;
}
public int MyProperty3{
get;set } //简写方式②:最简化
public int MyProperty4{
get; } = 10 //简写方式③:只读属性,并初始化
public int MyProperty5 {
get; priva