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…...
14. 线性代数 - 线性方程组
文章目录 线性方程组矩阵行列式全排列和逆序数N阶行列式(非)齐次线性方程Hi,大家好。我是茶桁。 结束了「微积分」部分的学习之后我们稍作休整,今天正式开始另外一部分:「线性代数」的学习。小伙伴们放松完回来要开始紧张起来了。 我们之前说过,不管是哪一个工程学科,根…...
C++QT day4
仿照string类,完成myString类 #include <iostream> #include <cstring> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造myString():size(10){s…...
Python中的 if __name__ ==‘main‘
你编写的程序迟早需要创建目录以便在其中存储数据。 os 和 pathlib 包含了创建目录的函数。我们将会考虑如下方法: | 方法 | 描述 | | -------------------- | -------------------------- | | os.mkdir() | 创建单个子目录 | | os.makedirs() | 创建多个目录&…...
github 创建自己的分支 并下载代码
github创建自己的分支 并下载代码 目录概述需求: 设计思路实现思路分析1.进入到master分支,git checkout master;2.master-slave的个人远程仓库3.爬虫调度器4.建立本地分支与个人远程分支之间的联系5.master 拓展实现 参考资料和推荐阅读 Survive by day…...
算法:贪心---跳一跳
1、题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 2…...
机器学习入门教学——梯度下降、梯度上升
1、简介 梯度表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(梯度的方向)变化最快,变化率(梯度的模)最大,可理解为导数。梯度上升和梯度下降是优化算法中常用的…...
BUUCTF Reverse/[羊城杯 2020]login(python程序)
查看信息,python文件 动调了一下,该程序创建了一个线程来读入数据,而这个线程的代码应该是放在内存中直接执行的,本地看不到代码,很蛋疼 查了下可以用PyInstaller Extractor工具来解包,可以参考这个Python解包及反编译…...
indexDB localForage
一、前言 前端本地化存储算是一个老生常谈的话题了,我们对于 cookies、Web Storage(sessionStorage、localStorage)的使用已经非常熟悉,在面试与实际操作之中也会经常遇到相关的问题,但这些本地化存储的方式还存在一些…...
Spring Boot开发时Java对象和Json对象互转
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...
C++ 多态
引例: #include<iostream> using namespace std; class Animal { public:void speak(){cout<<"动物在说话"<<endl;} }; class Cat:public Animal { public:void speak(){cout<<"小猫在说话"<<endl;} }; void Do…...
呼市网站建设/网络推广服务合同
readonly在代码中只能在字段初始化器和构造函数中赋值,并不是说readonly只能赋值一次,超出这个范围以后readonly就不能通过代码修改了,但是还是可以用反射来修改,readonly仅仅是提示编译器在其他地方赋值的时候编译错误而已 来源&…...
wordpress4.2.15漏洞/seo快速排名利器
数据从业者常在多种工具之间跳来跳去,这种碎片化导致了协作、共享和生产力方面的问题。 企业云数据量的增加以及数据转换、模型构建和可视化工具的出现,推动了现代数据堆栈的崛起。大部分公司都在加大对数据团队的投入,以适应不断变化的需求…...
网站怎么做的有创意/百度安全中心
现在项目有需要对数据进行脱敏处理,要求保留前三位和最后四位,中间对用*处理。如18912341234脱敏处理之后应该变成189****1234。处理方法如下:var str"18912341234"var pat/(\d{3})\d*(\d{4})/var bstr.replace(pat,$1****$2);cons…...
专业做汽车零部件平台的网站/域名注册腾讯云
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法。 它是对对象行为的定义,也是对功能的规范。 示例: // GoodChild.h #import <Foundation/Foundation.h> protocol GoodChild <NSObject> -(…...
做视频网站视频/电脑优化工具
Linux指令篇:文件打印--lpd(转)名称: lpd使用权限: 所有使用者使用方式:lpd [-l] [#port]lpd 是一个常驻的打印机管理程序,它会根据 /etc/printcap 的内容来管理本地或远端的打印机。/etc/printcap 中定义的每一个打印机必须在 /v…...
共青城市建设局网站/网络广告发布
简介 这节课我们将讨论如何在OSG中使用键盘和灯光。我们将会学习指定三种纹理过滤方式,学习如何使用键盘来移动场景中的立方体。 在osg中通过osgGA库来实现与用户的交互,在用户端,通常使用GUIEventAdapter类作为系统交互事件和OSG交互事件的…...