三十一课 构造函数与属性
1、构造函数
说道构造函数就不得不说一下对象的生命周期。
对象的生命周期一共有三个阶段:
构造阶段:是对象诞生,通过构造函数完成新对象的初始化。
正常使用阶段。
析构阶段:对象使用完成后,空置没有任何一个引用了,那么系统的垃圾回收机制就会将这个对象收回并释放这个对象所拥有的资源。C#由析构函数完成。
-----------------------------------
构造阶段使用的是构造函数
构造函数是一个特殊的方法和普通的函数不同,因为构造函数是由系统调用。当进行new关键字的时候,系统就会去调用构造函数。因此构造函数是没有返回值的连void都不行。
构造函数除了没有返回以及是由系统自动调用外其余的和普通函数没啥区别。
-----------------------------------
构造函数的特征:
1、必须与类同名
2、构造函数不能声明返回类型(连void也不行),不能返回值
3、构造函数总是public类型,私有的private表示不能被构造
如果是私有构造函数则类中一定会有静态成员。
4、构造函数仅做初始化的事情不要做其他与初始化无关的事情。
5、构造函数可以重载,从而提供初始化对象的不同方法。
6、构造函数是对象实例化时由编译器系统自动调用,不能显示的调用构造函数。
7、如果定义类时没有定义构造函数,则系统会自动生成一个默认构造函数。
---------------------------
如果没有自定义的构造函数则编译器系统会默认提供一个,功能就是初始化对象里面的成员。
初始化什么数据值:
数值类型:
char初始化为:‘0’
数字int float,double,decimal初始化为:0
引用类型:null《--- 空值/空对象
类型:默认值
-------------------------
所谓的构造函数初始化成员:
其实就算你自定义的构造函数中没有为字段、属性等赋初值,编译器还是会给初始化的值。也就是说无论如何,对象成员在new的时候都会有默认值
-------------------------
构造函数的重载
性质:和普通函数的重载一样的,但是构造函数由于必须与类同名,因此如果多余一个天然就只能重载。
----------------------
在面向对象编程中this代表当前对象的一个引用。
就相当于假定你这个类已经有一个对象了,this表示这个对象。
-----------------------------
属性?
面向对象的封装性原则要求不能直接访问类的数据成员,如何访问类的私有成员呢?
为了解决这个问题C#提供了一个称为:属性的访问器来完成这个功能。
为啥要用属性呢?
面向对象的设计中,主要是模拟现实社会中物质的特征,这个特征有一个词:就是属性,编程世界中借鉴这个词,这就是属性的由来。
从安全性的角度出发,字段是直接赋值或取值的,那么这里就有一个安全性的问题,非法的数据可以直接赋值给字段,如果不小心就会导致错误的发生。
将字段封装起来就能够有效的避免这个问题,这个对字段的封装就是属性。同时将字段设为私有的,封装的属性设为公共的,当数据赋值时就可以在属性中进行检测,同理取值时也可以通过属性检测。
---------------------------
属性中使用get、set访问器来对字段进行访问。
---------------------------
属性怎么写:
1、手写
2、vs生成
-----------------------
属性中有一个隐含变量是:value
它是用于接收传入的值,它的类型是根据属性的类型的变化而变化的。
----------------------------
而属性其实就是一种特殊的函数,因为在编译器中是没有属性这个东西的,因此.net
在编译时会将属性编译为函数。
-------------------------------
很屌的写法:
[访问修饰符] 返回值类型 属性名称{get=>字段名;set=>字段名;}
便捷写法的特点:速度快,形式简便
[访问修饰符] 返回值类型 属性名称{get;set;}
便捷写法还少了定义字段。(推荐写法)
属性的三种写法:
1、原始写法
私有的字段类型 私有的字段民;
[访问修饰符] 返回值类型 属性名称{get{return this.字段名;}set{this.字段名=value}}
2、屌的写法
私有的字段类型 私有的字段民;
[访问修饰符] 返回值类型 属性名称{get => 字段名; set => 字段名= value;}
3、便捷写法
[访问修饰符] 返回值类型 属性名称{get;set;}
------------------------
因为属性也是类的成员因此也分为:静态和非静态
属性的访问:
1、访问静态属性
类名.属性名
2、访问实例属性
对象名.属性名
------------------------
字段是不能做到只读或只写
但是属性可以做到
作用的体现:
1、在赋值或取值时可控制
2、可以控制只读、只写
----------------------
1、只读属性的写法
便捷写法
[访问修饰符] 属性的数据类型 属性名称{get;private set;}//可以在类中进行赋值
[访问修饰符] 属性的数据类型 属性名称{get;}
原始写法
[访问修饰符] 属性的数据类型 属性名称{get{return 属性名称};}
屌的写法
[访问修饰符] 属性的数据类型 属性名称{get => 字段名称;}
2、只写属性的写法
便捷写法
[访问修饰符] 属性的数据类型 属性名称{private get; set;}//可以在类中进行取值,一定要有get访问器,因此可以将get访问器设置为私有的
原始写法
[访问修饰符] 属性的数据类型 属性名称{set{ 属性名称=value};}
屌的写法
[访问修饰符] 属性的数据类型 属性名称{set => 字段名称=value;}
说道构造函数就不得不说一下对象的生命周期。
对象的生命周期一共有三个阶段:
构造阶段:是对象诞生,通过构造函数完成新对象的初始化。
正常使用阶段。
析构阶段:对象使用完成后,空置没有任何一个引用了,那么系统的垃圾回收机制就会将这个对象收回并释放这个对象所拥有的资源。C#由析构函数完成。
-----------------------------------
构造阶段使用的是构造函数
构造函数是一个特殊的方法和普通的函数不同,因为构造函数是由系统调用。当进行new关键字的时候,系统就会去调用构造函数。因此构造函数是没有返回值的连void都不行。
构造函数除了没有返回以及是由系统自动调用外其余的和普通函数没啥区别。
-----------------------------------
构造函数的特征:
1、必须与类同名
2、构造函数不能声明返回类型(连void也不行),不能返回值
3、构造函数总是public类型,私有的private表示不能被构造
如果是私有构造函数则类中一定会有静态成员。
4、构造函数仅做初始化的事情不要做其他与初始化无关的事情。
5、构造函数可以重载,从而提供初始化对象的不同方法。
6、构造函数是对象实例化时由编译器系统自动调用,不能显示的调用构造函数。
7、如果定义类时没有定义构造函数,则系统会自动生成一个默认构造函数。
---------------------------
如果没有自定义的构造函数则编译器系统会默认提供一个,功能就是初始化对象里面的成员。
初始化什么数据值:
数值类型:
char初始化为:‘0’
数字int float,double,decimal初始化为:0
引用类型:null《--- 空值/空对象
类型:默认值
-------------------------
所谓的构造函数初始化成员:
其实就算你自定义的构造函数中没有为字段、属性等赋初值,编译器还是会给初始化的值。也就是说无论如何,对象成员在new的时候都会有默认值
-------------------------
构造函数的重载
性质:和普通函数的重载一样的,但是构造函数由于必须与类同名,因此如果多余一个天然就只能重载。
----------------------
在面向对象编程中this代表当前对象的一个引用。
就相当于假定你这个类已经有一个对象了,this表示这个对象。
-----------------------------
属性?
面向对象的封装性原则要求不能直接访问类的数据成员,如何访问类的私有成员呢?
为了解决这个问题C#提供了一个称为:属性的访问器来完成这个功能。
为啥要用属性呢?
面向对象的设计中,主要是模拟现实社会中物质的特征,这个特征有一个词:就是属性,编程世界中借鉴这个词,这就是属性的由来。
从安全性的角度出发,字段是直接赋值或取值的,那么这里就有一个安全性的问题,非法的数据可以直接赋值给字段,如果不小心就会导致错误的发生。
将字段封装起来就能够有效的避免这个问题,这个对字段的封装就是属性。同时将字段设为私有的,封装的属性设为公共的,当数据赋值时就可以在属性中进行检测,同理取值时也可以通过属性检测。
---------------------------
属性中使用get、set访问器来对字段进行访问。
---------------------------
属性怎么写:
1、手写
2、vs生成
-----------------------
属性中有一个隐含变量是:value
它是用于接收传入的值,它的类型是根据属性的类型的变化而变化的。
----------------------------
而属性其实就是一种特殊的函数,因为在编译器中是没有属性这个东西的,因此.net
在编译时会将属性编译为函数。
-------------------------------
很屌的写法:
[访问修饰符] 返回值类型 属性名称{get=>字段名;set=>字段名;}
便捷写法的特点:速度快,形式简便
[访问修饰符] 返回值类型 属性名称{get;set;}
便捷写法还少了定义字段。(推荐写法)
属性的三种写法:
1、原始写法
私有的字段类型 私有的字段民;
[访问修饰符] 返回值类型 属性名称{get{return this.字段名;}set{this.字段名=value}}
2、屌的写法
私有的字段类型 私有的字段民;
[访问修饰符] 返回值类型 属性名称{get => 字段名; set => 字段名= value;}
3、便捷写法
[访问修饰符] 返回值类型 属性名称{get;set;}
------------------------
因为属性也是类的成员因此也分为:静态和非静态
属性的访问:
1、访问静态属性
类名.属性名
2、访问实例属性
对象名.属性名
------------------------
字段是不能做到只读或只写
但是属性可以做到
作用的体现:
1、在赋值或取值时可控制
2、可以控制只读、只写
----------------------
1、只读属性的写法
便捷写法
[访问修饰符] 属性的数据类型 属性名称{get;private set;}//可以在类中进行赋值
[访问修饰符] 属性的数据类型 属性名称{get;}
原始写法
[访问修饰符] 属性的数据类型 属性名称{get{return 属性名称};}
屌的写法
[访问修饰符] 属性的数据类型 属性名称{get => 字段名称;}
2、只写属性的写法
便捷写法
[访问修饰符] 属性的数据类型 属性名称{private get; set;}//可以在类中进行取值,一定要有get访问器,因此可以将get访问器设置为私有的
原始写法
[访问修饰符] 属性的数据类型 属性名称{set{ 属性名称=value};}
屌的写法
[访问修饰符] 属性的数据类型 属性名称{set => 字段名称=value;}