c#软件开发学习笔记--面向对象

深入理解C#中的面向对象编程思想 抽象是将对象的复杂性隐藏起来,只暴露必要的功能和特性。抽象可以通过。 阅读详情

c#软件开发学习笔记

一、面向对象

面向过程:问题分解成一系列的步骤,然后按照顺序执行这些步骤
面向对象:就是把现实中的事物都抽象为“对象”。每个对象是唯一的,且都可以拥有它的属性与行为。我们可以通过调用这些对象的方法、属性去解决问题。
对象是类的一个实例化(即具体化)的结果。对象是具体的、实际存在的,可以在程序中被创建、操作和销毁。
类是对象的抽象,每个对象都属于某个类,它定义了对象所具有的属性和方法的结构和行为。对象通过实例化类来创建,并且可以根据类的定义进行属性和方法的访问和调用。
面向对象编程的三大特性(封装、继承、多态)

1.类

//类默认有一个访问修饰符  internal
class People
{
    string name;
    int age;
    char sex;
    void eat()
        Console.WriteLine("吃饭");
    void sleep()
        Console.WriteLine("睡觉");
}

2.对象

//类的创建    创建出来一个对象(类的实例化)
//当我们创建一个类的同时,也会拥有一个数据类型,所以这个类实例化出来的对象,都属于这个类型
People p1 =   new People();

3.属性和字段

字段和属性区别
1.字段一般给类和结构体内部使用,而属性一般给类或者结构体外部使用
2.字段一般是私有的,属性一般是公开的
3.属性有get\set访问器,字段可以理解为是类和结构中的一个常量/变量
4.字段可以存储数据,属性不能存储属性,只是操作拦截
在这里插入图片描述

public class People 
{
    //先添加一个私有的字段
    //再添加一个公共的属性,可以添加get set访问器
    private string _name;//字段 私有的字段 只能在内部访问
    public string Name //属性
    {
        get
        {
            Console.WriteLine("get访问器触发了");
            return _name; 
        } //在外部获取属性所关联字段值 触发get访问器 ,需要添加return 关联字段

        set
        {
            Console.WriteLine("set访问器触发了");
            if (value.Length==0)	//属性拦截
            {
                throw new Exception("不能赋空字符串");	
            }
            _name = value; 
        } //在给属性赋值的时候触发set访问器  把一个value赋值给字段
        
	//属性语法糖写法
    public string Id { get; set; }
}

4.构造函数

构造函数的作用:用于在对象创建的时候,进行初始化操作

class People
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsAlive { get; set; }
    //在类中有一个默认的和类同名的函数,这个函数会在类实例化的时候 自动执行,我们称之为构造函数
    //无参构造函数
    public People()
    {
    }
    //有参构造函数 构造函数本身是一个函数,可以定义形参接收参数,但是不需要也不能写返回值
    public People(string a, int b)
    {
        this.Name = a;      //this指向当前对象,可以省略
        this.Age = b;
        this.IsAlive = b >= 18;
    }
}

5.析构函数

析构函数:是一个特殊的成员函数,当一个对象被释放的时候执行被释放: C#有垃圾回收机制(GC) 当一个数据没有被任何变量所引用的时候,垃圾回收机制就会把这个对象当作垃圾回收掉
析构函数:当类的某个对象被当作垃圾回收的时候,这个函数就会自动调用
析构函数的作用是释放对象的资源,但析构函数是又垃圾回收器控制的,无法做到显式调用,所以使用析构函数不是最佳方案(很少使用)

class People
{
    //析构函数的定义: 一个和类同名的函数,在函数名前面加上~
    ~People()
    {
        Console.WriteLine("析构函数执行了");
    }
}

6.静态static

static可以修饰:方法、变量、类
静态方法:
方便在没有创建对象的情况下来进行调用,只要类被加载了,就可以通过类名去进行访问
静态方法中不能访问非静态方法和变量,静态方法之间可以相互访问
静态变量:
静态字段,是属于类的,所有实例都会共享该字段(类名.静态字段名),普通字段是属于对象的,需要通过对象进行调用

7.常量和只读

readonly 表示只读的一个字段,只能在构造函数里面进行修改
静态的只读变量 只能在静态构造函数里面进行修改

public class People
{
	public const int c = 30;//常量自动是 static 的,无需(也不能)使用 static 关键字
	public readonly int a = 10;
	public static readonly int b = 20;

	public People()
	{
	    a =20;
	    //b = 30;  静态只读不能在非静态的构造函数进行修改
	}

	static People()     //静态构造函数只能被调用一次 1.创建类实例的时候调用 2.访问静态成员时候调用
	{
	    b = 40;
	}
}

二、继承

继承主要是为了减少代码的复用,如果有一个类的属性和方法想在另外一个类进行使用的话,可以通过继承实现属性和方法的复用

  • 单继承:C# 只支持单继承,一个类只能直接继承一个父类
  • 传递性:继承关系可以多层传递
  • 所有类都继承自 Object:即使没有显式指定,所有类都隐式继承自 System.Object

继承的优点

  • 提高代码的复用性
  • 提高代码的维护性
  • 让类与类之间产生关系,是多态的前提

继承的缺点

  • 增强了类与类之间的耦合性,他们之间是紧密的 is-a 的关系

1.子类访问父类

在子类继承父类的时候 ,父类必须先创建, 创建子类的对象,会先调用父类的无参构造函数
即使子类调用带参数构造函数,默认情况下还是会调用父类的无参构造函数
如果想去调用父类有参构造函数 在子类有参构造函数后面添加base(参数)调用父类有参数构造函数

//父类构造函数
public People()
{
    Console.WriteLine("1 父类的无参数构造函数");
}

public People(string name)
{
    Console.WriteLine("2 父类带参数的构造函数");
}
//子类构造函数
public Student():base() //base指的是父类的对象, base()调用父类的构造函数
{
    Console.WriteLine("3子类的无参数构造函数");
}

public Student(int age, string n) : base(n) //:base(n) 调用父类的有参构造函数
{
    Console.WriteLine("4子类带参数的构造函数"+Name);
}

2.类的访问修饰符

public
定义:公共访问级别,没有任何访问限制。
应用:可以被任何其他代码访问,无论是在同一程序集还是在引用了该程序集的其他程序集中。
private
定义:私有访问级别,只能在定义它们的类型内部访问。
应用:通常用于隐藏类型的实现细节,只能被同一个类或结构体的代码访问。
protected
定义:受保护访问级别,只能在定义它们的类及其派生类中访问。
应用:适用于那些只想在类的继承层次结构中暴露的成员。
internal
定义:内部访问级别,只能在同一个程序集内部访问。
应用:用于定义对其他程序集隐藏但对同一程序集中的其他类或成员可见的类型或成员。
protected internal
定义:受保护的内部访问级别,可以由同一程序集中的任何代码访问,或者由派生自该类的其他程序集中的代码访问。(并集)
应用:这是一个组合访问修饰符,提供了一种在程序集内部或通过继承在其他程序集中访问成员的方式。
private protected
定义:私有受保护访问级别,只能在其声明所在的类或该类的派生类中访问,并且只能在同一个程序集内部。
应用:这是C# 7.2中引入的较新的访问修饰符,它进一步限制了受保护成员的访问范围。
无修饰符(默认访问级别)
类的默认访问级别:如果没有指定访问修饰符,则类默认为 internal。
类成员的默认访问级别:如果没有指定访问修饰符,则类成员(包括字段、方法等)默认为 private。

访问修饰符/范围当前类子类实例对象引用当前项目的项目子类引用当前项目实例对象
public√√√√√
private√××××
internal√√√××
protected√√×√×
protected internal√√√√×
private protected√√×××

三、多态

多态:同一个行为具有多个不同表现形式的能力
多态的分类

  • 编译时多态(静态多态):通过方法重载和运算符重载来实现。
  • 运行时多态(动态多态):通过继承和接口实现,以及方法重写来实现。

1.静态多态

重载是指多个方法名字相同、而参数列表不同的方法
重载允许返回不同的类型

1.方法重载

函数重载满足条件:
1 函数名必须一样
2 参数的个数或者类型不一样
3 仅仅只有返回值类型不一样,不是重载

public static void F1()
{
    Console.WriteLine("F1不带参数");
}
public static void F1(int a)
{
    Console.WriteLine("F1带一个参数");
}
public static void F1(string a)
{
    Console.WriteLine("F1带一个参数");
}

2.运算符重载

可重载与不可重载的运算符

运算符可重载性
+、-、!、++、–这些一元运算符可以进行重载
<、>、==、!=、<=、>=这些二元运算符可以进行重载,需要注意的是某些运算符必须成对重载
&&、||无法重载逻辑运算符
(type)var_name强制类型转换运算符不能重载
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=复合赋值运算符不能显式重载。 但在重载二元运算符时,也会隐式重载相应的复合赋值运算符,例如重载了+运算符也会隐式的重载+=
^、=、.、?.、? : 、??、??=、…、->、=>、as、await、checked、unchecked、default、delegate、is、nameof、new、sizeof、stackalloc、switch、typeof这些运算符无法进行重载
//一个运算符的重载,其实就是一个方法,当对该类进行对应的运算符操作的时候,会自动执行这个重载的运算符方法
//格式 :
// public static 返回值类型  operator  要重载的运算符 (参数列表){}
public static double operator + (Box b1,Box b2)
{
    return b1.Volume + b2.Volume;
}

2.动态多态

1.抽象类

修饰符: abstract

抽象类和普通类的区别
1.抽象类不能实例化,普通类可以实例化
2.抽象类可以有抽象方法,也可以有普通方法,普通的类不能有抽象方法
2.抽象类可以继承自抽象类,子类如果不是抽象类,就必须重写抽象类中全部的抽象方法

抽象方法特点
1.抽象方法只能定义在抽象类中
2. 抽象方法不能有方法体
3. 抽象方法就是用来被子类继承实现的,所以不能使用private修饰符
4. 子类如果不是抽象类,就必须使用override关键字实现所有继承的抽象方法

//定义抽象类
public abstract class People
{
    public int Age { get; set; }//普通的属性
    public void F2()  // 普通方法
    { 
        Console.WriteLine("F2非抽象方法");
    }

    public abstract string Name { get; set; } // 定义抽象属性
    public abstract void F1(); //抽象方法 不要加{}方法体
}

//定义子类继承抽象类 必须实现所有抽象属性和抽象方法
class Student : People
{
    public override string Name { get; set; } = "ssss";

    public override void F1()
    {
        Console.WriteLine("子类的F1" );
    }
}
2.虚方法

关键字virtual
虚方法和抽象方法
1 虚方法可以定义在普通类中,抽象方法只能定义抽象类中
2 抽象方法不能有方法体,必须在派生类中实现,虚方法可以有方法体,可以不在派生类中实现,不实现则使用基类的方法

3.方法重写关键字

new 和 override 都可以实现对基类成员进行 “覆盖”
new 是隐藏基类中的成员 基类和派生类 各持一份 互不干扰 对象是什么类型 就是调用对应类型的方法
override 是覆盖 将会重写基类中的虚方法和抽象方法 不管对象是类型 都只有一个

3.类的分类

抽象类(abstract):抽象类就是指设计为被继承的类,抽象类只能被用作其他类的基类。
密封类(sealed):密封类只能用作独立的类,它不能用作基类。(不能被其他类所继承)
静态类(static):静态类中所有成员都是静态的,且不能被实例化。
部分类(partial):把一个类分成多个类文件进行定义,编译器在编译时候会把多个文件自动合并一个类。

面向对象(C#基础) 但是,它可以通过接口实现,因为类可以实现多个接口。它不是必需的,但是在命名类时,最好从大写的第一个字母开始。在接口的开头用字母"I"开头被认为是一种好的做法,因为这样可以更容易记住它是一个接口而不是一个类。符号(与继承一样)。记住上一章,我们可以使用多个类来更好地组织(一个用于字段和方法,另一个用于执行)。在 C# 中,可以将字段和方法从一个类继承到另一个类。关键字是一个访问修饰符,用于设置类、字段、方法和属性的访问级别/可见性。在上一章中,了解到类中的变量称为字段,可以通过创建类的对象和使用点语法( 阅读详情

相关推荐

全面掌握C#软件开发:项目实践指南

C#(发音为 "看")是一种由微软公司开发的面向对象的高级编程语言。该语言最初在2000年随.NET框架一起发布,其设计受到了C和C++的影响,并加入了其他语言如Java和Delphi的特性。C#的设计理念旨在提供一个简洁、类型安全且强大的编程语言。安装完成之后,Visual Studio的用户界面包括多个主要部分:菜单栏、工具栏、工具箱、代码编辑器、解决方案资源管理器、输出和错误列表窗口等。A[菜单栏] -->|包含| B[文件]A -->|包含| C[编辑]A -->|包含| D[视图]

weixin_36483050的博客 1372

C#学习资源汇总

C#委托与事件学习笔记 转载于:https://www.cnblogs.com/CelonY/p/10619076.html

weixin_30483495的博客 100

C#软件开发项目:从基础到高级应用

C#(发音为“See Sharp”)是一种由微软开发的现代化、类型安全的面向对象编程语言。它是.NET框架的主要编程语言,设计用来开发各种应用程序,从传统的桌面应用程序到现代的Web服务和移动应用程序。在面向对象编程(OOP)中,类是一种定义对象属性和行为的模板或蓝图。对象是基于类创建的实例,拥有类定义的所有属性和方法。set;set;set;// 构造函数Console.WriteLine("汽车启动了!");在上述代码中,我们定义了一个名为Car的类,它具有三个属性Make。

weixin_42509720的博客 1174

【Head-First设计模式】C#版-学习笔记-开篇及文章目录

原文地址:【Head-First设计模式】C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证,然后将书上的内容和自己的总结一起分享出来,这样看书的效果就会有大大提升。 最近在看一本讲JAVA设计模式的书,本人是C#开发,并想将书上的内容转换成C#的,然后写到博客上,以后查阅也方便,大家也...

weixin_33832340的博客 129

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1077

红外图像和可见光图像异源图像配准问题研究

本文旨在研究一种具有高准确率和鲁棒性的融合图像障碍物检测技术,通过把红外和可见光图像进行图像配准和融合,获取高质量的异源融合图像,根据融合图像的特点采用有效的障碍物检测算法,将图像中的障碍物准确检出。......

G_redsky的博客 1万+

C# 学习笔记

MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,是编写C#程序或者说.NET程序最常用的开发工具。因其功能强大、简单易用、速度快、智能度高,被网友戏称宇宙第一IDE。

qq_52144597的博客 2046

关于光耦隔离与SP3485E芯片一起使用无法拉高485使能引脚问题

最近在做的一个项目,定制了一块STM32F407ZG的工控板,工控板载4个485接口全部都是只能接收数据,不能对外发送数据。1.接线不正确:接线不正确导致485收发出现问题。 2.程序端口初始化问题:控制光耦隔离的输入脚IO的初始化和置位状态有问题。 3.GPIO复用问题:控制对应串口的GPIO不是正点原子默认的GPIO,而是经过复用的其他IO,复用问题。 4.程序设置与485E芯片收发模式不对应:对于使能引脚的电平要根据光耦的输出情况确定输入IO与RE的关系,可能模式没有对应。 5.光耦隔离或者SP485

weixin_45862642的博客 2978

C#学习笔记(上)

经本人搜集网上资料后整合而成的C#学习笔记,知识点很全面,前面某些很基础的内容绝大部分人都已经在学C/C++的时候学过了,所以基本一笔带过,其它地方都尽量写的很详细。

m0_75104457的博客 2315

win11本地部署openclaw实操第1集

OpenClaw 是一款开源、本地优先、可自托管的 AI 智能体(AI Agent)网关 / 自动化框架,核心是让 AI 从 “只聊天、给建议” 变成 “能在你电脑上真做事” 的数字助手。

weixin_44626085的博客 7127

Raspberry Pi 4B 蓝牙串口(SPP)配置与使用

Linux、Android、Windows 等操作系统带有在引导期间启动的蓝牙守护进程/蓝牙服务。 对于与监视器连接并使用 GUI(如 GTK 等)运行的设备,只需多次单击即可轻松启用并连接到附近的设备。 但是在无头设备的情况下,我们必须依赖于需要在命令行上运行的不同命令。 这篇博客我们将讨论如何在无头树莓派上通过蓝牙设备连接附近。

视觉与物联智能 2745

C# 面向对象

/ 缴款 bool Withdraw(decimal amount);// 提,取(银行账户中的钱款) decimal Balance {get;} // 账户余额 } public class SaverAccount : IBankAccount {// 缴款 public bool Withdraw(decimal amount) // 提,取(银行账户中的钱款) {// 体现尝试失败 return false;

江江的博客 5115

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

面向对象的软件开发方法

一、了解什么是面向对象的软件开发方法 答:1、OOSD是一种把面向对象的思想应用于软件开发过程,是一种当今成熟的、普遍流行的软件开发方法 2、面向对象方法的解决思路是从现实世界中的客观对象入手,尽量运用人类的自然思维方式来构造软件系统。是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。 3、面向对象方法中,把一切都看成是对象。对象是功能抽象和数据抽象的统一...

weixin_44599578的博客 6401

引以为戒:一个“看不见”的空格,导致上下文超限——从 `llama-server` 错误说起

文章摘要: 本文分享了Qwen工程团队在部署llama-server时遇到的参数失效问题:明明设置了-c 32768上下文参数,却仍报错"超出4096 tokens限制"。经排查发现,问题根源是批处理脚本中续行符^后存在两个空格,导致参数被忽略。文章详细解析了Windows批处理中^的严格语法规则(必须紧贴前字符),对比了错误与正确写法的差异,并给出4条实用建议:使用编辑器显示空白字符、调试时关闭@echo off、预检完整命令、优先单行命令。最后强调在AI系统部署中,此类"隐

刘一说的IT专栏 541

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1248

【C#基础】C# 面向对象编程

编程语言 C# 面向对象编程知识点介绍。

好学若饥,谦卑若愚。 3499

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c#学习笔记

c#学习笔记

Yamoonn的博客 1215

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# 面向对象学习笔记

目录大纲笔记代码笔记 最近暂且不忙(Working fish),突然想学习下C#,在慕课找到了kong66老师的C#面向对象编程课程,花了3个晚上看完后受益匪浅。整理了一下笔记和代码,以供日后查询使用。 大纲笔记 到幕布看大图 代码笔记 using System; using System.Collections; using System.Collections.Generic; ///...

葫芦娃 345

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

侠客C#营销软件开发

加入QQ群302040480或加QQ2521238762,免费索取教程 教学内容 我们的教学内容以营销软件开发为主要方向,包含视频教程内容和内部书籍教材 视频教程在120节左右,还在不断更新中,现有内容如下: 语法基础 第一节 什么是编程,什么是C#,VS2010 第二节 控制台应用程序的基本结构,变量 第三节 变量的命名规则,数据类型 第四节 数据类型的转换 第五节 运

n2dx83uc2的专栏 1337

C#语言在软件开发中的应用与优势

C#(读作“C-sharp”)是一种由微软公司开发的通用高级编程语言,自2000年发布以来,它迅速成为开发人员构建各种类型应用程序的首选语言之一。C#的设计目标是成为一种简单、现代、面向对象的语言,它结合了C++的强大功能和Java的简单性。本文将探讨C#语言的特点、应用场景以及它的优势。

Envyᥫᩣ的博客 1030

C#(面向对象)

C#(面向对象) 一、面向对象 1.概念 ​ 类可以派生形成子类(派生类),派生子类的类称为父类。对应一个系统最基本的类称为基类,一个基类可以有多个派生类,从基类派生出的类(子类)还可以进行派生。 ​ 对象是类的具体化,是具有属性和方法的实体(实例)。对象通过唯一的标识名以区别于其他对象,对象有固定的对外接口,它是对象与外界通信的通道。 2.对象、类与实例化 ​ 对象是类的具体化,是具有属性和方法的实体(实例)。对象通过唯一的标识名以区别于其他对象,对象有固定的对外接口,它是对象与外界通信的通道。 二、面

ye_liang_chen的博客 3767

学习笔记(C#基础书籍)-- C#基础篇

学习笔记《一》:基础篇

xy_77777的博客 1215
上一篇: c#软件开发学习笔记--集合
下一篇: c#软件开发学习笔记--索引器、接口、泛型
Z599817841
博客等级 码龄4年 12粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值