c#方法进阶-各种参数

发布时间:2026/10/20 5:11:22

c#方法进阶-各种参数 值参数值参数是一个变量为传进来的实际参数创建一个副本它有值类型和引用类型两种参数;传值参数-值类型class Program { static void Main(string[] args) { Student stu new Student(); int y 100; stu.AddOne(y); //101 改变的是副本的值 Console.WriteLine(y); //100 不改变变量的值 } } class Student { public void AddOne(int x) //参数不带修饰符且是值类型-值类型的传值参数 { x x 1; Console.WriteLine(x); } }传值参数-引用类型并且新创建对象传的是地址而不只是一个值创建副本是实线箭头不创建副本是虚线箭头想向外暴露数据用属性比字段更安全*引用类型变量存储的值是引用类型实例在堆内存中的地址引用类型变量以传值的形式传入方法“引用类型”是说这个变量的类型是类、接口和委托中的一种“以传值的形式”意思是传值参数传进来的值会在方法体内部创建一个副本即使在方法内对这个副本进行了各种计算也不会改变调用者的实参即不会影响方法体外面变量的值示例class Program { static void Main(string[] args) { Student stu new Student() {NameTim}; SomeMethod(stu); //Tom Console.WriteLine(stu.Name); //Tim } static void SomeMethod(Student stu) { stunew Student() {NameTom}; //少见无意义 Console.WriteLine(stu.Name); } } class Student { public string Name { get; set; } }若都是Tom如何区分GetHashCode是 C# 里所有类型都有的一个方法定义在object上作用是返回一个整数得到代表对象的唯一值用来在哈希表如Dictionary、HashSet里快速定位对象。class Program { static void Main(string[] args) { Student stu new Student() {NameTom}; SomeMethod(stu); //46104728,Tom Console.WriteLine({0},{1},stu.GetHashCode(),stu.Name); //12289376,Tom } static void SomeMethod(Student stu) { stunew Student() {NameTom}; Console.WriteLine({0},{1}, stu.GetHashCode(), stu.Name); } } class Student { public string Name { get; set; } }改变量名字快捷键Ctrl。传值参数-引用类型只操作对象不创建新对象如果值参数传的是引用类型变量那么由于引用类型存的是实例在堆内存中的地址即使主参数和方法体内的副本是相互独立的但是它们的值一样也即指向堆内存中的同一个实例所以如果在方法体中通过副本引用类型变量操作了这个实例那么在主调者中通过实参指向的实例也会被改变本来指向的都是同一个实例。上述这种通过传进来的参数修改引用的对象的值的情况是很少见的因为作为方法而言它的主要输出还是靠返回值这种修改参数所引用的对象的值的操作叫方法的副作用(side-effect平时编程时要避免副作用。class Program { static void Main(string[] args) { Student stu new Student() {NameTim}; UpdateObject(stu); //HashCode46104728,NameTom Console.WriteLine(HashCode{0},Name{1}, stu.GetHashCode(), stu.Name); //HashCode46104728,NameTom } static void UpdateObject(Student stu) { stu.Name Tom; //副作用 Console.WriteLine(HashCode{0},Name{1},stu.GetHashCode(),stu.Name); } } class Student { public string Name { get; set; } }引用参数引用形参是用 ref 修饰符声明的形参。和值参数的区别是引用参数不会为传进来的实际参数创建一个副本形参和实参的变量是同一个地址即共用同一个变量引用参数利用其副作用是打算来修改传进来的值在传进方法之前一定要赋值。引用参数-值类型class Program { static void Main(string[] args) { int y 1; IWantSideEffect(ref y); Console.WriteLine(y); //101 } static void IWantSideEffect(ref int x) { x x 100; } }引用参数-引用类型创建新对象class Program { static void Main(string[] args) { Student outterStu new Student() {NameTim}; Console.WriteLine(HashCode{0},Name{1}, outterStu.GetHashCode(), outterStu.Name); //HashCode 46104728,Name Tim Console.WriteLine(------------------------); IWantSideEffect(ref outterStu); //HashCode 12289376,Name Tom Console.WriteLine(HashCode{0},Name{1}, outterStu.GetHashCode(), outterStu.Name); //HashCode 12289376,Name Tom } static void IWantSideEffect(ref Student stu) { stu new Student() {NameTom}; Console.WriteLine(HashCode{0},Name{1},stu.GetHashCode(),stu.Name); } } class Student { public string Name { get; set; } }引用参数-引用类型不创建新对象只改变对象值class Program { static void Main(string[] args) { Student outterStu new Student() {NameTim}; Console.WriteLine(HashCode{0},Name{1}, outterStu.GetHashCode(), outterStu.Name); //HashCode 46104728,Name Tim Console.WriteLine(------------------------); IWantSideEffect(ref outterStu); //HashCode 46104728,Name Tom Console.WriteLine(HashCode{0},Name{1}, outterStu.GetHashCode(), outterStu.Name); //HashCode 46104728,Name Tom } static void IWantSideEffect(ref Student stu) { stu.NameTom; Console.WriteLine(HashCode{0},Name{1},stu.GetHashCode(),stu.Name); } } class Student { public string Name { get; set; } }与传值参数效果一样但内存机理不同输出参数输出参数不为传进来的实际参数创建一个副本输出参数和输入的实参指的是同一个位置不要求在传进方法之前要赋值在方法体之内一定要赋值。输出参数利用其副作用是打算拿输出参数当作值的输出通过输出参数来获得除了方法返回值额外的输出输出参数-值类型TryParse安全地将字符串转换为其他类型如int、double、DateTime、Enum等不抛出异常只告诉解析结果是true还是false。普通的如int.Parse会抛出异常。class Program { static void Main(string[] args) { Console.WriteLine(Please input first number:); string arg1Console.ReadLine(); double x 0; bool b1double.TryParse(arg1, out x); if (b1false) { Console.WriteLine(Input error); return; } Console.WriteLine(Please input second number:); string arg2 Console.ReadLine(); double y 0; bool b2 double.TryParse(arg2, out y); if (b2 false) { Console.WriteLine(Input error); return; } double z x y; Console.WriteLine({0}{1}{2},x,y,z); } }class Program { static void Main(string[] args) { double x 100; bool b DoubleParse.TryParse(ABC, out x); if (b) { Console.WriteLine(x1); } else { Console.WriteLine(x); } } } class DoubleParse { public static bool TryParse(string input,out double result) { try { result Double.Parse(input); return true; } catch { result 0; //不要求在传进方法之前要赋值在方法体之内一定要赋值。 return false; } } }输出参数-引用类型class Program { static void Main(string[] args) { Student stu null; bool b StudentFactory.Creat(Tim, 22, out stu); if (b) { Console.WriteLine(Student {0},age is {1}.,stu.Name,stu.Age); } } } class Student { public int Age { get; set; } public string Name { get; set; } } class StudentFactory { public static bool Creat(string stuName, int stuAge, out Student result) { result null; if (string.IsNullOrEmpty(stuName)) { return false; } if (stuAge 80 || stuAge 20) { return false; } result new Student() {NamestuName,AgestuAge}; return true; } }数组参数只能有一个且位于列表中的最后一个class Program { static void Main(string[] args) { int result CalculateSum(1, 2, 3, 4, 5); Console.WriteLine(result); } static int CalculateSum(params int[] intArray) { int sum 0; foreach (int i in intArray) { sum i; } return sum; } }string.Split用于将字符串按指定的分隔符拆分成多个子字符串数组的方法。class Program { static void Main(string[] args) { string str Tim;Tom,Amy.Lisa; string[] result str.Split(;, ., ,); foreach (var name in result) { Console.WriteLine(name); } } }具名参数具具有参数的位置不再受约束调用一个方法的时候传进去的参数是带有名字的class Program { static void Main(string[] args) { //不具名调用,按参数列表顺序依次填写实参 PrintInfo(Tim,34); //具名调用提高代码可读性参数位置不再受参数列表顺序影响 PrintInfo(age: 34, name: Tim); } static void PrintInfo(string name,int age) { Console.WriteLine(Hello {0},you are {1}.,name,age); } }可选参数调用方法的时候这个参数可选可不选参数在声明时添加默认值在调用方法时就可以不用参数而使用默认值class Program { static void Main(string[] args) { PrintInfo(); } static void PrintInfo(string name Tim,int age34) //默认值 { Console.WriteLine(Hello {0},you are {1}.,name,age); } }扩展方法this参数无法对一个类型的源码进行修改的时候可以使用扩展方法为目标数据类型来追加方法class Program { static void Main(string[] args) { double x 3.1415926; double y x.Round(4); //只有一个参数x就是this double input Console.WriteLine(y); } } static class DoubleExtension //约定俗成命名 { public static double Round(this double input,int digits) { double resultMath.Round(input,digits); return result; } }LINQ语言集成查询Lambda 运算符在 C# 中就是等号加大于号(i i 10);i代表集合A中的每一个元素参数。读作 goes to 或者 变成表示“对于参数i执行后面的判断”。i 10判断条件返回值。整体意思是判断集合A中是否存在Any满足条件大于 10的元素。class Program { static void Main(string[] args) { Listint myListnew Listint() {11,12,13,6,15,16}; bool result myList.All(i i 10); Console.WriteLine(result); } }总结
延伸阅读

更多相关文章

2026/10/20 5:06:22

YOLOv11结合Slim-Neck:高效目标检测器架构优化与边缘部署实践

YOLOv11 出来之后,我用它刷了几个检测项目,整体确实顺手,但我一直觉得脖子这块有压缩空间。哪怕模型在精度上越做越强,Neck 依旧是整个网络里参数量和计算量的大头。正好手头有个边缘设备上的落地项目,显存和带宽都抠得…

2026/10/20 5:06:22

用LLM+浏览器自动化打造GitHub智能代理:Clawless实战解析

1. 项目背景与需求拆解1.1 为什么我给 GitHub 操作装了一个“智能代理脑”做开发这些年,GitHub 上的日常操作其实非常规整:看 issue、关 issue、拉分支、提交 PR、检查 CI 状态、回复评论。这些操作本身不难,难的是“一天要重复几十次”。尤其…

2026/10/20 5:06:22

TensorFlow实战宝可梦图像分类:从数据清洗到模型部署全流程

1. 项目缘起与整体设计思路宝可梦图像分类这个题目,乍一看像是玩具项目,但真正动手做过的人都知道,它几乎涵盖了图像分类任务中所有典型的坑:类别数量多、类间差异小、类内差异大、数据分布不均衡、背景干扰严重。我当初选这个题目…

2026/10/20 9:37:17

格雷厄姆特价股票理论在新兴市场的实战改造与筛选指南

1. 特价股票理论到底在说什么1.1 原始公式中那个“特价”到底怎么定义“格雷厄姆特价股票理论”听起来很学术,其实格雷厄姆本人给出的框架非常朴素:找到股价远低于公司可变现净资产的股票。最经典的量化标准是净流动资产(Net Current Asset V…

2026/10/20 9:37:17

基于Spring AI的智能考试系统设计实践:从架构到踩坑全记录

这段时间刚好在做一个智能考试系统的课程设计收尾。项目立项时定的主题是“基于SpringAI的智能考试系统”,从一开始的框架选型讨论,到后面真正把智能组卷、AI批改、学情分析这些模块跑通,前前后后花了大约六周。这篇文章不写什么宏伟蓝图&…

2026/10/20 9:37:17

Flask+Vue前后端分离:网上书店商城系统完整开发实战

网上书店的图书销售商城,几乎是每个学Python Web开发的人都会遇到的一个练手项目。前后端分离的组合很常见:Vue负责页面交互,Flask提供接口,PyCharm作为日常开发环境,数据库这边按项目规模在SQLite和MySQL之间选。它覆…

2026/10/20 9:37:17

Playwright-MCP:用自然语言让AI驱动浏览器自动化测试

说实话,这两年自动化测试圈子里最让我上头的组合,就是Playwright加MCP。Playwright-MCP这个名字第一次出现的时候,我还以为又是什么包装出来的概念玩具,结果自己花了一个下午把环境跑通之后,直接改变了我的日常工作方式…

2026/10/20 9:32:15

拆解Agent框架插件化设计:事件驱动与热插拔实战

1. 为什么我要把一个开源 Agent 框架整个拆开日常维护过几个 Agent 项目之后,我有个很深的感受:“会用 Agent”和“能驾驭 Agent”,中间隔着一整条系统的鸿沟。很多朋友跟我一样,习惯了把提示词写长一点、把工具函数丢进去、然后把…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑