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

c#笔记-方法

方法

方法定义

方法可以将一组复杂的代码进行打包。
声明方法的语法是返回类型 + 方法名 + 括号 + 方法体

void Hello1()
{for (int i = 0; i < 10; i++){Console.WriteLine("Hello");}
}

调用方法

方法的主要特征就是他的括号。
调用方法的语法是方法名+括号

Hello1();

当调用方法时,就会执行方法体内的代码。
在多个地方需要使用同一组复杂代码时,使用方法打包,会减少代码量。
相较于直接复制这些代码,打包成方法更方便后续的修改。
只需要修改方法体内部的代码,所有调用方法的地方执行的代码都会被修改。

作用域

方法体的声明也有一个大括号,所以这也是一个作用域。
在大括号里声明的东西,不能在大括号外访问。
如果Int2定义在一个if块中也是同样的效果。

void Int1()
{int i1 = 10;//这个变量只能在Int1内部访问void Int2()//这个方法只能在Int1内部访问{int i2 = i1;//允许访问}
}
Int2();//无法访问,超出作用域
i1 = 5;//无法访问,超出作用域

返回值

void表示方法不会返回值。它可以改成一个具体类型,方法在调用完毕后就会返回这个类型的值。
必须在方法内部使用return指明要返回的值。

string String1()
{var i = Random.Shared.Next(100);return $"{i * i}";
}

在调用方法的时候,这个方法就可以被认为是一个值,可以用来给变量赋值,或是参与到表达式计算中。

string s1 = "随机数是" + String1();

流程控制

return同时有结束方法的作用。在void方法中不能在后面跟随值来返回,但可以单独使用来结束方法。

void Random1()
{while (true){int i = Random.Shared.Next(100);Console.WriteLine("随机数是" + i);if (i < 5){return;}}
}

但是对于有返回值的方法,在必须使用return来结束方法(如果方法能结束,即没有死循环)。
如果使用了流程控制语句,需要注意,你认为必定会执行的流程,编译器可能不会这么认为。

int Int3()
{int i = 0;while (i < 100){i++;return i;}return i;//尽管你认为这个方法必然会从上面的循环中返回。//但对编译器来说那个循环可能完全不会执行。//必须要在方法结束的地方另外写一个返回语句。
}

方法调用可以单独作为语句一行放置。
如果它有返回值而你不需要用到他的值,不需要做额外的处理,当作无返回值的方法就行。

引用返回值

引用变量也是有效的返回值类型。

ref int Int4()
{int[] arr = new int[1];return ref arr[0];
}

返回引用变量的方法可以取引用,也可以直接取值。

ref int i2 = ref Int4();
int i3 = Int4();

参数

声明方法的时候,可以在方法的括号里声明变量。
他们不需要赋值初始值。多个参数用逗号隔开,并且要写明类型,即便他们类型相同。

int Max1(int i1, int i2, int i3)
{if (i1 > i2){return i1 > i3 ? i1 : i3;}else{return i2 > i3 ? i2 : i3;}
}

在调用方法的时候,需要在括号里填入对应的值。
使用逗号隔开,顺序和类型都对应上。
这些值将作为初始值赋值给这些参数。

int i4 = Max1(9, 6, 8);
Console.WriteLine(i4);//9

捕获与隔离

方法里可以直接使用外部的变量。这称为捕获变量。
任何对捕获变量的修改都会直接作用到它身上。

int i5 = 40;
Hello2();
Console.WriteLine(i5);//6
void Hello2()
{i5 = 6;
}

在这里插入图片描述
而方法的参数可以声明和作用域外部同名的参数。
这样在方法内对它的修改只会改动到参数,不会影响到外部同名的变量。

int i6 = 40;
Hello3(0);
Console.WriteLine(i6);//40
void Hello3(int i5)
{i5 = 6;
}

可选参数

参数可以赋值初始值,但必须是常量,或者default。
如果一个参数有初始值,那么他们之后的所有变量都要有初始值。

void Random2(int max = 100, int critical = 20)
{if (Random.Shared.Next(max) < critical){Console.WriteLine("暴击");}else{Console.WriteLine("没有暴击");}
}

有初始值的参数在调用的时候可以不必填入初始值,
也可以正常填入值来覆盖预定义的初始值。

Random2();
Random2(40);
Random2(1000, 800);

不定长参数

如果参数的最后一个变量是数组,那么可以使用params修饰。
params修饰的数组不能有默认值。所以不定长参数和可选参数不能同时使用)

int Min1(params int[] arr)
{if (arr.Length == 0)return 0;int min = arr[0];for (int i = 1; i < arr.Length; i++){if (min < arr[i])min = arr[i];}return min;
}

在调用的时候可以直接传入一个数组,
也可以以散装的形式填入。

Min1();
Min1(1);
Min1(6,9);
Min1(8,4,2);

命名参数

默认情况下,调用方法时需要按照参数在定义时的顺序来填入。
但如果指明这个值是给哪个参数的,那么可以乱序。

Hello4(b: 8, a: 9, d: 10);//输出9,8,6,10void Hello4(int a, int b, int c = 6, int d = 40)
{Console.WriteLine(a);Console.WriteLine(b);Console.WriteLine(c);Console.WriteLine(d);
}

这种方式可以在有多个可选参数时,保持前面可选参数的默认值。

引用参数

参数可以设置为引用变量,在前面加上ref

void Hello5(ref int i)
{i *= 2;
}

就像给引用变量赋值时一样,在调用方法时也需要加上ref来把变量取指针。

int i7 = 10;
Hello5(ref i7);
Console.WriteLine(i7);//20

in

引用参数还有两种形式,in表示只读。
虽然是引用方式获得的变量,但不允许在方法中对他进行修改。
这样做的意义是为了防止复制太大的值类型。指针无论如何都只有4字节到8字节。

out

out参数在方法中不会得到变量的初始值。
必须在脱离方法前对他进行赋值。

对已有的变量修改,效果和ref一样。但out参数还可以在调用方法时,当场声明一个变量。

if (int.TryParse("123", out var input))
{Console.WriteLine(input * input);
}
else
{Console.WriteLine("输入不合法");
}

元组

元组类型

方法的返回类型是固定的,不能在某种条件下返回int,在另一种条件下返回bool。
但是可以把这两个数据打包一起返回。这需要一种包含多种数据,却是单独的类型。

除了数组可以打包多个同种类型数据外,元组可以打包固定数量和确定类型的数据。
元组的声明为把多个类型以逗号分隔,然后把他们加上小括号。

(string, int) Hello6((string, int) stu)
{return stu;
}

打包和解构

将同样数量,顺序,类型的一堆值,以逗号分隔,打上括号,就能打包成一个元组类型。

(string, int) stu1 = ("小明", 18);//声明元组,并为元组赋值
(string name1, int age1) = stu1;//析构元组,声明两个变量接收他们
Console.WriteLine(name1);
Console.WriteLine(age1);

在元组类型后加上变量名,是一个元组类型的声明。
如果不加变量名,那么就是元组的解构。
元组会把打包的数据依次赋值给这些变量。

解构的时候可以声明变量,也可以对已有的变量覆盖值。
在解构时,可以使用下划线_来舍弃一些值。
直接使用打包和解构,可以在单语句中交换变量的值。

int id2;
(_, int age2, id2) = ("小明", 18, 1006);//析构元组,舍弃一个值,声明一个变量,覆盖一个已有变量
(age2, id2) = (id2, age2);//交换age2和id2的值

元素命名

无命名

元组中的元素可以单独访问和修改。
任何情况下,元组中的元素都可以使用Item1Item2Item3这种形式访问(从1开始计数)

(string, int) stu3 = ("小明", 18);
string name3 = stu3.Item1;
stu3.Item2 = 66;

类型命名

在声明元组类型时,可以为元素直接命名。
命名后依然可以使用Item1Item2Item3进行访问,并且不可指定这些值作为名字。

(string name, int age) stu4 = ("小明", 18);
string name4 = stu4.name;
stu4.Item2 = 66;

值命名

如果使用var来声明元组,可以在声明值的时候为值指定元素名。

var stu5 = (name: "小明", age: 18);
var name5 = stu5.name;
stu5.age = 88;

推断命名

如果你使用var来声明元组,并且没有给值指定名字,但你使用的是变量,不是表达式,常量,方法。
那么会使用变量名来作为元素名。

string s1 = "hello";
var slength = (s1, s1.Length);
var length = slength.Length;
slength.s1 = "world";

可空值类型

在设置值类型的参数时,我们可能需要一些更特殊的值,而不是default。
例如,将一个int的默认值设置为0,我们无法分辨到底是没有填写保持默认值,
还是真的需要以0为参数来做处理。

我们可以使用可空值类型,在值类型后加上?,他将可以接收null值。

int Random3(int max = 100, int? min = null)
{if (min == null)return Random.Shared.Next(max);elsereturn Random.Shared.Next(min.Value, max);
}

可空值类型是他原本类型的包装类型。
他有两个属性,HasValueValue
HasValue是判断这个值有没有值,效果和==null一样。
如果有值,使用Value访问他的值。但是如果是null,这个访问会报错。

提升运算符

可空值类型继承了基础类型的运算符,这一特性是配合编译器联合工作的结果,我们无法复刻。
可空值类型在使用基础类型的运算符时,遵循以下规则:

  • 如果没有null参与,按基础类型的方式执行。但返回值为可空值类型。
  • 当使用关系运算符时
    • 当双方为null且使用==运算时,返回true
    • 当仅一方为null且使用!=运算时,返回true
    • 否则返回false
  • 其他二元运算符返回null

对于bool?类型是例外,他可以在一方为null的情况下返回非null值。
他不能使用逻辑运算符,他的位运算符逻辑如下。

a | b等效a == true || b == true ? truea == false && b == false ? false: nulla & b等效a == true && b == true ? truea == false || b == false ? false: null

空传播

在你访问一个值的内容时,可以在.[前面加个?,表示空传播。
只要左侧的值是null,那么会阻止之后的所有内容访问,不会异常,并且返回null

string[]? arr1 = null;
string? s2 = arr1?[0];//不会阻止索引越界
int? i8 = s2?.Length;
var i9 = arr1?[0].Length;//只要arr1是null,后面的.Length也不会执行

如果是值类型,那么空传播就会返回可空值类型。
对可空值类型使用时,会直接访问到Value的内容。

int? i10 = 2;
var s3 = i10.Value.ToString();
var s4 = i10?.ToString();

空容忍

对引用类型加?不会发生什么事,因为他们本来就可以接收null值。
只不过如果你不加?,编译器会认为你不希望这个变量接收一个null值,
在赋值的时候他会分析这些值,如果可能是null就会向你发出警告。
在这里插入图片描述
如果你不希望提示这个警告,可以在值的右侧加上!,表示我不在乎他是不是null

int? i11 = 10;
string s5 = i11?.ToString()!;

合并运算

使用x ?? y运算符来简写x == null ? x : y
同样有他的赋值复合运算。

string s6 = null;
int i11 = s6?.Length ?? -1;
s6 ??= "hello";

如果合并运算表达式右侧的值不为null,则这个表达式的值会被认为是不为null的类型。
即对一个可空值类型使用合并运算并给默认值,会转为基础类型。

引用类型除了string类型外,他们只能接收null作为可选参数默认值。
使用合并运算以方便的为可选引用类型参数在方法内指定默认值。

int Random4(Random? random = null)
{random ??= Random.Shared;return random.Next(100);
}

相关文章:

c#笔记-方法

方法 方法定义 方法可以将一组复杂的代码进行打包。 声明方法的语法是返回类型 方法名 括号 方法体。 void Hello1() {for (int i 0; i < 10; i){Console.WriteLine("Hello");} }调用方法 方法的主要特征就是他的括号。 调用方法的语法是方法名括号。 He…...

054、牛客网算法面试必刷TOP101--堆/栈/队列(230509)

文章目录 前言堆/栈/队列1、BM42 用两个栈实现队列2、BM43 包含min函数的栈3、BM44 有效括号序列4、BM45 滑动窗口的最大值5、BM46 最小的K个数6、BM47 寻找第K大7、BM48 数据流中的中位数8、BM49 表达式求值 其它1、se基础 前言 提示&#xff1a;这里可以添加本文要记录的大概…...

怎么让chatGTP写论文-chatGTP写论文工具

chatGTP如何写论文 ChatGPT是一个使用深度学习技术训练的自然语言处理模型&#xff0c;可以用于生成自然语言文本&#xff0c;例如对话、摘要、文章等。作为一个人工智能技术&#xff0c;ChatGPT可以帮助你处理一些文字内容&#xff0c;但并不能代替人类的创造性思考和判断。以…...

springboot 断点上传、续传、秒传实现

文章目录 前言一、实现思路二、数据库表对象二、业务入参对象三、本地上传实现三、minio上传实现总结 前言 springboot 断点上传、续传、秒传实现。 保存方式提供本地上传&#xff08;单机&#xff09;和minio上传&#xff08;可集群&#xff09; 本文主要是后端实现方案&…...

2023河南省赛vp题解

目录 A题&#xff1a; B题 C题 D题 E题 F题 G题 H题 I题 J题 K题 L题 A题&#xff1a; 1.思路&#xff1a;考虑暴力枚举和双hash&#xff0c;可以在O(n)做完。 2.代码实现&#xff1a; #include<bits/stdc.h> #define sz(x) (int) x.size() #define rep(i,z,…...

港科夜闻|香港科大与香港资管通有限公司签署校企合作备忘录,成立校企合作基金促科研成果落地...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港资管通有限公司签署校企合作备忘录&#xff0c;成立校企合作基金促科研成果落地。“港科资管通领航基金”28日在香港成立&#xff0c;将致力于推动高校科研成果转化&#xff0c;助力香港国际创科中心建设。…...

Neo4j 笔记

启动命令 neo4j console Cypher句法由四个不同的部分组成&#xff0c; 每一部分都有一个特殊的规则&#xff1a; start——查找图形中的起始节点。 match——匹配图形模式&#xff0c; 可以定位感兴趣数据的子图形。 where——基于某些标准过滤数据。 return——返回感兴趣的…...

数据库基础应用——概念模型

1、实体(Entity) 客观存在并可相互区别的事物称为实体。实体可以是人、物、对象、概念、事物本身、事物之间的联系。&#xff08;例如一名员工、一个部门、一辆汽车等等。&#xff09; 2、属性(Attributre) 实体所具有的每个特性称为属性。&#xff08;例如&#xff1a;员工由员…...

【学姐面试宝典】前端基础篇Ⅴ——JS深浅拷贝、箭头函数、事件监听等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天继续学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录 什么是事件监听事件委托以及冒泡原理介绍一下 promise&#…...

最新研究,GPT-4暴露了缺点!无法完全理解语言歧义!

夕小瑶科技说 原创作者 |智商掉了一地、Python自然语言推理&#xff08;Natural Language Inference&#xff0c;NLI&#xff09;是自然语言处理中一项重要任务&#xff0c;其目标是根据给定的前提和假设&#xff0c;来判断假设是否可以从前提中推断出来。然而&#xff0c;由于…...

商业数据挖掘-第一章-数据探索式分析-1

数据探索最基本的步骤之一是获取对数据的基本描述,通过获取对数据的基本描述从而获得对数据的基本感觉。下面的一些方法用于帮助我们认识数据。 我们使用波士顿房价预测的数据集进行实验 DataFrame.describe():查看数据的基本分布,具体是对每列数据进行统计,统计值包含频…...

MybatisPlus是否防止SQL注入?

问 如果我希望使用mybatisplus同时也进行防SQL注入操作&#xff0c;应该怎么处理&#xff1f; 答 如果你想在使用 MyBatis-Plus 进行数据库操作的同时也进行防 SQL 注入处理&#xff0c;可以采用以下两种方式&#xff1a; 使用 #{} 占位符&#xff1a;在 QueryWrapper 或 Up…...

5月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年5月1日-5月7日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…...

数据的插入删除和更新

在之前我们就已经学过了数据的插入&#xff0c;在这里再进行一点内容的补充&#xff1a; 在insert语句中&#xff0c;value子句中参数的顺序与表中各个列的顺序是一一对应的。 mysql> insert into first_table(second_column, first_column) values(aaa, 1); Query OK, 1 r…...

C# byte[] 与 int 类型互转

本文讲述在C#中,怎样使用 BitConverter 类将字节数组转换为 int 然后又转换回字节数组的过程。 为什么需要这样呢&#xff1f;这是因为&#xff0c;比如说,在从网络读取字节之后&#xff0c;可能需要将字节转换为内置数据类型。 除了示例中的 ToInt32(Byte[], Int32) 方法之外…...

MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

1. 多表关系 MySQL多表之间的关系可以概括为&#xff1a; 一对一&#xff1a; 比如&#xff1a;一个学生只有一张身份证&#xff1b;一张身份证只能对应一学生。 实现原则&#xff1a;在任一表中添加唯一外键&#xff0c;指向另一方主键&#xff0c;确保一对一关系。 一般一对…...

【iOS】—— RunLoop线程常驻和线程保活

文章目录 没有线程常驻会怎么样&#xff1f; 线程常驻线程保活 没有线程常驻会怎么样&#xff1f; 我们一般写一个子线程&#xff0c;子线程执行完分配的任务后就会自动销毁&#xff0c;比如下面这个情况&#xff1a; 我们先重写一下NSThread里面的dealloc方法&#xff0c;打印…...

Springcloud--docker快速入门

认识docker docker相关操作 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…...

基于AT89C51单片机的电子计数器设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87770826 源码获取 主要内容&#xff1a; 设计一个电子计时器&#xff0c;数码管初始显示值为“00”&#xff0c;每隔1s电子秒表加1&#xff1b;秒计数到60时清0&a…...

IT程序员如何面对35岁大龄问题?我从公司老板的角度聊聊

很多从事IT行业的人一想到35岁就很焦虑&#xff0c;担心自己被公司裁员后找不到工作。同时还有家庭责任加身&#xff0c;担心中年失业后晚年生活。作为一位公司老板&#xff0c;我想从我的角度谈一下这个问题。 首先&#xff0c;我本质上不介意我的员工年龄&#xff0c;无论是…...

【计算机专业漫谈】【计算机系统基础学习笔记】W2-2-2 模运算系统和补码表示

利用空档期时间学习一下计算机系统基础&#xff0c;以前对这些知识只停留在应试层面&#xff0c;今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC&#xff0c;参考书籍也是袁老师的教材&#xff0c;这是我的听课自查资料整理后的笔记 补码表示法…...

vue概述

vue2和vue3的区别 vue2和vue3区别 NOvue2vue31 optinos Api写法 比较分散 Compostiton Api 代码集 2重写数序双向绑定通过Object.defineProperty&#xff08;&#xff09;实现 基于Proxy实现 对数组有了更好的支持 3Fragments 1&#xff0c;在template中只能一个div 2&#xf…...

SpringCloud-OpenFeign案例实战

关于Spring Cloud Open Feign的介绍可以参考这两篇博客 OpenFeign服务接口调用 使用Feign作为服务消费者 本博客参考gitee开源项目代码&#xff0c;结合自己的理解&#xff0c;记录下微服务场景下的使用。Talk is cheap. Show me the code&#xff01; 一、项目结构 这里使用…...

ACM - 数学 - 提高(还没学多少)

ACM - 数学 练习题 一、数论1、分解质因数 &#xff1a;AcWing 197. 阶乘分解2、求约数个数&#xff08;1&#xff09;AcWing 1294. 樱花 &#xff08;求 n&#xff01;约数个数之和&#xff09;&#xff08;2&#xff09;AcWing 198. 反素数 &#xff08;求 1 ~ N 中约数最多的…...

JavaScript class和继承的原理

&#xff08;对于不屈不挠的人来说&#xff0c;没有失败这回事。——俾斯麦&#xff09; class 相关链接 MDN链接 有关类的详细描述 关于构造函数&#xff0c;原型和原型链的说明 类的概述 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JS 中的类建立在原型上…...

Playwright-python 自动化测试【Anaconda】环境配置

第一步&#xff1a;Anaconda的安装 安装Anaconda的好处&#xff0c;比prenv网速快&#xff0c;并且拥有独立的python环境&#xff0c;再也不用烦恼用哪个python好了。 Anaconda的下载页参见官网下载&#xff0c;Linux、Mac、Windows均支持。 https://mirrors.tuna.tsinghua.ed…...

攻防世界-web-simple js

题目描述&#xff1a;小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 打开链接&#xff1a; 然后我们会发现不管我们输入什么密码&#xff0c;发现是都是这样的报错 1. 先用bp抓包看看&#xff0c;可以抓到这样的一串js脚本 看不懂…...

【SpringCloud】初始微服务

目录 一、单体架构 1、概念 2、优点 3、缺点 二、分布式架构 1、概念 2、优点 3、缺点 三、微服务 1、概念 2、优点 3、缺点 四、微服务技术对比 五、SpringCloud 六、服务拆分 1、注意事项 2、服务远程调用 一、单体架构 1、概念 业务的所有功能都集中到一个…...

均摊时间复杂度

均摊时间复杂度&#xff0c;它对应的分析方法&#xff0c;摊还分析&#xff08;或者叫平摊分析&#xff09; 均摊时间复杂度应用的场景比它更加特殊、更加有限 // array表示一个长度为n的数组// 代码中的array.length就等于nint[] array new int[n];int count 0;void insert…...

夏驰和徐策的解决数学问题思路——反证法

反证法是一种证明方法&#xff0c;它的基本思路是通过假设某个结论不成立&#xff0c;然后构造出一个矛盾的情况来推导出原先假设的结论是成立的。 具体来说&#xff0c;反证法一般包含以下步骤&#xff1a; 1. 假设所要证明的命题不成立。 2. 通过这个假设&#xff0c;构造…...