C#学习笔记_类(Class)

类的定义

类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。

语法格式如下:

访问标识符 class 类名
{
    //变量定义
    访问标识符 数据类型 变量名;
    访问标识符 数据类型 变量名;
    访问标识符 数据类型 变量名;
    ......
    //方法定义
    访问标识符 返回数据类型 函数名(参数数据类型 参数名)
    {
        //函数代码
    }
    访问标识符 返回数据类型 函数名(参数数据类型 参数名)
    {
        //函数代码
    }
    访问标识符 返回数据类型 函数名(参数数据类型 参数名)
    {
        //函数代码
    }
    ......
}

请注意:

  • 访问标识符指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private。
  • 参数数据类型指定了函数参数数据类型,返回数据类型指定了返回的方法返回的数据类型。
  • 如果要访问类的成员,你要使用点(.)运算符。
  • 点运算符链接了对象的名称和成员的名称。

例如下面的实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code
{
    class Apple
    {
        int size;

        public Apple()
        {
            this.size = -1;
        }

        public Apple(int size)
        {
            this.size = size;
        }

        public void sizeSet(int size)
        {
            this.size = size;
        }

        public void sizeGet()
        {
            if (this.size != -1)
                Console.WriteLine("苹果大小为" + this.size);
            else
                Console.WriteLine("这个苹果未获取大小");
        }
    }

    public class code
    {
        public static void Main(string[] args)
        {
            Apple a = new Apple(50);
            Apple b = new Apple();
            a.sizeGet();
            b.sizeGet();
            b.sizeSet(60);
            b.sizeGet();
            Console.ReadKey();
        }
    }
}

代码中使用Apple类定义苹果,苹果有变量size表示大小。Apple类中的方法,sizeGet用于输出苹果大小,sizeSet用于修改苹果大小。在下面Main函数中,a初始化为大小为50的苹果,b初始化为未确定打小的苹果,之后输出两者大小,b苹果改变大小后,输出更新后的b苹果大小。以下是输出结果:

苹果大小为50
这个苹果未获取大小
苹果大小为60

类的成员

类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。例如上面,函数sizeGet、sizeSet等,均是Apple类的成员函数。

成员变量是对象的属性(从设计角度),一般它们保持私有来实现封装。这些变量只能使用公共成员函数来访问。上面size即为Apple类的成员变量。

构造函数

构造函数是一类特殊的成员函数,当创建类的新对象时执行。构造函数的名称与类的名称完全相同,它没有任何返回类型。

默认的构造函数没有任何参数。但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。这种技术可以帮助你在创建对象的同时给对象赋初始值。上面Apple类中,就包括默认构造函数与参数化构造函数。一般为了代码泛用性,类里面都会编写默认构造函数。

在上面,创建Apple对象a、b时,有如下语句:

Apple a = new Apple(50);
Apple b = new Apple();

这里即为对象实例化。两个语句均使用了new关键字,new关键字即实例化的意思,new Apple()就是使用构造函数创建出一个具体的Apple对象。 

析构函数

类的析构函数是类的一个特殊的成员函数,当类的对象超出范围时执行。

析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。在上面的例子中不包含析构函数,现在为该实例添加析构函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code
{
    class Apple
    {
        int size;

        public Apple()
        {
            this.size = -1;
        }

        public Apple(int size)
        {
            this.size = size;
        }

         ~Apple()    //添加的析构函数
        {
            Console.WriteLine("大小为{0}的苹果被吃掉了", size);
        }

        public void sizeSet(int size)
        {
            this.size = size;
        }

        public void sizeGet()
        {
            if (this.size != -1)
                Console.WriteLine("苹果大小为" + this.size);
            else
                Console.WriteLine("这个苹果未获取大小");
        }
    }

    public class code
    {
        public static void Main(string[] args)
        {
            Apple a = new Apple(50);
            Apple b = new Apple();
            a.sizeGet();
            b.sizeGet();
            b.sizeSet(60);
            b.sizeGet();
            Console.ReadKey();
        }
    }
}

程序执行结束后,输出:

苹果大小为50
这个苹果未获取大小
苹果大小为60

大小为60的苹果被吃掉了

大小为50的苹果被吃掉了 

在程序执行结束时,会调用析构函数释放对象占用的资源,可见程序最后输出内容,析构函数已调用。

访问修饰符

访问修饰符标记所修饰内容保护级别。常见的访问修饰符有public、private、protected、internal。访问修饰符可以修饰类,也可以修饰成员。

public

public表示所修饰的内容是公共的,访问不受限制,所有项目中代码均可以访问。

例如上面实例中,Apple类成员函数均为public,此时主函数使用Apple类中public修饰的成员函数均不会报错。

    public class code
    {
        public static void Main(string[] args)
        {
            Apple a = new Apple(50);
            Apple b = new Apple();
            a.sizeGet();    //成员函数为public类型,可以直接访问
            b.sizeGet();
            b.sizeSet(60);
            b.sizeGet();
            Console.ReadKey();
        }
    }

internal

internal所修饰的类,将限制为内部类,即只有当前项目中的代码才能访问它。internal用法如下所示:

namespace J3
{
    //使用internal修饰为内部类
    internal class Person
    {
        string name;
        int age;
        public Person(){
            name = "Jackie";
            age = 20;
        }
        public void saying() {
            Console.WriteLine("my name is "+name+", my age is "+age);
        }
    }
    public class myCaller {
        public static void Main(string[] args) {
            Person p = new Person();
            p.saying();
        }
    }
}

由于两个类在同一命名空间,myCaller可以调用并实例化Person类。需要注意,class类默认为internal,如果需要使用特定的访问权限,需要对其修饰。

private

关键字private将修饰的内容访问限制为私有的。class类中成员默认为private,例如上面的实例,Apple类中成员size即默认private。private修饰的内容只能通过成员函数访问,例如其中的构造函数Apple。如果再Main函数中试图直接访问size,则会:

如图可见,程序报错无法编译。因为size受private修饰,此时无法被直接访问。

protected

protected修饰内容与private基本相似。但当两个类存在继承关系的时候,例如类A继承于类B,那么对于类B则可访问protected修饰的类成员,而不可访问private修饰的类成员。继承将在之后实训学习,此处仅给出一个实例。

namespace J3
{
    class Person
    {
        //使用protected修饰
        protected string skinColor;
        public void saying() {
            Console.WriteLine("my skin color is " + skinColor);
        }
    }
    //WhitePerson类继承Person类
    class WhitePerson : Person {
        static void Main(string[] args){
            WhitePerson wp = new WhitePerson();
            wp.skinColor = "White";
            wp.saying();
        }
    }
}

输出结果为:

my skin color is White

static静态成员

当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。例如上面的Apple对象,添加苹果数量num成员:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code
{
    class Apple
    {
        int size;
        static int num=0;    //添加的静态成员num

        public Apple()
        {
            this.size = -1;
            num += 1;    //构造对象的时候,苹果数量+1
        }

        public Apple(int size)
        {
            this.size = size;
            num += 1;    //构造对象的时候,苹果数量+1
        }

         ~Apple()
        {
            Console.WriteLine("大小为{0}的苹果被吃掉了", size);
            num -= 1;    //析构对象的时候,苹果数量-1
        }

        public void sizeSet(int size)
        {
            this.size = size;
        }

        public void sizeGet()
        {
            if (this.size != -1)
                Console.WriteLine("有{0}个苹果,这个苹果大小为{1}" ,num, this.size);
            else
                Console.WriteLine("这个苹果未获取大小");
        }

        public static void numGet()    //静态成员函数,只能访问Apple类中静态成员变量
        {
            Console.WriteLine("当前苹果数量为{0}", num);
        }
    }

    public class code
    {
        public static void Main(string[] args)
        {
            Apple a = new Apple(50);
            a.sizeGet();
            Apple b = new Apple();
            b.sizeGet();
            b.sizeSet(60);
            b.sizeGet();
            Apple.numGet();    //调用静态成员函数
            Console.ReadKey();
        }
    }
}

输出结果:

有1个苹果,这个苹果大小为50
这个苹果未获取大小
有2个苹果,这个苹果大小为60
当前苹果数量为2

大小为60的苹果被吃掉了

大小为50的苹果被吃掉了

代码中可见,静态成员变量需要设定初始值,本实例中静态成员num表示苹果数量,因此初始苹果数量为0。每次创建Apple类对象,苹果数+1,而释放空间时苹果数-1。在程序中,所有对象共用一个num成员变量,因此实际上苹果数改动在不同对向上的操作都会被继承。

此外,其中的成员函数numGet,同样是静态成员。静态成员函数只能访问静态变量,如果试图在其中使用其它成员变量,程序同样会报错。静态函数在对象被创建之前就已经存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/365006.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】-多线程的知识都收尾(线程池,封装的线程,单例模式,自旋锁)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

深度剖析Sentinel热点规则

欢迎来到我的博客,代码的世界里,每一行都是一个故事 深度剖析Sentinel热点规则 前言核心概念解析:数字守护者的起源核心概念解析:简单示例演示: 参数索引:规则的基石参数索引的作用:不同场景下选…

2024美国大学生数学建模美赛选题建议+初步分析

总的来说&#xff0c;去年算是美赛环境题元年&#xff0c;去年的开放度是较高的&#xff0c;今年每种赛题类型相对而言平均了起来 提示&#xff1a;DS C君认为的难度&#xff1a;E<BCF<AD&#xff0c;开放度&#xff1a;DBCE<A<F。 以下为A-F题选题建议及初步分析…

小型内衣裤洗衣机哪个牌子好?家用小型洗衣机推荐

相信对于很多用户而言&#xff0c;宁愿强撑着疲惫的身子手洗内衣裤&#xff0c;也不愿把内衣裤与外穿衣物一起放进洗衣机洗。内衣裤与外穿衣物的脏污情况不同&#xff0c;内衣裤是贴身衣物&#xff0c;上面留有人体的汗液和分泌物&#xff0c;有可能带有大量真菌。而外衣上则是…

动环系统断电告警的防误报

机房一般接入的市电为三相380伏特&#xff0c;也有用单向220伏特的。UPS本身提供断电告警的功能&#xff0c;这个告警在各种种类的UPS中都是提供的&#xff0c;不同电压的市电输入都支持&#xff1b;三相电另外有缺相告警事件。但这些告警事件存在抖动或者误判。 瞬间的低压或…

LiveGBS流媒体平台GB/T28181功能-支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务

LiveGBS功能支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 LiveCMS 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、验证HTTPS服务3、为什么要开启HTTPS3.1、安全性要求3.2、功能需求 4、搭…

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…

Vue中使用 Element-ui form和 el-dialog 进行自定义表单校验清除表单状态

文章目录 问题分析 问题 在使用 Element-ui el-form 和 el-dialog 进行自定义表单校验时&#xff0c;出现点击编辑按钮之后再带年纪新增按钮&#xff0c;出现如下情况&#xff0c;新增弹出表单进行了一次表单验证&#xff0c;而这时不应该要表单验证的 分析 在寻找多种解决…

深信服技术认证“SCCA-C”划重点:深信服云计算关键技术

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08…

【无刷电机学习】电流采样电路硬件方案

【仅作自学记录&#xff0c;不出于任何商业目的】 目录 AD8210 INA282 INA240 INA199 AD8210 【AD8210数据手册】 在典型应用中&#xff0c;AD8210放大由负载电流通过分流电阻产生的小差分输入电压。AD8210抑制高共模电压(高达65V)&#xff0c;并提供接地参考缓冲输出&…

Trie树数据结构——(字符串统计,最大异或对)

Trie树&#xff1a;是一种能够高效存储和查找字符串集合的数据结构 Trie字符串统计 思路&#xff1a; &#xff08;笔记来自AcWing 835. Trie字符串统计 - AcWing&#xff09; 代码如下&#xff1a; #include<iostream> #include<cstdio> #include<string>…

华为FreeClip耳机可以调节音量大小吗?附教程!

不会只有我一个人吧&#xff1f;都用华为FreeClip耳机一段时间了&#xff0c;才发现它竟然不支持在耳机上直接调节音量&#xff0c;也是没谁了&#xff01;但是后来自己摸索了一下&#xff0c;发现了华为FreeClip耳机原来是几个简单有效的调节音量大小的方法滴~不得不说&#x…

计算机视觉:高级图像处理,满足您的所有需求。

一、说明 特征提取是机器学习管道中的关键步骤&#xff0c;可增强模型在不同数据集上的泛化和良好表现能力。特征提取方法的选择取决于数据的特征和机器学习任务的具体要求。本文揭示图像处理的数学原理&#xff0c;实现增强的计算机视觉 二、关于计算机视觉的普遍问题 在计算机…

Nginx 多项目部署,vue刷新404 解决方案

网上找的资料大多都解决不了&#xff0c;废话不多说直接告诉你解决方法。 环境是 TP6 VUE前端官网 VUE 后台管理 部署 两个项目 刷新 404 解决方案 Nginx 配置 直接贴图 如果解决了&#xff0c;给我顶起来&#xff0c;让更多人 快速的解决。

借力华为云CodeArts,使用软件开发生产线快速搭建项目

前言 项目的实际开发&#xff0c;研发接到需求并不是立马进入开发的&#xff0c;实际的开发生成流程是一个完整的迭代流程。 流程的节点和每个节点的内容如下&#xff1a; 开发生产的流程很标准很规范&#xff0c;看似研发只需要按照流程执行每一步的操作即可。但实际开发中&…

2024美赛数学建模E题思路分析 - 财产保险的可持续性

1 赛题 问题E&#xff1a;财产保险的可持续性 极端天气事件正成为财产所有者和保险公司面临的危机。“近年来&#xff0c;世界已经遭受了1000多起极端天气事件造成的超过1万亿美元的损失”。[1]2022年&#xff0c;保险业的自然灾害索赔人数“比30年的平均水平增加了115%”。[…

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数&#xff0c;根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…

实验二 DES密码算法的设计与实现

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;简单外包单 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

Git版本管理工具(实战进阶):零基础到起飞实战项目完整篇 →Git学习一篇就够 从基本指令、到本地仓库、远程仓库、实战项目开发演练介绍超详细!

heima 李师傅最新版 Git的讲解 文章目录 Git在实战项目开发使用功能学习01.Git 初识02.Git 仓库03.Git 的三个区域04.Git 文件状态05.Git 暂存区作用06.练习-登录页面07.Git-切换版本08.删除文件09.忽略文件10.分支的概念11.练习-登录 bug 修复12.分支-合并与删除13.分支-合并与…

LeetCode--189

189. 轮转数组 提示 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…