C#学习 - 方法的定义、调用、调试
方法
- 方法(Method)是由C/C++中的函数(Function)发展而来的
//C语言
#include <stdio.h>
int Add(int x, int y)
{return x + y;
}//函数
int main(void)
{int a = 4;int b = 2;int c = Add(a, b);printf("%d + %d = %d\n", a, b, c);return 0;
}
//C++
#include <iostream>
int Add(int x, int y)
{return x + y;
}//函数
int main()
{int a = 4;int b = 2;int c = Add(a, b);std::cout << a << " + " << b << " = " << c;return 0;
}
方法是面向对象,当一个函数以类的成员出现的时候就叫方法,所以方法又叫成员函数
在编写C++程序时,选择添加类(Class),然后输入类名,后面的 .h 文件就是类的声明,而 .cpp 文件就是类的定义(在C#中类的声明和定义是放在一起的)
//ABC.h - 类的声明
#pragma once
class ABC
{
public:void ShowHello();
};//ABC.cpp - 类的定义
#include "ABC.h"
#include <iostream>
void ABC::ShowHello()
{std::cout << "Hello World";
}//use.cpp
#include <iostream>
#include "ABC.h"
int main()
{ABC* pABC = new ABC();//此处已经有了C#方法的雏形了pABC->ShowHello();return 0;
}
- 方法是类(或结构体)的成员
C#中函数不能独立于类(或结构体)之外
只有作为类(或结构体)的成员出现时,函数才能被称为方法
namespace ConsoleApp1
{int Add(int x, int y){return x + y;}internal class Program{static void Main(string[] args){ }}
}
上段代码中的函数没有在类中,编译会报错
- 方法是类(或结构体)最基本的成员之一
类(或结构体)有两个最基本的成员 - 字段和方法(成员变量和成员函数)
方法表示类(或结构体)所能干的事情 - 使用方法和函数的目的
- 隐藏复杂的逻辑;
- 把大算法分解为小算法;
- 复用;
//未复用
class Tool
{public double GetCicleArea(double R){return 3.14 * R * R;}public double GetCylinderVolume(double R, double H){return 3.14 * R * R * H;}public double GetConeVolume(double R, double H){return 3.14 * R * R * H / 3;}
}
//复用
class Tool
{public double GetCicleArea(double R){return 3.14 * R * R;}public double GetCylinderVolume(double R, double H){return GetCicleArea(R) * H;}public double GetConeVolume(double R, double H){return GetCyliderVolume(R, H) / 3;}
}
将一个大的算法分解为小的算法,再由算法一个一个解决,就是自顶向下逐步求精的方法
方法的声明与调用
方法的声明
函数头 + 函数体
函数头:特性 + 有效的方法的修饰符 + partial + 返回类型 + 方法名 + 类型参数列表 + ( + 形式参数列表 + )+ 类型参数约束句子
其中只有 返回类型 & 方法名 & **()**是必须要的;其中 类型参数约束句子 只有在有 类型参数列表 出现时才能出现
方法名最好使用动词或动词短语,所有单词首字母大写(Pascal命名法)
形式参数(parameter,简称:形参):是一种变量,会参与构成方法的算法逻辑
静态方法和实例方法
静态方法与类绑定,非静态方法(实例方法)与实例绑定
using System;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){Tool t = new Tool();Console.WriteLine(t.Add(1, 2));//实例方法与实例绑定Console.WriteLine(Tool.Sub(1,2));//静态方法与类绑定}}class Tool{public int Add(int x, int y){ //实例方法return x + y;}public static int Sub(int x, int y){ //静态方法return x - y;}}
}
调用方法
方法调用:方法名 + ( + 实际参数列表 + )
实际参数(Argument,简称:实参):实际参数列表需要与定义方法时的形式参数列表相匹配
以上面那段代码为例:
int x = Tool.Sub(1);
//此时实际参数个数与形式参数不匹配
int y = Tool.Sub(1.0, 2.5);
//此时实际参数类型与形式参数不匹配
构造器
构造器(Constructor)是类型的成员之一,构造器就是构造函数
狭义的构造器就是实例构造器(Instance constructor)
using System;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){Human human = new Human();//上行代码中的 () 就是调用构造器Console.WriteLine(human.ID);Console.WriteLine(human.Name);People people = new People();Console.WriteLine(people.ID);Console.WriteLine(people.Name);Student student = new Student(1, "None");//构造器带参数时调用也需要带参数Console.WriteLine(student.ID);Console.WriteLine(student.Name);}}class Human{ //当声明一个类后,没有准备构造器时,编译器会自动为其准备一个默认构造器//默认构造器可以把内存中的对象的字段进行初始化,就是将 ID 和 Name 进行初始化public int ID;public string Name;}class People{public People(){ //创建构造器时,构造函数名要与类一致this.ID = 0;this.Name = "NULL";}public int ID;public string Name;}class Student{public Student(int id, string name){this.ID = id;this.Name = name;}public int ID;public string Name;}
}
一个类中可以有多个构造器
class People
{public People(int id, string name){this.ID = id;this.Name = name;}public People(){this.ID = 0;this.Name = "NULL";}public int ID;public string Name;
}
构造器的内存原理
默认构造器
Human human = new Human();
class Human
{public int ID;public string Name;
}
第一个代码创建了一个human变量,human变量存储在栈区中(栈区存储由高字节位到低字节位)
new操作符开始执行时,在堆区找足够的内存空间作为实例的内存,而 int 需要占4字节,string 需要占4字节,所以最后占用了8个字节。构造时就对这8个字节进行切割,前4个为int类型,后4个为string类型,然后默认构造器将这8个字节中的值全赋值为0
最后将实例的地址存储在human变量中
带参数的构造器
Human human = new Human(1, "One");
class Human
{public Human(int id, string name){this.ID = id;this.Name = name;}public int ID;public string Name;
}
依旧是在栈区分配human变量的内存空间,然后在堆区分配8字节,然后开始切割这8个字节,再在前4个字节中存入1,在后4个字节中存入“One”
最后把实例的地址放进human变量的内存空间中
方法的重载(Overload)
当一个类中的两个方法的名称一致时,方法签名不能一致
方法签名(Method signature)由方法名称、类型形参的个数和方法的形参(由左到右的顺序)的类型、种类(值、引用、输出)组成,方法签名不包含返回类型
class Tool
{public int Add(int a, int b){ return a + b; }public double Add(double a, double b){ return a + b; }public int Add(int a, int b, int c){ return a + b + c; }public int Add(ref int a, out int b){ b = 10; return a + b; }//ref就是引用、out就是输出
}
构造器也可以有重载,构造器的签名由每一个形参(从左到右的顺序)的类型和种类(值、引用、输出)组成
重载决策:根据调用方法时实参的类型来决定调用哪一个方法。如:
Console.WriteLine(100);
Console.WriteLine("Hello World");
对方法进行debug
debug可以找到bug发生的地方,也可以了解到程序运行的原理
设置断点(breakpoint)
设置断点后,运行程序时会自动停在断点设置处
红色就是断点标识,设置快捷键是F9,然后按F5进行调试,就会执行时停到断点处
当红点标识变成上图标识时,就是程序执行停在了那里
观察方法调用时的调用堆栈(call stack)

上图中第一行就是断点处的方法(函数)
第二行就是调用它的函数,可以双击跳到所需位置
实际代码中此处可能会层层叠加,最后一行就是最外层调用,而红点标识处就是断点处
逐语句(Step-into)、逐过程(Step-over)、跳出(Step-out)
Step-into(F11)会进入所调用的方法中去
Step-over(F10)不会进入所调用的方法中,没有Step-into细致
Step-out(Shift+F11)可以从一个方法中直接回到调用它的那段代码上
观察局部变量的值与变化
在监视中观察
将鼠标移到变量处,可以标识出变量的值,当语句调试到那一处时,会自动将被标识的变量的值显示出来
方法调用时栈内存的分配
stack frame:一个方法被调用时,它在栈内存当中的布局
当代码执行到一个方法时,在栈区中分配一个内存
当在A方法中调用一个B方法时用到了实际参数,传的参数也会分配到栈区中,在C#中这些实际参数归A方法管
分配参数内存时,在C#中先分配左边的参数,再分配右边的参数
当一个方法调用结束后,会回收给它分配的内存,且传递的实参所占的内存也会被回收
方法的返回值会存在cpu的寄存器(一种高速内存)中,当寄存器空间不够存放返回值时才会存放在栈区
using System;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){Tool tool = new Tool();Console.WriteLine(tool.Add(1, 2));}}class Tool{public int Add(int a, int b){int c = Sub(a, b);return c;}public int Sub(int a, int b){int c = a - b;return c;}}
}

上图就是上段代码执行到方法Sub时的栈区内存分配,继续执行就会从上往下慢慢回收已经调用结束的方法所占的内存
注:上图只标识了参数内存分配,实际上还有其他很多元素会分配到栈区中
相关文章:
C#学习 - 方法的定义、调用、调试
方法 方法(Method)是由C/C中的函数(Function)发展而来的 //C语言 #include <stdio.h> int Add(int x, int y) {return x y; }//函数 int main(void) {int a 4;int b 2;int c Add(a, b);printf("%d %d %d\n&quo…...
『PyQt5-Qt Designer篇』| 09 Qt Designer中分割线和间隔如何使用?
09 Qt Designer中分割线和间隔如何使用? 1 间隔1.1 水平间隔1.2 垂直间隔2 分割线2.1 水平线2.2 垂直线3 保存并执行1 间隔 间隔有水平间隔和垂直间隔: 1.1 水平间隔 拖动4个按钮,并设置为水平布局: 在第一个按钮的右边添加一个水平间隔: 设置其sizeType为Fixed,宽度为20…...
基于springboot2+mybatis-plus+jsp增删改查
概述 编写简单增删改查,理解之后可以自己试着扩展,相信你也可以,加油,我自己懂了的用注释记在下面方便理解 详细 一、需求(要做什么) 基于现今最流行的技术实现增删改查demo, 便于初学者上手…...
[PHP]empty一直返回true
class Post {public function __get($key){return true;} }$post new Post(); var_dump(empty($post->a));// bool(true) PHP: 重载 - Manual 读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用。 当对不可访…...
[2023.09.11]: Yew的SSR中的Cargo.toml配置
由于各种原因,我最后还是打算把Yew应用的开发从csr模式转成ssr模式。没想到这里面的水还是挺深的,这里面的Cargo.toml配置包含的信息量之大,着实让我头疼了一番。 Cargo.toml的配置如下 [package] name "app" version "0.…...
HTTPS加密协议详解:HTTPS性能与优化
1、HTTPS性能损耗 前文讨论了HTTPS原理与优势:身份验证、信息加密与完整性校验等,且未对TCP和HTTP协议做任何修改。但通过增加新协议以实现更安全的通信必然需要付出代价,HTTPS协议的性能损耗主要体现如下: (1).增加延时 分析前…...
9月11日,每日信息差
今天是2023年09月11日,以下是为您准备的13条信息差 第一、微软已停止向俄罗斯提供服务,俄罗斯接下来的举动震惊世人!对此俄罗斯回应称,他们将把微软的收费版改为免费版并推广至全球 第二、我国首套海洋漂浮式温差能发电装置完成…...
RHCSA-VM-Linux基础配置命令
1.代码命令 1.查看本机IP地址: ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1:<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>为虚拟机自身网卡 2.测试网络联通性: [f…...
Web安全研究(四)
No Honor Among Thieves: A Large-Scale Analysis of Malicious Web Shells Stony Brook University Ruhr-University Bochum Web shell作为恶意脚本,攻击者将其上传到被攻陷的Web服务器,以远程执行任意命令、维护其访问权限并提升其特权。尽管在实践中它…...
【CS324】Large Language Models(持续更新)
note 文章目录 note一、引言二、大模型的能力三、大模型的有害性(上)四、大模型的有害性(下)五、大模型的数据Reference 一、引言 语言模型最初是在信息理论的背景下研究的,可以用来估计英语的熵。 熵用于度量概率分布…...
【学习笔记】「2020-2021 集训队作业」Communication Network
有点难😅 发现容斥系数设计的非常巧妙🤔 设 f ( i ) f(i) f(i)表示恰好有 i i i条边相同的方案数, g ( i ) g(i) g(i)表示至少有 i i i条边相同的方案数 根据二项式反演, g ( i ) ∑ j ≥ i ( j i ) f ( j ) ⇒ f ( i ) ∑ j…...
文章参考链接
文章参考: 前端 echsrt横轴文字过长,…展示【link】js数组去重【link】js数据是String去重【link】js数据是对象去重【link】小程序使用wxml-to-canvas【link】vantui【link】微信小程序使用vantui组件【link】【link】微信小程序,选项卡页面…...
SQLI-labs-第七关
知识点:单引号()加括号闭合错误的布尔盲注 思路: 寻找注入点 我们首先看一下正常的回显,并没有显示出什么明显的信息 输入?id1 发现报错 输入?id1 -- 还是报错,说明SQL语句的语法错误可能不是单引号闭合…...
腾讯云轻量2核4G5M服务器_CPU内存_流量_带宽_系统盘
腾讯云轻量2核4G5M服务器:CPU内存流量带宽系统盘性能测评:轻量应用服务器2核4G5M带宽,免费500GB月流量,60GB系统盘SSD盘,5M带宽下载速度可达640KB/秒,流量超额按照0.8元每GB支付流量费,轻量2核4…...
从零开始搭建Apache服务器并使用内网穿透技术实现公网访问
Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…...
unordered_map和unordered_set的使用
前言 在C98中,STL提供了底层为红黑树的结构的一系列关联式容器,在查询时效率可以达到logN,即使最差的情况下需要比较红黑树的高度次,当树中的节点较多时,查询的效率也不是很理想,最好的查询是,进…...
javascript【格式化时间日期】
javascript【格式化时间日期】 操作: (1) 日期格式化代码 /*** 日期格式化函数<br/>* 调用格式:需要使用日期对象调用* <p> new Date().Format("yyyy/MM/dd HH:mm:ss"); </p>* param fmt 日期格式* returns {*} 返回格式化…...
CCC数字钥匙设计【NFC】--什么是AID?
1、NFC中的AID是什么? AID,英文全称为Application Identifier,这是NFC技术中的概念,AID用于唯一标识一个应用。 NFC应用的AID相关操作,包括注册和删除应用的AID、查询应用是否是指定AID的默认应用、获取应用的AID等 …...
变压器耐压试验电压及电源容量的计算
被试变压器的额定电压为(11081. 25%) /10. 5kV, 联接组标号为 YNd11。 试验时高压分接开关置于第 1 分接位置, 即高压侧电压为 126kV, 高、 低压电压比 K1126/(√310. 5) 6. 93。 现以 A 相试验…...
uniapp实现底部弹出菜单选择
其实uniapp有内置的组件,不用自己去实现,类似于这样: uni.showActionSheet({itemList: [菜单一, 菜单二, 菜单三],success: function (res) {console.log(选中了第${res.tapIndex 1}个菜单);},fail: function (res) {console.log(res.errMs…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
