1.对字段进行封装
private string username;//定义私有字段
//使用字段时通过属性来调用,属性本身设置为私有,更安全
public string UserName
{
get{return username;} //返回字段值
set{username=value;} //通过value给字段赋值
}
//C#3.0以后简写为
public string UserID{get; set;}//编译器自动生成字段,不需要自己定义
//C#4.0以后可以直接赋值
public string UserName{get; set;} = ".xiaowang”;
读取:属性通过get方法,返回私有字段。
赋值:属性通过set方法,通过value给字段赋值
数据通过属性保存到了字段中
通过属性操作字段可以添加业务逻辑,避免数据非法
private string userId;
public string UserID
{
get{return username;}
set{
if(value<0)
userId=0;
else
userId=value;
}
}
属性控制读写操作,设置只读
//只读属性1,直接去掉set方法,值可以在定义时初始化
public string UserName{get;}="xiaozhang";
//只读属性2,直接去掉set方法,并在get中添加业务逻辑
public string UserInfo
{
get{return "用户名:"+UserName;}
}
总而言之:
字段(成员变量)private string UserName;
- 内容使用:字段主要时为类的内部数据交换使用,字段一般时private。
- 数据存储:字段只是用来存储数据,如果不是静态字段,生命周期和对象共存亡。
- 读写不限:我们可以给字段赋值,也可以获取字段值。
属性(字段封装)public string UserName{get;set;}
- 外部使用:属性一般时向外提供数据访问,属性是public修饰,用来对外表示。
- 业务扩展:属性内部可以添加我们需要的业务逻辑,可以避免非法数据或完成其他任务。
- 读写可控:属性可以设置为只读属性,更好体现安全性。
使用
- 常规使用:对象本身的“对外”数据保存都是通过属性来完成。
- 强制使用:公有化字段(如 public string UserName;},在很多时候是无法被解析,会导致出问题。
方法
构造方法
构造方法在对象初始化时被调用,所以,我们在创建对象的时候可以完成一些初始化任务。
初始化:给对象属性赋值,或从其他对象、文本等获取基础数据。
无/有参数构造方法
public class Course
{
public CourseId{get;set;}
public CourseName{get;set;}
//构造方法名必须和类名相同,
//无参构造方法
public Course()
{
CourseId=10001;//固定属性初始值
//还可以编写读取相关文件或从其他数据源读取的方法或逻辑
}
//有参构造方法,
public Course(int courseId,string coursename)
{
CourseId=courseId;//调用时可以自定义初始值 Course c=new CourseId(001,"haha");
CourseName=coursename;
}
//有参构造
public Course(int courseId,string coursename,string type)
:this(courseId,coursename)//
{
Type= type;
}
//一般方法
public string CourseInfo()
{
return "哈哈";
}
}
注:声明类的时候系统会自动生成一个无参构造方法,所以我们可以通过如 A test = new A();
来操作。一但我们自己声明构造方法,就会覆盖掉系统自动生成的构造方法,声明对象也就只能
调用我们自己的构造方法。即使只定义有参构造方法,系统自动生成的无参构造方法也会被覆盖掉。
所以,定义了构造函数后,想要调用无参构造函数声明对象,就必须自己定义无参构造函数了。
对象初始化器
//普通调用
Course course1=new Course();
course1.CourseId=1001;
course1.CourseName="哈哈";
//对象初始化器
Course course1=new Course()
{
CourseId=1001,
CourseName="哈哈"
};
构造方法
- 一个类中,至少有一个构造方法,可以是无参,也可以是有参。
- 调用特殊性:只能在对象创建的时候,通过new关键字调用
- 使用的强制性:对象的创建,必须调用指定的构造方法,也就是参数必须统一
- 语法的特殊性:不能有返回值、构造方法名称和类名必须一样
构造方法 对比 对象初始化器
- 相同点:都可以完成对象属性初始化
- 不同点:
- 强制性:对象初始化器没有强制性,可以随意使用,构造方法看上面。
- 使用范围:对象初始化器只能完成属性初始化,构造方法刻意完成任意需要的初始化任务。
- 使用位置:对象初始化器在创建对象时就可以使用,构造方法必须提前写在类中。
- 出现时间:对象初始化器在.NET3.0后
this指向
public class Course
{
//定义私有字段
private string coursename;
private int courseid;
//定义属性
public string CourseName{get;set;}
public string CourseId{get;set;}
//定义有参构造函数
public Course(string coursename,int courseid)
{
//此时构造函数变量名与字段名相同(courseid,coursename),加上this就是指向类里的字段
CourseName= this.coursename;//this.coursename 是类里的字段
CourseId= this.courseid;//this.courseid 是类里的字段
//不加this,指向构造函数中的变量
CourseName=coursename;//coursename 是构造函数变量
CourseId=courseid;//courseid是构造函数变量
//this.CourseName等同于CourseName,都是指向类里的属性
}
//方法一
public string CourseOne()
{
return "haha";
}
//方法二
public string CourseTwo()
{
//this.CourseOne()与CourseOne()都指向该类下的方法一,加不加this一样
// return this.CourseOne();
return CourseOne();
}
}
即:this. 指向该类里的字段、属性或方法。this可以理解为这个类。
new 创建对象时,计算机会先生成类里的字段。
垃圾回收 GC
public class Test1
{
//析构函数,这里是示例,因为有GC,析构函数无需写
~Test1()
{
console.WriteLine("析构");
}
}
public class Test2
{
Test1 test1=new Test1();//创建一个对象
test1...//完成工作不被引用后,test1会处于游离状态,GC会不定期清除此类对象
test1=null;//显示的清除对象的引用,此时test1只是一个变量名,没有具体指向。GC会不定期清除。
//强制回收游离态的垃圾,即析构掉无用的对象
//GC.Collect();//由系统帮我们完成,我们没必要去调用
}
如上,C#会不定期清除不被引用的对象,无需我们手动析构。