C# 字段、属性,构造方法相关 及类中的this、GC垃圾回收

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#会不定期清除不被引用的对象,无需我们手动析构。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值