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、接口对应是面向对象编程思想的重要原则:面向接口编程。

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

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

相关文章

华为配置WDS手拉手业务示例

配置WDS手拉手业务示例 组网图形 图1 配置WDS手拉手业务示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。但企业考虑到AP通过有线部署的成本较高&#xff0c;所以通过建立…

golang 监听ip数据包(golang纯享版)

golang 监听ip数据包(golang纯享版) 【注】本机编译运行平台为linux&#xff0c;如需测试代码请移至linux平台进行代码测试 本文以ip4 作为案例进行包抓取示范&#xff0c;ip6抓取与ip4方式异曲同工&#xff0c;可自行举一反三得出 第一步&#xff0c;通过wireshark抓包拿到…

第四十二回 假李逵翦径劫单身 黑旋风沂岭杀四虎-python读写csv和json数据

李逵答应了宋江三件事&#xff1a;不可吃酒&#xff0c;独自前行&#xff0c;不带板斧。李逵痛快答应了&#xff0c;挎一口腰刀&#xff0c;提着朴刀&#xff0c;带了一锭大银子&#xff0c;三五个小银子就下山去了。 宋江放心不下&#xff0c;于是请同乡朱贵也回家一趟&#…

spring boot3登录开发-3(账密登录逻辑实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 内容简介 用户登录逻辑实现 创建交互对象 1.创建用户登录DTO 2.创建用户登录VO 创建自定义登录业务异…

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> </…

windows11本地深度学习环境搭建Anacond,keras,tensorflow,pytorch, jupyter notebook

前言 工欲善其事&#xff0c;必先利其器。 第一步 安装Anaconda 下载地址&#xff1a; https://www.anaconda.com/download 路径默认 这里都勾选上 然后会卡在这里&#xff0c;卡很久&#xff0c;不用管&#xff0c;等着就行 第二步 配置环境 conda env list 列出所有…

css复习

盒模型相关&#xff1a; border&#xff1a;1px solid red (没有顺序) 单元格的border会发生重叠&#xff0c;如果不想要重叠设置 border-collapse:collapse (表示相邻边框合并在一起) padding padding影响盒子大小的好处使用 margin应用&#xff1a; 行内或行内块元素水…

XFF伪造 [MRCTF2020]PYWebsite1

打开题目 直接查看源码 看到一个./flag.php 访问一下 购买者的ip已经被记录&#xff0c;本地可以看到flag&#xff0c;那么使用xff或者client-ip伪造一下ip试试 bp抓包 加一个X-Forwarded-For头 得到flag

GPT-SoVITS 快速声音克隆使用案例:webui、api接口

参考: https://github.com/RVC-Boss/GPT-SoVITS 环境: Python 3.10 PyTorch 2.1.2, CUDA 12.0 安装包: 1、使用: 1)下载项目 git clone https://github.com/RVC-Boss/GPT-SoVITS.git2)下载预训练模型 https://huggingface.co/lj1995/GPT-SoVITS 下载模型文件放到GPT…

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感&#xff0c;严格遵循黄金分割比例的蓝色点晴线条&#xff0c;加上雾面工艺及高低起伏错落有致的线条处理&#xff0c;在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

关于Kinect 互动沙盘 深度图 Shader Graph 分层

把Kinect的深度图穿给Shader Graph using com.rfilkov.kinect; using UnityEngine; using UnityEngine.UI; public class GetDepthTex : MonoBehaviour { public Material Mat_SandTable; void Update() { Mat_SandTable.SetTexture("_MainTex"…

网络安全笔记总结

IAE引擎 1.深度检测技术--DFI和DPI技术 DFI和DPI都是流量解析技术&#xff0c;对业务的应用、行为及具体信息进行识别&#xff0c;主要应用于流量分析及流量检测。 DPI&#xff1a;深度包检测技术 DPI是一种基于应用层的流量检测和控制技术&#xff0c;对流量进行拆包&#x…

关于git子模块实践(一)

背景 在日常项目开发中&#xff0c;随着项目的迭代&#xff0c;不可避免的是主项目会引入到很多三方库&#xff0c;或者自研的一些模块。有一种场景&#xff0c;就是这些模块&#xff0c;是随着开发而进行迭代&#xff0c;且多个项目公用的&#xff0c;这种情况&#xff0c;在…

测试开源C#人脸识别模块DlibDotNet

百度“C# 换脸”找到参考文献4&#xff0c;发现其中使用DlibDotNet检测并识别人脸&#xff08;之前主要用的是ViewFaceCore&#xff09;&#xff0c;DlibDotNet是Dlib的.net封装版本&#xff0c;后者为开源C工具包&#xff0c;支持机器学习算法、图像处理等算法以支撑各类高级应…

袁庭新ES系列09节 | 使⽤kibana对类型及映射操作

前言 类型及映射是Elasticsearch中重要的两个概念。本章节袁老师将带领同学们来学习Elasticsearch中的类型和映射部分的内容。先透露一下&#xff0c;在Elasticsearch中&#xff0c;类型&#xff08;type&#xff09;相当于关系数据库中的table概念&#xff1b;映射&#xff0…

微服务三十五关

1.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c; 通常说微服务好会和单体项目进行比较。以下是微服务相对于单体项目的一些显著好处&#xff1a; 首先&#xff0c;让我们讨论单体项目的一些主要缺点&a…

解决ubuntu系统cannot find -lc++abi: No such file or directory

随着CentOS的没落&#xff0c;使用ubuntu的越来越多&#xff0c;而且国外貌似也比较流行使用ubuntu&#xff0c;像LLVM/Clang就有专门针对ubuntu编译二进制发布文件&#xff1a; ubuntu本身也可以直接通过apt install命令来安装编译好的clang编译器。不过目前22.04版本下最高…

高通 Android 12 Settings不显示版本号问题

1、最近项目遇到一个奇葩问题&#xff0c;编译系统版本号不见了&#xff1f; 2、一开始我想着可能是自己代码没有make clean结果编译几个小时&#xff0c;然后烧录固件发现还是未生效。 3、然后这时候我又去看git log review最近修改也没有太大发现&#xff08;待定&#xff…

第10章 高级缓存一致性设计

缓存一致性协议如何适应更大规模的系统。广播和侦听协议更早地涉及了可扩展性问题&#xff0c;因为流量和侦听频率时随着处理器个数的增加至少呈线性增加趋势&#xff0c;可用的互连网络带宽会很快被广播流量占满。本章讨论的基于目录式缓存一致性协议来实现可扩展性。主要问题…

ApexRBp在线粒子传感器在电动汽车电池制造的应用

电动汽车电池的崛起与颗粒污染的挑战 随着电动汽车&#xff08;EV&#xff09;市场的迅速扩张&#xff0c;对高性能锂离子电池的需求也急剧增加。这些电池不仅是EV的心脏&#xff0c;更是推动其前行的核心动力。然而&#xff0c;在电池制造的每一个环节&#xff0c;都需要对多…