C#学习笔记(九)

C#学习笔记(九)

    • 第六章 面向对象编程(一)类与对象、字段与属性
      • 一、类与对象正确的理解
        • 1. 什么是类?
        • 2.什么是对象?
        • 3. 类与对象的区别
      • 二、类的基本规范和对象使用
        • 1. 类的规范
      • 三、类的访问修饰符(简述)
        • 1. 项目和程序集
        • 2. 类的访问修饰符public和internal
      • 四、字段与属性
        • 1.字段
          • 字段的修饰符public 和 private
        • 2.属性
          • 2.1属性的定义与发展史
            • 2.1.1 .NET2.0时代
            • 2.1.2属性的结构
            • 2.2.3 为什么用属性
            • 2.1.4 .NET3.0时代
            • 2.1.5 .NET4.6时代
            • 2.1.6 class类型的属性以及属性数组

第六章 面向对象编程(一)类与对象、字段与属性

在 C#程序中,类是程序的基本单元,程序不管多么简单多么复杂,都是由不同的类组成。如何写好项目需要的类?

一、类与对象正确的理解

1. 什么是类?

举个例子,如何在程序中创建一张居民身份证。
首先身份证包含的信息有:姓名、性别、民族、出生日期、住址、身份证号。

    public class ID_card{public  string name;// 姓名public  string sex;// 性别public  string nation;// 民族public  string address;// 住址public  string IDnumber;// 身份证号码public  DateTime dateBirth;// 出生日期}

这是一张身份证上所要包含的信息,将身份证抽象为一个类命名为ID_card,类里面使用字段定义信息姓名、性别、民族、出生日期、住址、身份证号。这就创建了一个类。

2.什么是对象?

上述 “什么是类?”中创建了一张居民身份证,但是如何将身份证发放给个人比如这个人叫“流星”,这就需要为“流星”制作身份证卡片,于是这个世界多出了一张卡片。
在代码中如何实现

            ID_card card_202410161024=new ID_card();card_202410161024.name      = "流星";card_202410161024.sex       = "男";card_202410161024.nation    = "汉";card_202410161024.address   = "上海";card_202410161024.IDnumber = "3421234567832";card_202410161024.dateBirth = new DateTime(2000, 10, 17, 12, 30, 0);

创建一个对象是通过 new 关键字来实现的,通过上面的代码就将ID_card这个类实例化并产生了一个对象命名为card_202410161024。

3. 类与对象的区别

类定义的是一个“概念模型”,在这个模型中规定对象的“属性”和“方法”。对象是按照类这个模型创造出来的真实“实体”,每个属性都有特定的“值”。(属性的概念后面记录)

二、类的基本规范和对象使用

1. 类的规范

类的基本规范如下:

访问修饰符 class 类的名称
{// 字段部分字段 1 的类型 字段 1 名称字段 2 的类型 字段 2 名称
…// 属性部分属性 1 属性 2// 方法部分方法 1方法 2}

以上是类的标准规范,具体根据需要定义。

三、类的访问修饰符(简述)

1. 项目和程序集

简单点项目包括:控制台应用程序,Windows应用程序,类库(Class Library)等,而程序集叫Assembly(也就是我们创建项目中的AssemblyInfo.cs文件),
一个项目也就是一个程序集,介绍上面的目的为了说明,一个项目的internal无法在另一个项目中调用。
原文链接:https://blog.csdn.net/xiaolei1982/article/details/2257280

2. 类的访问修饰符public和internal

public:公共的
internal:内部的
在类的规范中 class 前可手动添加访问修饰符public或internal,若不添加默认为internal修饰。
在一个类定义和使用它的地方,如果都在一个程序集内,是可以不添加的 public 的,默认 internal 的意思就是程序集内部。如果定义和使用在
不同的程序集中,就必须添加。
在这里插入图片描述
在这里插入图片描述

如图所示在ConsoleApp1项目中有两个类文件分别是Class1.cs与Program.cs,这两个类文件属于同一个程序集,这两个类文件中的类,即使使用internal修饰也可以相互使用,因为他们本身就是在同一内部。

四、字段与属性

之前一直提到属性但从来没用过,字段和属性有着千丝万缕的联系,如果没有很好的理解字段那属性是无法讲解的。

1.字段

在面向对象的学习中会遇到两种变量一种是“局部变量”,一种是“成员变量”。
在这里插入图片描述

  • 局部变量,定义在方法内部,作用范围只限于方法内部。
  • 成员变量,也就是“字段”。字段是定义在类的内部,方法外面。它不属于某一个特定方法,而是供这个类内部所有的方法使用的。所以成员变量的作用范围是整个类的内部。
字段的修饰符public 和 private

类的修饰符有 public 和 internal,字段的修饰符是 public 和 private 两种,当没有添加任何修饰符的时候默认是 private。
private:私有的
后面实际开发中我们很少用 public修饰字段,因为字段设计的初衷是给类内部使用,而非外部使用。这里所说的外部使用,就是通过对象的方式去调用字段。如下图所示private所修饰的weight,无法通过对象调用。
在这里插入图片描述

2.属性
2.1属性的定义与发展史
2.1.1 .NET2.0时代

在一个类中定义一些属性

namespace ConsoleApp1
{class Class3{
// 属性1private int Str1 = 30;public int STR1{get{return Str1;}set{if (value>100){Str1 = 100;}if(value<0){Str1 = 0;}}}
// 属性2private string name = string.Empty;public string Name{get{return name;}set{name = value;}}
//属性3public double Weight{get{double weight = 99.99;return weight;}}}
}

get:获取
set:设置

2.1.2属性的结构

属性包括两部分,一部分是 get,用来获取属性的值,也就是我们在通过对象调用属性的时候,如果是读取属性值,这个 get 被调用。其实 get 的本质就是一个方法。另一部分是set,set 其实也是一个方法,我们给属性赋值的时候,这个方法被调用。除此以外呢,我们发现当读取或者赋值属性的时候,其实操作的是一个对应的私有字段,比如STR1属性,对应的是Str1 这个私有字段。当调用 get 的方法的时候是读取这个字段的值,当调用 set 方法的时候,我们所赋值的具体数据首先会到 value 这个“中间变量”中,然后通过 value传给对应的私有字段Str1 。

2.2.3 为什么用属性
  1. 属性轻松增加业务逻辑
    假设微信中的转账金额不能小于0,不能大于100。当为转账金额STR1赋值时,它自身就具有这个业务逻辑,消除了安全隐患。
  2. 只读属性轻松控制。
    上面的代码中Weight是一个只读属性,只需要将set删除就可以实现。get内部也可以增加相应的逻辑。
  3. 不得不用属性
    很多控件中只能调用和解析对象的属性,不能用字段。所以不得不用解析。
  4. 字段的作用
    出现属性这一概念后,字段的作用好像就是为解析服务的,字段起到服务于属性的作用。
    强调:属性一般都是 public 做修饰符,使用 private 是不合理的设计。
    字段一般都是 private 做修饰符,个别情况可以使用 public,但是很少。
2.1.4 .NET3.0时代

对于可读可写、没有任何业务逻辑的属性可以简化书写为如下格式:

        public string Name{get;set;}public double Weight{get;set;}

可以发现除了没有业务逻辑外,私有字段也消失了,所以数据保存到了哪里?
其实编译器自动帮我们生成了一个私有字段,只是不能被我们直接使用,其实我们也没有必要使用。
.NET3.0时代对于可读可写、没有任何业务逻辑的属性可以简化,但是其它的属性还需要遵从.NET2.0时代的格式。

2.1.5 .NET4.6时代

4.6 的时候我们可以只有一个 get,并且也可以直接添加业务逻辑,我们还可以直接给属性赋值。

        public string Name{get;set;} = "流星";public double Weight{get;} = 99.9;public double hi{get{double ti= 99.99;return hi;}set{}}
2.1.6 class类型的属性以及属性数组

在这里插入图片描述
进一步如何使用后面学习

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoFly快速开发框架的utils-plugin扩展包开发演示教程

说明 本插件是教大家如何开发框架utils->plugin下扩展插件包&#xff0c;在开发时可安装本插件&#xff0c;参考本插件代码结构写你插件&#xff0c;这样可以达到规范插件代码&#xff0c;同时也也是为了兼容你安装其他人在代码仓通过扩展插件包&#xff0c;如果不规范可能…

Bolt 一款AI 全栈 Web 在线开发工具

参考&#xff1a; https://bolt.new/ github项目也可以支持Bolt在线打开编辑 直接连接前输入&#xff0c;比如 https://github.com/lyz1810/live2dSpeek更换成 https://bolt.new/github.com/lyz1810/live2dSpeek https://bolt.new/github.com/oh-my-live2d/oh-my-live2d 主要偏…

eUSB2规范介绍

一、说明 eUSB的全称是Embedded USB2,也支持低速、全速和高速三个速率,不过降低了电压幅值,从而使SOC更小、功耗更低,主要应用在芯片间互联,如需应用在设备间传输,一般需要加中继器。 eUSB2还支持USB2.0协议,仅物理层要求不同。 eUSB2支持2个模式:原生模式(native m…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

Turn-it:调整它:优化线材重构雕塑制造

&#x1f428;文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略&#xff0c;通过调整目标形状以适应电线弯曲机&#xff0c;然后由人工将其弯曲回目标形状。&#xff08;机器弯曲人工弯曲&#xff09; 该方法通过两阶段弯曲策略实现&a…

王爽汇编语言第三版实验2

实验任务 (1)使用Debug&#xff0c;将下面的程序段写 入程序&#xff0c;逐条进行&#xff0c;根据指令执行后的实际运行情况填空。 mov ax,ffff mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;axC0EAH add ax,[2] ;axCOFCH mov bx,[4] ;bx30F0H add …

Flink消费Kafka实时写入Doris

本文模拟实际生产环境&#xff0c;通过FileBeat采集日志信息到Kafka&#xff0c;再通过Flink消费Kafka实时写入Doris。 文章目录 Filebeat采集日志到KafkaFlink消费Kafka实时写入Doris总结 Filebeat采集日志到Kafka 常见的日志采集工具有以下几种&#xff1a;Flume、Logstash和…

基于SpringBoot+Vue+uniapp微信小程序的校园反诈骗微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Unity 从零开始搭建一套简单易用的UGUI小框架 功能撰写与优化篇

Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇-CSDN博客 开始撰写 从基础分析篇我们得到了三个类&#xff0c;面板基类&#xff0c;管理类和面板子类 那就从面板基类开始&#xff0c;定义其基本行为 面板基类 基本方法都很简单&#xff0c;分别是首次加载并打开…

[含文档+PPT+源码等]精品基于springboot实现的原生微信小程序小区兼职系统

基于Spring Boot实现的原生微信小程序小区兼职系统背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、技术背景 移动互联网的普及&#xff1a;随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级应用&#xff0c;因其无需下载安装、即用即走的特点&am…

SSD |(七)FTL详解(中)

文章目录 &#x1f4da;垃圾回收&#x1f407;垃圾回收原理&#x1f407;写放大&#x1f407;垃圾回收实现&#x1f407;垃圾回收时机 &#x1f4da;解除映射关系&#x1f4da;磨损均衡 &#x1f4da;垃圾回收 &#x1f407;垃圾回收原理 ✋设定一个迷你SSD空间&#xff1a; 假…

解决ImageIO无法读取部分JPEG格式图片问题

解决ImageIO无法读取部分JPEG格式图片问题 问题描述 我最近对在线聊天功能进行了一些内存优化&#xff0c;结果在回归测试时&#xff0c;突然发现有张图片总是发送失败。测试同事把问题转到我这儿来看&#xff0c;我仔细检查了一下&#xff0c;发现是上传文件的接口报错&#…

获取非加密邮件协议中的用户名和密码——安全风险演示

引言 在当今的数字时代,网络安全变得越来越重要。本文将演示如何通过抓包工具获取非加密邮件协议中的用户名和密码,以此说明使用非加密协议的潜在安全风险。通过这个演示,我们希望能提高读者的安全意识,促使大家采取更安全的通信方式。 注意: 本文仅用于教育目的,旨在提高安全…

Android开发蒙版引导操作功能

Android开发蒙版引导操作功能 复杂的功能&#xff0c;往往需要在上面加一层蒙版引导用户操作 一、思路&#xff1a; 堆积布局方式 二、效果图&#xff1a; 三、关键代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <FrameLayout x…

【大模型】AI视频课程制作工具开发

1. 需求信息 1.1 需求背景 讲师们在制作视频的过程中&#xff0c;发现录制课程比较麻烦&#xff0c;要保证环境安静&#xff0c;保证录制过程不出错&#xff0c;很容易反复重复录制&#xff0c;为了解决重复录制的工作量&#xff0c;想通过 ai 课程制作工具&#xff0c;来解决…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件&#xff1a;PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型&#xff0c;满怀期待的检测成果时发现一点长进都…

【Linux】“echo $变量“ 命令打印变量值的底层原理

在 shell 中&#xff0c;echo $变量 命令的工作原理涉及几个关键步骤&#xff0c;主要是由 shell 解释器来处理变量的查找和替换。以下是详细的过程&#xff1a; 变量展开的过程顺序 变量引用&#xff1a; 在命令行中&#xff0c;变量通常以 $variable_name 或 ${variable_…

使用Shell脚本对Java应用等服务进行启停控制(支持批量)

通过shell脚本对Java服务启停进行控制。支持单个服务和多个服务的 start、stop、status、restart。支持自定义启动命令。(不限于Java服务,适用于各类通过命令行启动的服务) 脚本名称为 runjar.sh , 底部提供源码。通过三部分进行说明:操作说明、维护自定义服务列表、脚本源…

搭建`mongodb`副本集-开启权限认证 mongo:7.0.5

搭建mongodb副本集-开启权限认证 mongo:7.0.5 1.5.1、创建文件 创建配置文件保存目录和数据保存目录 mkdir -p /data/mongodb/{/conf,/data,/logs}生成和设置权限 这个文件一定要在一个服务里面生成然后复制到其它服务器&#xff0c;所有服务器的这个key一定是相同的。 op…

C语言 | Leetcode C语言题解之第480题滑动窗口中位数

题目&#xff1a; 题解&#xff1a; struct Heap {int* heap;int heapSize;int realSize;bool (*cmp)(int, int); };void init(struct Heap* obj, int n, bool (*cmp)(int, int)) {obj->heap malloc(sizeof(int) * (n 1));obj->heapSize 0;obj->cmp cmp; }bool c…