c# 类的介绍及延伸

类介绍

类的定义是以关键字 class 开始,后跟类的名称

类属于引用类型,只能通过new方式创建。

如果类定义中没有指定基类,那其基类为system.object

// <访问修饰符> class class类名

<access specifier> class  class_name

{

    // 成员属性

    <access specifier> <data type> variable1;

// 成员方法

    <access specifier> <return type> methodN(parameter_list)

    {

        // method body

    }

}

类的访问修饰符

无或internal: 只能在当前项目中访问类

public:可以在任何地方访问类

abstract或internal abstract:类只能在当前项目中访问,不能实例化,只能供继承使用

public abstract:类可以在任何地方访问,不能实例化,只能供继承使用

sealed或internal sealed:类只能在当前项目中访问,不能供派生使用,只能实例化

public sealed:类可以在任何地方访问,不能供派生使用,只能实例化

类成员的访问修饰符

所有类型和类型成员都具有可访问型级别简单来说就是当前函数或属性的访问权限。

public 整个解决方案中访问。

protected internal 是protected 和 internal 的并集,符合任意一条都可以访问。

proteced 只允许在当前类内部以及该类的子类中访问。

internal 只能在当前项目中访问。在同一个项目中与 public 的权限一致。

private 只允许在本项目本类中被访问。

静态成员(函数

C#的类静态成员变量和类静态成员函数和c++一致。区别在于:c#可以在类的定义内部初始化静态变量,而c++不行

字段和属性

C#字段相当于c++的成员变量,属性是一个类中的变量属性,可以在函数中访问和使用。并且保持私有性来实现封装。属性可以看成是通过访问器对字段进行访问。

    class CPerson

    {

        private int age; // 字段

        public int Age

        {

            get { return age; }

            set { age = value; }

           } // 属性

}

或者直接自动实现属性

    class CPerson

{

     public int Age { get; set; } // 属性

 }

自动实现的属性可以使用属性初始化器来初始化:

    class CPerson

    {

        public int Age { get; set; } = 1;// 属性

 }

可以给属性的get和set设置不同的访问修饰符,但get和set必须有一个采用属性的访问级别。

如: public int Age { get; private set; }

方法

即是类的成员函数。

[访问修饰符] <返回值类型> <方法名> ([参数列表])

{

    // 方法体;

}

和c++一样可以重载、重定义、虚函数。

表达式体方法

如果方法只有1条语句。不需要编写花括号和return关键字,而是使用“=>”,其左边为声明,右边为定义。

public bool isSquare(Rectangle rect) => rect.h == rect.w;

参数传递

当调用带有参数的方法时,您需要向方法传递参数。在 C# 中,有三种向方法传递参数的方式:值类型,引用类型,输出类型

值传递:写法和c++一样

引用类型ref关键词指定,使用:1、调用函数变量必须非常量;2、调用变量必须初始化

输出类型可以返回多个值;关键字为out

注:输出变量与引用变量的区别
1、未初始化的变量用作ref非法,而out合法;
2、函数调用out参数量,必须把它当作尚未赋值(即可以把已赋值的变量当作out参数,但存储在该变量中的值在方法执行时会丢失);
3、ref,out必须在调用及定义方法时声明;

in:表示向方法传递一个值类型,避免复制值的开销,同时又不想在方法内改变值。

个数可变的参数

方法1:声明数组类型的参数,添加 params 关键字,就可以使用任意数量的 int 参数调用该方法。

方法2:如果应该把不同类型的参数传递给方法,可以使用 object 数组

如果 params 关键字与方法签名定义的多个参数一起使用,则 params 只能使用一次,而且它必须是最一个参数

    class CPerson

    {

        public int add(int nIndex,params object[] data)

        {

            return 0;

        }

    }

静态构造函数

这种构造函数整个程序运行期间只执行一次类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性在 C# 中,通常在第一次调用类的任何成员之前执行静态构造函数(静态构造函数至多执行一次)而c++没有静态构造函数的概念。

    class CPerson

    {

        static CPerson()

        {

             number = 2;

        }

        public static int number;

     }

多重继承

C# 不支持多重继承。但是,您可以使用接口来实现多重继承C++支持多重继承。

调用方法的基类版本

在c#使用base关键字来调用.而在c++是 基类名::方法名

c#结构体和类的区别

第一点 存储空间

结构体跟类最大的区别在于存储空间,结构体是值,存在上,类是引用,存在上。

第二点 特性

面向对象思想中有三大特性,封装,继承,多态,结构体具备封装的特性,但不具备继承多态的特性。

注意:在c++中,结构体支持继承。

第三点 初始值

结构体成员变量申明不能指定初始值,而类可以。

注意:在c++中,结构体可以变量申明指定初始值

第四点 protected访问修饰符 

结构体成员不能使用protected访问修饰符
第五点 无参构造函数

结构体中不能申明无参的构造函数,而类可以、

注意:c++,结构体中能申明无参的构造函数


第六点 有参构造函数

在类中申明有参构造函数后,无参构造函数会被顶掉,如果想使用无参构造函数,必须重写无参构造函数.



结构体中申明有参构造函数后,无参构造不会被顶掉


第七点 析构函数

结构体中不能申明析构函数,而类可以

注意:在c++结构体中能申明析构函数



第八点 继承

结构体不能被继承,而类可以

注意:在c++结构体能被继承


第九点 初始化

结构体需要在构造函数中初始化所有成员变量,而类随意


第十点 静态

结构体不能被静态static修饰,而类可以


第十一点内部申明自己

结构体不能在内部申明和自己一样的结构体变量,而类可以

抽象类(abstract)

抽象类的用途是提供一个可供多个派生类共享的通用基类定义。

    public abstract class school

    {

        public int a;

public void func1() { }

        public virtual void getname() { }

    }

    public class myschool: school

    {

        public override void getname()

        {

            Console.WriteLine("myschool");

        }

 }

特点

  1. 包含抽象方法、虚方法、常规方法和属性。
  2. 抽象类不能实例化只能被继承
  3. 抽象方法没有实现,必须在派生类中被实现,否则派生类也必须声明为抽象类。

抽象方法自动是虚方法。

  1. 如果一个类有抽象方法,则该类就是抽象类,必须用abstract 声明。
  2. 抽象方法必须被声明为public,因为派生类必须可以访问它。

密封类(sealed 

密封类不能用作基类。它也不能是抽象类。 密封类禁止派生。

在对基类的虚成员进行重写的派生类上,方法、索引器、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中 sealed 关键字置于 override 关键字前面


使用场景:供库,类或者自己编写的其他类的内部操作使用。

public sealed class D

{

    // Class members here.

}

    class CPerson

    {

        static CPerson()

        {

            number = 2;

        }

        public static int number;

        public int Age { get; set; } // 属性

        public virtual void func()

        {

        }

    }

    class computer: CPerson

    {

        public sealed override void func() { }

}

接口(interface)

接口是指定一组函数成员不实现它们的引用类型.

    public interface ISpecialLoad

    {

        void load();

    }

    public interface ILoad

    {

        void load();      

    }

    public interface ISave

    {

        void save();

    }

    public interface IPerson: ILoad, ISave

    {

        //public int a;

        void check();

        string getname();

    }

    public class CMen : IPerson

    {

        public void check()

        {

            int a = 1;

        }

        public string getname()

        {

            return "a";

        }

        public void save()

        {

            int a = 2;

        }

        public void load()

        {

            int a = 3;

        }

    }

    public class CWomen : ILoad, ISpecialLoad

    {

        public void load()

        {

            Console.WriteLine(" load ");

        }

}

    public class CStudent : ILoad, ISpecialLoad

    {

        void ILoad.load()

        {

            Console.WriteLine("ILoad load ");

        }

        void ISpecialLoad.load()

        {

            Console.WriteLine("ISpecialLoad load ");

        }

        void func()

        {

            ((ILoad)this).load();//调用ILoad接口

        }

}

特点:

  1. 接口可以包含实例方法、属性、事件、索引器或这四种成员类型的任意组合
  2. 不能包含构造函数。
  3. 不能包含字段。
  4. 成员不指定访问关键字(隐式是public)。
  5. 接口不能被实例化
  6. 接口可以多继承。接口可以从一个或多个接口继承,因此接口包含它继承的所有接口和所有基接口的成员。
  7. 只有类或者结构才能实现接口,必须为接口的每一个成员(包括其基类的)提供实现。
  8. 如果一个类实现了多个接口,并且其中一些接口有相同签名和返回类型的成员,那么类可以实现单个成员来满足所有包含重复成员的接口。
  9. 显式接口成员实现。可以使用限定接口名称显式地为每一个接口分别进行实现。实现类中的显示接口成员实现只可以通过指向接口的引用来访问。

抽象类(abstract)和接口(interface)的关系

相同点

1、不能实例化;

2、包含未实现的方法声明

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)

不同点

1、接口可以多继承,抽象类不能实现多继承

2、接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员。

3、接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念。

4、接口支持回调抽象类不能实现回调,因为继承不支持。

5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法

6、接口可以作用于值类型和引用类型,抽象类只能作用于引用类型(例如:Struct只能继承接口)。

7、抽象类应主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能。

8、接口着重于Can—Do关系类型,抽象类则偏重于IS—A式关系。

9、接口多定义对象的行为,抽象类多定义对象的属性。

10、如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类。

11、接口对应是面向对象编程思想的重要原则:面向接口编程。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Math.random、Random随机数的生成

Math.random、Random随机数的生成 Math.random() 方法案例&#xff1a;生成随机整数案例&#xff1a;生成随机字符 Random()类Random生产区间随机数的技巧&#xff1a;减加法案例&#xff1a;猜测随机一个幸运号码 1 - 100案例&#xff1a;生成随机字符 Math.random() 方法 Ma…

数据价值在线化丨TiDB 在企查查数据中台的应用及 v7.1 版本升级体验

本文介绍了企查查在数据中台建设中使用 TiDB 的经验和应用。通过从 MySQL 到 TiDB 的迁移&#xff0c;企查查构建了基于 TiDB Flink 的实时数仓框架 &#xff0c;充分利用了 TiDB 的分布式架构、MySQL 兼容性和完善的周边工具等特性&#xff0c;实现了数据的在线化处理。2023 年…

ACM题解Day6 | 质数素数模块 | 完数难题

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门算法 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽…

Vue模板引用之ref特殊属性

1. 使用实例 <template><input ref"input" name"我是input的name" /><br /><ul><li v-for"arr in array" :key"arr" id"111" ref"itemRefs">{{arr}}</li></ul> </…

较通用web脚手架模板搭建

较通用web脚手架模板搭建 从这里开始就接触到以后写项目的思维了。 做一个web开发&#xff0c;那就要层次分明&#xff0c;要有个实现的规划&#xff0c;这通常也是有一个较为通用的模板的。 总的来说&#xff1a;不同的层次有不同的模块&#xff0c;每个模块有必须实现的功…

常用!基础!吴恩达deeplearning.ai:Tensorflow中数据形式

由于一些历史遗留问题&#xff0c;Numpy和Tensorflow在数据处理方面存在一些不一致的地方&#xff0c;今天我们主要来了解一下其中一些约定俗成的形式&#xff0c;从而能够让你写出正确的代码(耍帅&#xff09;。 文章目录 Tensorflow是如何表示数据的特征向量关于Numpy矩阵激…

Flutter(一):安装和环境配置、创建Flutter项目

安装和环境配置、创建Flutter项目 Flutter 下载方式1方式2 Flutter 环境配置配置国内镜像站点解压 Flutter将 flutter 添加到系统环境变量中运行 flutter doctor来验证安装 Android Studio下载插件创建项目安装 Android SDK 工具在模拟器上运行 Flutter 下载 方式1 全版本&…

深度学习介绍与环境搭建

深度学习介绍与环境搭建 慕课大学人工智能学习笔记&#xff0c;自己学习记录用的。&#xff08;赋上连接&#xff09; https://www.icourse163.org/learn/ZUCC-1206146808?tid1471365447#/learn/content?typedetail&id1256424053&cid1289366515人工智能、机器学习与…

数据结构day4

实现创建单向循环链表、创建结点、判空、输出、头插、按位置插入、尾删、按位置删除 loop_list.c #include "loop_list.h" loop_p create_head() {loop_p L(loop_p)malloc(sizeof(loop_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->le…

华为配置WLAN AC和AP之间VPN穿越示例

配置WLAN AC和AP之间VPN穿越示例 组网图形 图1 配置WLAN AC和AP之间VPN穿越示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响…

CentOS 7.9.2009离线安装mysql 8.0客户端 (rpm包)

环境&#xff1a; #需求&#xff1a; 该服务器需要将csv文件入库到远端的mysql 服务器上。 CentOS Linux release 7.9.2009 (Core) 离线环境 &#xff0c;需安装mysql客户端 8.0.27#下载地址 https://downloads.mysql.com/archives/community/#按此顺序安装 rpm -ivh mysql…

alist修改密码(docker版)

rootarmbian:~# docker exec -it [docker名称] ./alist admin set abcd123456 INFO[2024-02-20 11:06:29] reading config file: data/config.json INFO[2024-02-20 11:06:29] load config from env with prefix: ALIST_ INFO[2024-02-20 11:06:29] init logrus..…

Kotlin filterIsInstance filterNotNull forEach

Kotlin filterIsInstance filterNotNull forEach fun main(args: Array<String>) {val i1 MyItem(1, 1)val i2: MyItem? nullval i3: Int 3val i4 "4"val i5 nullval i6 MyItem(6, 6)val list mutableListOf<Any?>(i1, i2, i3, i4, i5, i6)lis…

【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)

文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频&#xff0c;在这个文章做一些笔记和心得&#xff0c;本篇文章就写了一些基础算法…

【初始RabbitMQ】高级发布确认的实现

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&#xff1f; …

浅谈集群的分类

本文主要介绍集群部署相关的知识&#xff0c;介绍集群部署的基础&#xff0c;集群的分类、集群的负载均衡技术&#xff0c;集群的可用性以及集群的容错机制。随后介绍Redis-Cluster以及Mysql的架构以及主从复制原理。 集群介绍 单台服务器本身会受到带宽、内存、处理器等多方面…

万界星空科技电子机电行业MES系统,2000元/年起

电子行业在生产管理上具有典型的离散制造特点&#xff0c;采用多品种、多批量或单件的生产组织方式。产品升级换代迅速&#xff0c;生命周期短&#xff0c;变更频繁&#xff0c;版本控制复杂。 同时产品的种类较多&#xff0c;非标准产品多&#xff0c;加工工序复杂&#xff0…

使用MongoDB数据库和Mongoose库在Node.js中进行数据存储

在Node.js中使用MongoDB数据库和Mongoose库进行数据存储是前端开发中常用的技术之一。MongoDB是一种非关系型数据库&#xff0c;具有高性能、易扩展等优点&#xff1b;而Mongoose是在Node.js中对MongoDB进行操作的框架&#xff0c;简化了数据库操作&#xff0c;并提供了丰富的功…

Leetcode日记 2583. 二叉树中的第 K 大层和

Leetcode日记 2583. 二叉树中的第 K 大层和 题目&#xff1a;解题思路&#xff1a;代码实现制作不易&#xff0c;感谢三连&#xff0c;谢谢啦 题目&#xff1a; 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和…

QT常用类

五、常用类 QString 字符串类&#xff08;掌握&#xff09; QString是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c; 不再使用ASCII编码。QString使用的是Unicode编码。 QString中每个字符都是一个16位的QChar&#xff0c;而不是8位的char。 QString完全支持中文&…