C#第三章--对象和类
------------恢复内容开始------------
1 类和结构
类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。都用new来声明实例。
类定义了类的每个对象(实例)可以包含什么数据和功能。
结构struct是值类型(stack),类class是引用类型(heap),结构不支持继承;较小的数据类型使用结构可提高性能,但类比结构常用。
2 类
(1) 类成员
静态成员,static,属于类
实例成员,属于对象
静态字段,static,值对于每个对象相同
实例字段,每个对象的实例字段都可以有不同的值
在调用实例方法的实例上,可以通过 this 显式地访问该实例。而在静态方法中引用 this 是错误的。
https://blog.csdn.net/llll29550242/article/details/6052216?utm_source=blogxgwz1
(2) readonly与const修饰的字段
readonly修饰符的字段只能在构造函数中分配值,在运行期间通过构造函数指定只读字段的值;可以是实例成员和类成员;可以在声明时初始化或者采用特定数据类型的默认值;
const修饰符,编译器通过const,用其值取代了使用它的变量,编译器知道常量的值;只能是类成员;
(3) 属性
- 属性是一个方法或者方法对,在客户端代码看来,他们是一个字段。
- get和set访问器中必须有一个具备属性的访问级别;
- 省略set即为只读属性,只写属性用方法替代;只读属性初始化:
- 属性初始化器来初始化 public string Id {get;} ="a";
- 构造函数中初始化 public Person(string name)=>Name = name;
- 具有表达式体的属性访问器,即把花括号里的get,set改为:get => _firstName; set => _firstName=value;
- 表达式体属性:只有get的属性可以用表达式体属性实现,不需要花括号和return,带有get属性但不写get关键字,用lambda操作符。
public string FirstName{get;} public string LastName{get;} public string FullName => $"{FirstName} {LastName}";
(4) 匿名类型
var doctor = new{ FirstName = "w", LastName = "m"};
(5) 方法
- 函数成员不仅包含方法,也包括类或结构的一些非数据成员,如索引器、运算符、构造函数和析构函数,甚至还有属性;数据成员是字段,常量和事件;
- 方法的重载:
- 方法的几个版本有不同的签名,即方法名相同,但参数的个数和数据类型不同。
public void ReturnResult(int result){}; public void ReturnResult(int result, int b){};
- 命名参数,把参数附上参数名称,这样在调用方法的时候不必按照原来的参数顺序填写参数,只需要对应好参数的名称也能完成方法。r.Move(x:1, y:2, z:3);
- 可选参数,应用可选参数的方法在被调用的时可以选择性的添加需要的参数,而不需要的参数由参数默认值取代。
public void Test(int numberOne, int numberOne=1, int numberThree=2) {Console.ReadLine();}
Test(1); Test(1, 22);
Test(1,numberThree:3);
- 个数可变的参数
public void TestRun(params int[] data){} TestRun(1,23,3); public void TestRun(params object[] data){} TestRun(1,"aa");//可以把不同类型的参数传递进去
(6) 构造函数
- 与类同名的方法,但没有返回类型;编译器在后台会生成默认的构造函数,把成员函数初始化为标准的默认值;
- 静态构造函数
- 只执行一次,没有访问修饰符(public等),没有参数;
- 可以用来初始化静态字段和属性;通常在第一次调用类的任何成员之前执行静态构造函数;static Person(){//};
3 结构
- 结构实际上是把数据项组合在一起,所以大多数字段都声明为public。
public struct Dimensions
{
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Length { get; }
public double Width { get; }
}
- 结构是值类型,但语法上常常把他们当作类来处理。new调用相应的构造函数,根据传递的参数,初始化所有字段。
- 结构A=B,所有内容被赋值,而对于类,只复制引用;用ref修饰结构,传参,只传递结构在内存中的地址,但方法可改变被调用的结构的值。
- C#7.2用readonly修饰只读结构,可以生成优化的代码,传递结构体时不会复制结构的内容,会使用引用;
------------恢复内容结束------------