C#(十六)之C#类中的成员属性 构造函数 析构函数

53 篇文章 1 订阅
22 篇文章 0 订阅

C#中类的成员属性、构造函数、析构函数。

代码是基于昨天类的代码进行测试的。

基本代码:

/*声明对象*/
cat Tom = new cat();
Tom.age = -1;  //设置年龄
Tom.TalkAge();  //输出:我今年-1岁了

类中的方法:

/*我今年几岁了*/
public void TalkAge()
{
     Console.WriteLine("我今年{0}岁了",age);
}

这个代码是没有问题的,但是逻辑有问题,没有人可能是-1岁。

那么可以定义一个访问器进行数据合法性的检查。

这样做的好处就是即检查了数据的合法性,又加强了类的封装

上代码:

类中的代码:


private int age;
private int miceCount = 0;// 私有的
        /*访问器 start*/
        public void TellAge(int getAge)
        {
            if (getAge < 0)
            {
                age = 0;
            }
            else {
                age = getAge;
            }
        }
        public int PutAge()
        {
            return age;
        }
        /*访问器 end*/

调用:

Tom.TellAge(3);
int age = Tom.PutAge();
Console.WriteLine("我今年{0}岁了", age);  //输出我今年3岁了
// 输出负数是什么效果,可以自己尝试下。

C#中这样写是没有问题的,但是C#提供了一个更好的解决方法:属性

定义属性:

private int age;       
        // 定义一个属性
        public int Age
        {
            get{ // 返回值
                return age;
            }
            set{ //赋值
                if(value > 0){
                    age = value;
                }else{
                    age = 0;
                }
            }
        }
// value 关键字就是赋给变量的值
  
// 调用属性
            Tom.Age = -1;
            Console.WriteLine("我今年{0}岁了",Tom.Age);  //输出:我今年0岁了
 

接下来看下C#类中的构造函数:

1:默认构造函数:

就是我们在使用类的时候实例化的函数:

/*声明对象*/
cat Tom = new cat();

然后再对类中声明的共有属性进行赋值。

2:带参数的构造函数:

如果类型声明的变量都是私有的,我们可以通过构造函数给其赋值。

构造函数名称必须与类名称相同

类:

/*声明构造函数*/
        public cat(string putname,int putage)
        {
            age = putage;
            name = putname;
            Console.WriteLine("我叫{0},今年{1}岁了",name,age);
            // 输出:我叫gc,今年23岁了
        }

调用:

/*声明对象*/
cat Tom = new cat("gc",23);

3:无参构造函数

说白了就是把有参构造函数里边的参数给去了就行了。

/*声明构造函数*/
        public cat()
        {
            age = 0;
            name =’’;
            Console.WriteLine("我叫{0},今年{1}岁了",name,age);
            // 输出:我叫gc,今年23岁了
        }

调用:

/*声明对象*/
cat Tom = new cat();

析构函数:

作用:删除或者释放掉不使用的对象来释放内存空间。

析构函数的定义:

/*析构函数*/
~cat() {
      Console.WriteLine("我走了");
}

C#程序中在创建类的时候默认定义了一个构造函数与析构函数,所以,没有特殊需要,不需要二次定义。

析构函数让我定义在了构造函数下边,那我在析构函数下边定义一个类,看其是否可以访问到。

//在类中添加了析构函数
            cat Tom = new cat();
            //输出:
            /*
             我来了
             我走了
             */
            // 析构函数让我定义在了构造函数下边,那我在析构函数下边定义一个类,看其是否可以访问到。
            for (int i = 0; i < 5; i++)
            {
                Tom.CatchMouse();
                /*
                输出:
                我来了
                我抓了1只老鼠
                我抓了2只老鼠
                我抓了3只老鼠
                我抓了4只老鼠
                我抓了5只老鼠
                我走了
                 */
            }
            // 析构函数是在函数调用之后再执行的,与其放置的位置没有关系。

析构函数用处不大,知道就好。

测试所用代码:

类文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace gc
{
    class cat
    {
        public string name;       // 共有的
        private int age;
        private int miceCount = 0;// 私有的
        
        /*声明无参构造函数*/
        public cat()
        {
            age = 0;
            name = "";
            Console.WriteLine("我来了");
        }
        /*析构函数*/
        ~cat() {
            Console.WriteLine("我走了");
        }
        /*声明有参构造函数*/
        /*public cat(string putname,int putage)
        {
            age = putage;
            name = putname;
            Console.WriteLine("我叫{0},今年{1}岁了",name,age);
            // 输出:我叫gc,今年23岁了
        }//*/
        // 定义一个属性
        public int Age
        {
            get{ // 返回值
                return age;
            }
            set{ //赋值
                if(value > 0){
                    age = value;
                }else{
                    age = 0;
                }
            }
        }
        /*访问器 start*/
        public void TellAge(int getAge)
        {
            if (getAge < 0)
            {
                age = 0;
            }
            else {
                age = getAge;
            }
        }
        public int PutAge()
        {
            return age;
        }
        /*访问器 end*/
        /*我今年几岁了*/
        public void TalkAge()
        {
            Console.WriteLine("我今年{0}岁了", age);
        }
        /*私有行为*/
        private void Hello()
        {
            Console.WriteLine("只有我自己能用");
        }
        /*公共行为*/
        public void Method()
        {
            Hello();
            Console.WriteLine("别人可以调用我");
        }
        /*捉老鼠*/
        public void CatchMouse()
        {
            miceCount++;
            //Hello();
            Console.WriteLine("我抓了{0}只老鼠", miceCount);
        }
        
    }
}

主文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gc; //使用自己定义类的命名空间
namespace gc
{
    class Program
    {
        /* C#主要的运行函数,就是main函数 */
        static void Main(string[] args)
        {
            /*声明对象*/
            /*cat Tom = new cat();
            //Tom.name = "Tom"; // 设置姓名
            //Tom.age = -1;  //设置年龄
            //Tom.TalkAge();  //输出:我今年-1岁了
            Tom.TellAge(3);
            int age = Tom.PutAge();
            //Console.WriteLine("我今年{0}岁了", age);  //输出我今年3岁了
            // 输出负数是什么效果,可以自己尝试下。
            // 调用属性
            Tom.Age = -1;
            //Console.WriteLine("我今年{0}岁了",Tom.Age);  //输出:我今年0岁了//*/
            //在类中添加了析构函数
            cat Tom = new cat();
            //输出:
            /*
             我来了
             我走了
             */
            // 析构函数让我定义在了构造函数下边,那我在析构函数下边定义一个类,看其是否可以访问到。
            for (int i = 0; i < 5; i++)
            {
                Tom.CatchMouse();
                /*
                输出:
                我来了
                我抓了1只老鼠
                我抓了2只老鼠
                我抓了3只老鼠
                我抓了4只老鼠
                我抓了5只老鼠
                我走了
                 */
            }
            // 析构函数是在函数调用之后再执行的,与其放置的位置没有关系。
        }
        
    }
}

有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

欢迎访问小程序:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值