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(122);
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修饰只读结构,可以生成优化的代码,传递结构体时不会复制结构的内容,会使用引用;

 

 

 

 

------------恢复内容结束------------

posted @ 2021-10-18 14:41  未闻花开  阅读(98)  评论(0编辑  收藏  举报