当前位置: 首页 > news >正文

9. C#面向对象基础

一、C# 类

        在 C# 中,类是引用类型的。类由成员属性和成员方法构成。我们可以动态创建类的实例(instance),这个实例也被称为对象(object),我们可以通过类和对象来设计程序。

1、类的定义

        类的定义需要使用 class 关键字,语法格式如下:

<access_specifier> class class_name
{
    // 成员属性
    <access_specifier> <data_type> variable1;
    ...


    // 成员方法
    <access_specifier> <return_type> method1(parameter_list)
    {
        // 函数体
    }
}

语法说明如下:

  • <access_specifier> 为访问权限修饰符,用来指定类或类中成员的访问权限。类的默认访问权限修饰符是 internal,类中成员的默认访问权限修饰符是 private;
  • class_name 为类的名称;
  • <data_type> 为数据类型,用来指定成员属性的数据类型;
  • variable1 等为成员属性的名称,类似于变量名;
  • <return_type> 为返回值类型,用来指定成员函数的返回值类型;
  • method1 等为成员函数的名称;

2、对象的创建

        类和对象是不同的概念,类决定了对象的类型,但不是对象本身。类是在开发阶段创建的,而对象则是在程序运行期间创建的。对象是基于类创建的实体,也称为类的实例。

(1)使用 new 关键字创建对象

        假如我们创建了一个名为 Student 的类,若要创建这个类的对象(实例),语法格式如下:

Student Object = new Student();

        前面的 Student 是我们要创建的对象类型,而 Object 则是一个变量,它引用了 Student 类实例(Student 类的对象)的内存地址。

        new 关键字在这里的作用主要是在程序运行时为类的实例分配内存。

(2)使用已创建对象赋值

        我们像创建普通变量那样只创建一个 Student 类型的变量,而不使用 new 关键字实例化 Student 这个类,例如:

Student Object2;

注意:这里的 Object2 只是一个 Student 类型的普通变量,它并没有被赋值,所以不能使用 Object2 来访问对象中的属性和方法。

此时,我们将一个已经创建的对象赋值给它,这时就可以使用 Object2 来访问对象中的属性和方法了。例如:

Student Object3 = new Student();
Object2 = Object3;

注意:示例中的 Object2 和 Object3 指向同一个 Student 对象,因此使用 Object2 对 Student 对象的任何操作也会影响到 Object3。

3、类和对象的使用

        我们可以通过 . 运算符来访问类中的成员,如下所示:

Student Object = new Student();

Object.variable;      // 访问成员属性
Object.method();    // 访问成员方法

举例:

class Program
{static void Main(string[] args){Student s1 = new Student();s1.insert(1, "Tom", "男", 10);s1.display();Student s2 = new Student();s2.insert(2, "Jerry", "女", 5);s2.display();}
}
public class Student
{public int id;public string name;public string sex;public int age;public void insert(int id, string name, string sex, int age){this.id = id;this.name = name;this.sex = sex;this.age = age;}public void display(){Console.WriteLine("编号:{0}  姓名:{1}  性别:{2}  年龄:{3}", id, name, sex, age);Console.ReadKey();}
}

二、C# 构造函数

        在 C# 中,构造函数是与类(或结构体)具有相同名称的成员函数,不需要我们主动调用。当我们创建一个类的对象时会自动调用类中的构造函数,通常使用构造函数来初始化类中的成员属性。

        C# 中的构造函数有三种:

  • 实例构造函数;
  • 静态构造函数;
  • 私有构造函数;

1、实例构造函数

        实例构造函数是类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。如下所示:

public class Person
{private string name;private int age;public Person(string n, int a){name = n;age = a;}...}// 只要创建 Person 类的对象,就会调用类中的实例构造函数。
// 我们只需要在实例化对象时将具体的值传递给类中的构造函数即可,如下所示:
Person P = new Person("张三", 18);

        如果没有为类显式的创建构造函数,那么 C# 将会为这个类隐式的创建一个无参构造函数,这个无参构造函数会在实例化对象时为类中的成员属性设置默认值。在结构体中也是如此,如果没有为结构体创建构造函数,那么 C# 将隐式的创建一个无参构造函数,用来将每个字段初始化为其默认值。

2、静态构造函数

        静态构造函数用于初始化类中的静态数据或执行仅需执行一次的特定操作。静态构造函数将在创建第一个实例或引用类中的静态成员之前自动调用。

        静态构造函数具有以下特性:

  • 类或结构体中只能有一个静态构造函数,不能使用访问权限修饰符修饰,不能有参数;
  • 静态构造函数不能继承或重载,不能直接调用,仅可以由公共语言运行时 (CLR) 调用;
  • 用户无法控制程序中静态构造函数的执行时间,静态构造函数在实例构造函数之前运行;

举例:

        实例构造函数与静态构造函数的调用时机,如下所示:

class Program
{public static int num = 0;// 实例构造函数Program(){Console.WriteLine("实例构造函数被调用了...");num = 1;}// 静态构造函数static Program(){Console.WriteLine("静态构造函数被调用了...");num = 2;}static void Main(string[] args){Console.WriteLine("num = {0}", num);Program p = new Program();Console.WriteLine("num = {0}", num);Console.ReadKey();}
}说明:当执行上面程序时,会首先执行 public static int num = 0,接着执行类中的静态构造函数,
此时 num = 2,然后执行 Main 函数里面的内容,此时打印 num 的值为 2,接着初始化 Program 类,
这时会执行类中的构造函数,此时 num 会重新赋值为 1,所以上例的运行结果如下所示:
num = 2
num = 1

3、私有构造函数

        私有构造函数是一种特殊的实例构造函数,通常用在只包含静态成员的类中。如果一个类中具有一个或多个私有构造函数而没有公共构造函数的话,那么其他类(除嵌套类外)则无法创建该类的实例。 例如:

class Program
{static void Main(string[] args){// Student s = new Student();Student.id = 1001;Student.name = "Tom";Student.Display();Console.ReadKey();}
}public class Student
{// 静态成员属性public static int id;public static string name;// 私有构造函数// 注意:如果不指定访问权限修饰符,默认为私有构造函数.private Student() { }// 静态成员方法public static void Display(){Console.WriteLine("姓名:" + name + " ,编号:" + id);}
}// 上例中定义了一个空的私有构造函数,这么做的好处就是可阻止自动生成无参数构造函数.

注意:

        上述代码中,如果取消 Main 函数中注释的 Student s = new Student(); 程序就会出错,因为 Student 类的构造函数是私有构造函数,受其保护级别的限制不能访问。

三、C# 析构函数

        C# 中的析构函数(也被称作"终结器")同样是类中的一个特殊成员函数,主要用于在垃圾回收器回收类实例时执行一些必要的清理操作。

        C# 中的析构函数具有以下特点:

  • 析构函数只能在类中定义,且只能定义一个,不能用于结构体;
  • 析构函数不能使用访问权限修饰符修饰,没有返回值,不能包含参数;
  • 析构函数的名称与类名相同,不过需要在名称的前面加上一个波浪号~作为前缀;
  • 析构函数不能继承或重载;
  • 析构函数是自动调用的,不能手动调用;

举例:    

// 演示一下类中构造函数和析构函数的使用:
class Program
{static void Main(string[] args){Student s1 = new Student();Student s2 = new Student();Console.ReadKey();}
}public class Student
{// 构造函数public Student(){Console.WriteLine("构造函数被调用了...");}// 析构函数~Student(){Console.WriteLine("析构函数被调用了...");Console.ReadKey();}
}
// 运行结果如下:
构造函数被调用了...
构造函数被调用了...
析构函数被调用了...
析构函数被调用了...

四、C# this关键字

        在 C# 中,可以使用 this 关键字来表示当前对象,访问类中的成员属性以及函数。

1、表示当前类的对象

public Website(string n, string u){this.name = n;this.url = u;
}

2、串联构造函数

public Test()
{Console.WriteLine("无参构造函数");
}// 这里的 this() 代表无参构造函数 Test()
// 先执行 Test(),后执行 Test(string text)
public Test(string text) : this()
{Console.WriteLine(text);Console.WriteLine("有参构造函数");
}

3、作为类的索引器

class Demo
{static void Main(string[] args) {Test a = new Test();Console.WriteLine("Temp0:{0}, Temp1:{1}", a[0], a[1]);a[0] = 15;a[1] = 20;Console.WriteLine("Temp0:{0}, Temp1:{1}", a[0], a[1]);}
}public class Test
{int Temp0;int Temp1;public int this[int index]{get{return (0 == index) ? Temp0 : Temp1;}set{if (0==index)Temp0 = value;elseTemp1 = value;}}
}// 运行结果如下:
Temp0:0, Temp1:0
Temp0:15, Temp1:20

4、作为原始类型的扩展方法

class Program
{static void Main(string[] args){string str = "百度一下";string newStr = str.ExpandString();Console.WriteLine(newStr);Console.ReadKey();}
}public static class Test
{public static string ExpandString(this string name){return name + " https://www.baidu.com";}
}// 运行结果如下:
百度一下 https://www.baidu.com

五、C# 静态成员

        在 C# 中,我们可以使用 static 关键字声明属于类型本身而不是属于特定对象的静态成员,因此不需要使用对象来访问静态成员。在类、接口和结构体中可以使用 static 关键字修饰变量、函数、构造函数、类、属性、运算符和事件。

        若在定义某个成员时使用了 static 关键字,则表示该类仅存在此成员的一个实例。也就是说当我们将一个类的成员声明为静态成员时,无论创建多少个该类的对象,静态成员只会被创建一次,且会被所有对象共享。

1、静态属性

        使用 static 定义的成员属性称为 "静态属性" ,静态属性可以直接通过类名.属性名的形式直接访问,不需要创建类的实例。静态属性不仅可以使用成员函数来初始化,还可以直接在类外进行初始化。

        举例:

class Program
{static void Main(string[] args){Test.str = "百度一下";Console.WriteLine(Test.str);Test test1 = new Test();test1.GetStr();Test test2 = new Test();test2.GetStr();test2.SetStr("https://www.baidu.com");test1.GetStr();test2.GetStr();}
}public class Test
{public static string str;public void SetStr(string s){str = s;}public void GetStr(){Console.WriteLine(str);Console.ReadKey();}
}// 运行结果如下:
百度一下
百度一下
百度一下
https://www.baidu.com
https://www.baidu.com

2、静态函数

        static 关键字还可以用来定义成员函数,使用 static 定义的成员函数称为 "静态函数" ,静态函数只能访问静态属性。

        举例:

class Program
{static void Main(string[] args){Test test1 = new Test();test1.SetStr("百度一下");Test.GetStr();Test test2 = new Test();test2.SetStr("https://www.baidu.com");Test.GetStr();}
}public class Test
{public static string str;public void SetStr(string s){str = s;}public static void GetStr(){Console.WriteLine(str);Console.ReadKey();}
}// 运行结果如下:
百度一下
https://www.baidu.com

六、C# 结构体

相关文章:

9. C#面向对象基础

一、C# 类 在 C# 中&#xff0c;类是引用类型的。类由成员属性和成员方法构成。我们可以动态创建类的实例&#xff08;instance&#xff09;&#xff0c;这个实例也被称为对象&#xff08;object&#xff09;&#xff0c;我们可以通过类和对象来设计程序。 1、类的定义 类的定…...

【MIT 6.S081】Lab2: system calls

本Lab包括两个简单系统调用的实现&#xff0c;进一步熟悉系统调用接口。 笔者用时约1.5h 概述 根据文档说明&#xff0c;当我们添加一个系统调用时&#xff0c;比如第一个任务是添加一个trace&#xff0c;需要进行以下操作&#xff1a; 首先将系统调用的原型添加到user/user…...

设计模式之单例模式~

设计模式包含很多&#xff0c;但与面试相关的设计模式是单例模式&#xff0c;单例模式的写法有好几种&#xff0c;我们主要学习这三种—饿汉式单例&#xff0c;懒汉式单例、登记式单例,这篇文章我们主要学习饿汉式单例 单例模式&#xff1a; 满足要点&#xff1a; 私有构造 …...

top终端详解

1.top命令行使用 2.top每行意义 3.补充 1.top命令行使用 top命令是一个常用的Linux系统命令&#xff0c;用于实时查看系统的运行状态和进程信息。下面是top命令的几个常用参数的含义&#xff1a; -d seconds&#xff1a;设置top命令的更新间隔时间&#xff0c;单位是秒。默认是…...

解决一个偶现的503 bug,花了俺不少时间

概述 在3月2日晚上&#xff0c;大概8点左右&#xff0c;本想打道回府&#xff0c;回家休息&#xff0c;突然被人在bug群了一下&#xff0c;说是管理后台&#xff0c;访问不了&#xff0c;界面上出现了: 503 service temporarily unavailable我赶紧尝试访问了一下&#xff0c;确…...

什么是栈,如何实现?

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; “但有一枝堪比玉&#xff0c;何须九畹始征兰?” 前言&#xff1a; 栈是一种特殊的线性表&#xff0c;就像开盖的桶一样&#xff0c;从底部开始放数据&#xff0c;从顶部开始取数据&#xff0c;那么栈具体是…...

在我的MacBook上捣鼓ESP8266

周三是我们的篮球日&#xff0c;打篮球后总是会有些兴奋&#xff0c;然后就容易睡不着&#xff0c;额&#xff0c;睡不着就拿我的ESP8266开发板出来捣鼓一下。先下载编译工具链https://github.com/espressif/ESP8266_RTOS_SDK下载sdkgit clone https://github.com/espressif/ES…...

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下多智能体深度强化学习算法 ippo&#xff0c;并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得&#xff1a;https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…...

77.qt qml-QianWindow-V1版本界面讲解

上章介绍: 76.qt qml-QianWindow开源炫酷界面框架简介(支持白色暗黑渐变自定义控件均以适配) 界面如下所示: 代码结构如下所示:...

RHCE学习日记二

1、在 node1 主机上配置 chrony 时间服务器&#xff0c;将该主机作为时间服务器。 命令&#xff1a; vim /etc/chrony.conf 在文件位置添加命令&#xff1a; #Use public servers from the pool.ntp.org project. #Please consider joining the pool (https://www.pool.ntp.org…...

Dubbo原理简介

Dubbo缺省协议采用单一长连接和NIO异步通讯&#xff0c;适合于小数据量大并发的服务调用&#xff0c;以及服务消费者机器数远大于服务提供者机器数的情况。 作为RPC&#xff1a;支持各种传输协议&#xff0c;如dubbo,hession,json,fastjson&#xff0c;底层采用mina,netty长连接…...

JavaSE基础总结

JDK与JRE JDK&#xff0c;全称Java Development Kit&#xff0c;Java开发工具包 JRE&#xff0c;全称Java Runntime Environment&#xff0c;Java运行环境 JDK包含后者JRE。 JDK也可以说是Java SDK&#xff08;Software Development kit&#xff0c;软件开发工具包&#xff09;…...

5G(NR)信道带宽和发射带宽---频率资源

前言 查看此文之前建议先看看这篇 5G(NR)频率资源划分_nr运营商频段划分_达帮主的博客-CSDN博客NR频率有上面几个划分 &#xff0c;可以使用低于1GHz的频端&#xff0c;既可以使用高于30GHz高频端。使用频端高于30GHz那我们称之为高频或者毫米波。使用毫米波是5G网络区别于4G…...

基于Spring Boot的酒店管理系统

文章目录 项目介绍主要功能截图:登录首页房间类型酒店预约部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的酒店管理系统…...

Ae:混合模式

Ae 中内置了 Ps 的渲染引擎&#xff0c;同样可在多处应用混合模式 Blending Mode。与 Ps 相比&#xff0c;除了两组图层通道相关的特定模式&#xff0c;其它的混合模式几乎是一模一样。相关快捷键&#xff1a;下一图层混合模式&#xff1a;Shift 上一图层混合模式&#xff1a;…...

JS中的变量

系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录前言1、概念2、定义变量3、变量名的规则4、变量本质5、赋值6、常用操作前言 相对于青龙面板来说&#xff0c;变量就是你填入青龙的cookie&#xff0c;简称ck 在实际项目中&#xff0…...

Hadoop运行模块

二、Hadoop运行模式 1&#xff09;Hadoop官方网站&#xff1a;http://hadoop.apache.org 2&#xff09;Hadoop运行模式包括&#xff1a;本地模式、伪分布式模式以及完全分布式模式。 本地模式&#xff1a;单机运行&#xff0c;只是用来演示一下官方案例。生产环境不用。伪分…...

Web自动化——前端基础知识(二)

1. Web前端开发三要素 web前端开发三要素 什么是HTMl&#xff1f; Html是超文本标记语言&#xff0c;是用来描述网页的一种标记语言HTML是一种标签规则的形式将内容呈现在浏览器中可以以任意编辑器创建&#xff0c;其文件扩展名为.html或.htm保存即可 什么是CSS&#xff1f;…...

NAS系列 硬件组装

转自我的博客文章https://blognas.hwb0307.com/nas/3260&#xff0c;内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 之前我在《NAS系列 硬件选择》里讲述了自己为了升级NAS如何选配硬件。本节我大概说一些我的新NAS硬件组装的注意事项。到目前为止&#xff0c;我只装过…...

IDAFrida

IDA&Frida 前言 偶然间发现了一本秘籍《IDA脚本开发之旅》&#xff0c;这是白龙的系列文章&#xff0c;主要是安卓平台&#xff0c;笔者只是根据他的知识点学习&#xff0c;拓展&#xff0c;可以会稍微提及别的平台。本文并不会贴出他的思路分析&#xff0c;只对于源码进…...

通过百度文心一言大模型作画尝鲜,感受国产ChatGPT的“狂飙”

3月16日下午&#xff0c;百度于北京总部召开新闻发布会&#xff0c;主题围绕新一代大语言模型、生成式AI产品文心一言。百度创始人、董事长兼首席执行官李彦宏&#xff0c;百度首席技术官王海峰出席&#xff0c;并展示了文心一言在文学创作、商业文案创作、数理推算、中文理解、…...

Nacos 注册中心 - 健康检查机制源码

目录 1. 健康检查介绍 2. 客户端健康检查 2.1 临时实例的健康检查 2.2 永久实例的健康检查 3. 服务端健康检查 3.1 临时实例的健康检查 3.2 永久实例服务端健康检查 1. 健康检查介绍 当一个服务实例注册到 Nacos 中后&#xff0c;其他服务就可以从 Nacos 中查询出该服务…...

Transformer在计算机视觉中的应用-VIT、TNT模型

上期介绍了Transformer的结构、特点和作用等方面的知识&#xff0c;回头看下来这一模型并不难&#xff0c;依旧是传统机器翻译模型中常见的seq2seq网络&#xff0c;里面加入了注意力机制&#xff0c;QKV矩阵的运算使得计算并行。 当然&#xff0c;最大的重点不是矩阵运算&…...

快速入门Zookeeper技术.黑马教程

快速入门Zookeeper技术.黑马教程一、初识 Zookeeper二、ZooKeeper 安装与配置三、ZooKeeper 命令操作1.Zookeeper 数据模型2.Zookeeper 服务端常用命令3.Zookeeper 客户端常用命令四、ZooKeeper JavaAPI 操作五、ZooKeeper JavaAPI 操作1.Curator 介绍2.Curator API 常用操作2.…...

网易C++实习一面

说下C11新特性 auto有没有效率上的问题&#xff1f;为什么&#xff1f;发生在什么时候&#xff1f; 说下单例模式 什么时候需要加锁&#xff0c;什么时候不需要加锁&#xff1f; 像printf这样的函数&#xff0c;自己本身不修改数据&#xff0c;但是其他人会修改数据&#x…...

进程和线程的区别和联系

进程和线程的区别和联系1. 认识线程2. 进程和线程的关系3. 进程和线程的区别4. 线程共享了进程哪些资源1. 上下文切换2. 线程共享了进程哪些资源1.代码区2. 数据区3. 堆区1. 认识线程 线程是进程的一个实体,它被包含在进程中,一个进程至少包含一个线程,一个进程也可以包含多个…...

Java学习笔记——集合

目录集合与数组的对比集合体系结构Collection——常见成员方法Collection——迭代器基本使用Collection——迭代器原理分析Collection——迭代器删除方法增强for——基本格式增强for——注意点Collection——练习集合与数组的对比 package top.xxxx.www.CollectionDemo;import …...

差分运放公式推导-运算放大器

不知道大家有没遇到这种情况&#xff0c;在计算电路的时候&#xff0c;有时候会突然的忘记一些公式啊啥的&#xff0c;需要回去翻看笔记或者查资料&#xff0c;知其然而不知其所以然。今天跟大家一起来一起推导一遍差分运放的计算过程。 计算过程其实归根结底还是根据运放的虚…...

金丹二层 —— 字符串长度求解的四种方法

前言&#xff1a; 1.CSDN由于我的排版不怎么好看&#xff0c;我的有道云笔记比较美观&#xff0c;请移步有道云笔记 2.修炼必备 1&#xff09;入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (m…...

深入剖析Linux——进程信号

致前行的人&#xff1a; 要努力&#xff0c;但不着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 目录 1.信号概念 1.1生活角度的信号 2. 技术应用角度的信号 3.Linux操作系统中查看信号 4.常用信号发送 4.1通过键盘发送信号 4.2调用系统函数发送信号 4.3…...

自建网站过程/网站建设方案外包

var Validator {VerityLib: {//验证字符串非空IsNotEmpty: function (input) {if (input ! ) {return true;} else {return false;}},//验证数字(double类型) [可以包含负号和小数点]IsNumber: function (input) {var regex /^-?\d$|^(-?\d)(\.\d)?$/;if (input.match(reg…...

怎么免费建公司网站/如何让百度搜索排名靠前

(1)列表中的坑&#xff1a; 在循环一个列表时&#xff0c;不要对列表进行删除的动作&#xff08;改变列表元素的个数动作&#xff09;&#xff0c;会出错 建议 倒的删除 l1 [alex, wusir, taibai, barry, 老男孩] del l1[1::2] print(l1) for i in range(len(l1)-1,-1,-1)…...

在哪个网站买做性的人/广告策划

情景&#xff1a;uni-app使用vue框架开发混合APP&#xff0c;虽然APP或者小程序没有跨域&#xff0c;但希望就是写完这个既有H5&#xff0c;又有APP&#xff0c;小程序等&#xff0c;所以能通过后端解决跨域最好。但是不知道是vue的原因还是什么&#xff0c;在PHP接口基类中添加…...

成都专业建站推广公司/竞价推广账户竞价托管收费

SVN 全称是Subversion&#xff0c;集中式版本控制之王者SVN 版本控制&#xff0c;需要自己搭建一个管理代码的服务器&#xff0c;提供开发人员&#xff0c;上传和下载1.基本介绍 使用环境 要想利用SVN管理源代码&#xff0c;必须得有2套环境 服务器 用于存储客户端上传的源代码…...

网站建设 软件开发的公司哪家好/营销策划品牌策划

Hive 元数据配置到 MySql 一、配置mysql MySql 中 user 表中主机配置 配置只要是 root 用户密码&#xff0c;在任何主机上都能登录 MySQL 数据库。 1、进入MySQL数据库并使用mysql数据库 use mysql; 2、展示 user 表的结构 desc user; 3、查询 user 表 select host,user…...

网站建设重庆/google下载

调用dll,程序有可能缺少微软程序的运行库 可下载一个微软的运行库 下载链接&#xff1a;https://pan.baidu.com/s/1FSNb_eFmFoKIhU23V3zj8Q 密码&#xff1a;fbzy 转载于:https://www.cnblogs.com/wxy520/p/8887527.html...