【C# Programming】编程入门:方法和参数
一、方法
1、方法的定义
由一系列以执行特定的操作或计算结果语句组成。方法总是和类关联,类型将相关的方法分为一组。
- 方法名称
- 形参和实参(parameter & argument)
- 返回值
2、命名空间
一种分类机制,用于组合功能相关的所有类型。命名空间是分级的,级数可以是任意。 命名空间层级一般从公司名开始,然后是产品名,最后是功能领域,例如:
- Microsoft.Win32.Networking
主要用于按照功能领域组织,以便更容易查找和理解它们。除此之外,命名空间还有助于防止类型名称发生冲突.
3、作用域
- 可以通过非限定名称引用到的区域
- 对于某个类型中一个方法的调用,如果这个方法在类型中声明,那么对该方法的调用不需要使用类型限定符; 类似的,一个类型对声明了它的整个命名空间也都在作用域内。
二、表达式
1、表达式主题成员
表达式主体成员提供了一种更简洁、更可读的成员实现
Member | Supported as of... |
Method | C# 6 |
Constructor | C# 7 |
Finalizer | C# 7 |
Property Get | C# 6 |
Property Set | C# 7 |
Indexer | C# 7 |
语法:member => expression
2、表达式主体方法
表达式主体方法使用箭头操作符 (=>) 将单个表达式分配到一个属性或方法来替代语句体 ,如果方法有返回值, 该表达式返回值必须与方法返回类型相同;如果方法无返回值,则表达式执行一系列操作。
public class Person
{ public Person(string firstName, string lastName) { fname = firstName; lname = lastName; }private string fname; private string lname; public override string ToString() => $"{fname} {lname}".Trim();public void DisplayName() => Console.WriteLine(ToString());}
三、方法声明
C# 不支持全局方法,所有方法都必须在某个类型中。
public class Program
{public static void ChapterMain(){string firstName, lastName, fullName, initials;System.Console.WriteLine("Hey you!");firstName = GetUserInput("Enter your first name: ");lastName = GetUserInput("Enter your last name: ");fullName = GetFullName(firstName, lastName);initials = GetInitials(firstName, lastName);DisplayGreeting(fullName, initials);}static string GetUserInput(string prompt){System.Console.Write(prompt);return System.Console.ReadLine();}static string GetFullName( string firstName, string lastName) => $"{ firstName } { lastName }";static void DisplayGreeting(string fullName, string initials){System.Console.WriteLine($"Hello { fullName }! Your initials are { initials }");}static string GetInitials(string firstName, string lastName){return $"{ firstName[0] }. { lastName[0] }.";}
}
四、Main() 的返回值和参数
C# 支持在执行程序时提供命令行参数,并运行从Main() 方法返回状态标识符,当需要从非Main()方法中访问命令行参数时, 可用System.Environment.GetcommandLineArgs() 方法:
public static int Main(string[] args)
{int result;string targetFileName, string url;switch(args.Length){default:Console.WriteLine("ERROR: You must specify the "+ "URL and the file name"); // Exactly two arguments must be specified; give an error.targetFileName = null;url = null;break;case 2:url = args[0];targetFileName = args[1];break;}if(targetFileName != null && url != null){using (HttpClient httpClient = new HttpClient())using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url))using (HttpResponseMessage message = httpClient.SendAsync(request).Result)using (Stream contentStream = message.Content.ReadAsStreamAsync().Result)using (FileStream fileStream = new FileStream(targetFileName, FileMode.Create, FileAccess.Write, FileShare.None)){contentStream.CopyToAsync(fileStream);}return 0;}Console.WriteLine("Usage: Downloader.exe <URL> <TargetFileName>");return 1;
}
五、方法的参数
1、值参数
C# 中,参数传递默认是值传递的, 也就是说,参数表达式的值会复制到目标参数中。
- 对于值类型参数,方法获得是值的副本,所以方法内无法改变实参的值
- 对于引用类型参数,方法获得的是引用(地址)的副本,方法可以改变引用对象的值
public static void ChapterMain()
{string fullName;string driveLetter = "C:";string folderPath = "Data";string fileName = "index.html";fullName = Combine(driveLetter, folderPath, fileName);Console.WriteLine(fullName);
}
static string Combine(string driveLetter, string folderPath, string fileName)
{string path;path = string.Format("{1}{0}{2}{0}{3}", System.IO.Path.DirectorySeparatorChar, driveLetter, folderPath, fileName);return path;
}
2、引用参数(ref)
- ref 关键字表明参数是通过引用传递而不是值传递。无论实参是值类型还是引用类型,都可以通过引用传递
- 如果方法定义使用了ref 关键字,调用方法时实参前必须显式使用ref 限定
- 使用ref 限定的实参必须在调用前初始化
- 对于值类型参数,引用传递使得方法 可以改变实参的值
class RefExample
{ static void Method(ref int i){ i = i + 44;} static void Main() { int val = 1; Method(ref val); Console.WriteLine(val); // Output: 45 }
}
- 对于引用类型参数,引用传递使得方法不仅可以改变引用对象的值,也可以更换引用参数引用的对象
class RefExample2
{static void Main(){Product item = new Product("Fasteners", 54321);// Declare an instance of Product and display its initial values.System.Console.WriteLine("Original values in Main. Name: {0}, ID: {1}\n", item.ItemName, item.ItemID);ChangeByReference(ref item); // Pass the product instance to ChangeByReference.System.Console.WriteLine("Back in Main. Name: {0}, ID: {1}\n", item.ItemName, item.ItemID);}static void ChangeByReference(ref Product itemRef){// Change the address that is stored in the itemRef parameter. itemRef = new Product("Stapler", 99999);itemRef.ItemID = 12345;}
}
class Product
{public Product(string name, int newID){ItemName = name;ItemID = newID;}public string ItemName { get; set; }public int ItemID { get; set; }
}
3、out参数
- 类似ref,out也表明参数是通过引用传递而不是值传递; 方法定义时形参指定了out,调用时实参也必须使用out 显式指定
- out 和ref 区别如下:
- 使用out限定的实参不必在调用前初始化
- 方法在返回前必须对所有out参数赋值,编译器会检查所有返回路径确保所有的out 参数被赋值
- out 常用于需要从方法返回多个值的场合
class OutReturnExample
{static void Method(out int i, out string s1, out string s2){i = 44;s1 = "I've been returned";s2 = null;}static void Main(){int value;string str1, str2;Method(out value, out str1, out str2);}
}
4、参数数组(param)
通过在方法参数前显式指定 param, C# 允许在调用方法时提供可变数量参数
- 参数数组不一定是方法的唯一参数,但必须是方法最后一个参数
- 实参的类型必须兼容与参数数组中元素的类型
- 调用者既可以传递以逗号分隔的参数,也可以显式使用数组
- 调用者可以指定和参数数组对应的零个实参
public static void ChapterMain()
{string fullName;fullName = Combine(Directory.GetCurrentDirectory(), "bin", "config", "index.html"); // Call Combine() with four parametersConsole.WriteLine(fullName);fullName = Combine(Directory.GetParent(Directory.GetCurrentDirectory()).FullName, "Temp", "index.html"); // Call Combine() with only three parametersConsole.WriteLine(fullName);fullName = Combine( new string[] {$"C:{Path.DirectorySeparatorChar}", "Data", "HomeDir", "index.html" }); // Call Combine() with an arrayConsole.WriteLine(fullName);
}
static string Combine(params string[] paths)
{string result = string.Empty;foreach (string path in paths)result = System.IO.Path.Combine(result, path);return result;
}
5、命名参数(named argument)
调用者显式地为一个参数赋值
- 调用者能以任何次序指定参数
- 当命名参数和常规方法混合使用时,命名参数必须在所有常规参数传递之后
static void Main(string[] args)
{PrintOrderDetails("Gift Shop", 31, "Red Mug"); // The method can be called in the normal way, by using positional arguments.// Named arguments can be supplied for the parameters in any order.PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);// Named arguments mixed with positional arguments are valid as long as they are used in their correct position.PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");// However, mixed arguments are invalid if used out-of-order. The following statements will cause a compiler error.// PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");// PrintOrderDetails(31, sellerName: "Gift Shop", "Red Mug");// PrintOrderDetails(31, "Red Mug", sellerName: "Gift Shop");
}
static void PrintOrderDetails(string sellerName, int orderNum, string productName)
{if (string.IsNullOrWhiteSpace(sellerName))throw new ArgumentException(message: "Seller name cannot be null or empty.", paramName: nameof(sellerName));Console.WriteLine($"Seller: {sellerName}, Order #: {orderNum}, Product: {productName}");
}
6、可选参数(optional arguments)
- 方法定义时可指定参数是否可选。方法调用时必须提供所有非可选参数,允许忽略可选参数。
- 每个可选参数都必须有缺省值,缺省值为以下类型之一
- 常量表达式
- 形如 new valType 的表达式; valType 为值类型,比如:struct 和 enum
- 形如 default(valType) 的表达式; valType为值类型
- 可选参数类型必须在所有非可选参数之后定义。
- 方法调用时,如果为某一可选参数提供了值,该参数之前的所有可选参数都必须指定值;但是使用命名参数可以忽略该规则
可选参数例子:
static void Main(string[] args)
{// Instance anExample does not send an argument for the constructor‘s optional parameter.ExampleClass anExample = new ExampleClass();anExample.ExampleMethod(1, "One", 1);anExample.ExampleMethod(2, "Two");anExample.ExampleMethod(3);// Instance anotherExample sends an argument for the constructor‘s optional parameter.ExampleClass anotherExample = new ExampleClass("Provided name");anotherExample.ExampleMethod(1, "One", 1);anotherExample.ExampleMethod(2, "Two");anotherExample.ExampleMethod(3);// You cannot leave a gap in the provided arguments.//anExample.ExampleMethod(3, ,4);//anExample.ExampleMethod(3, 4);// You can use a named parameter to make the previous statement work.anExample.ExampleMethod(3, optionalint: 4);
}
class ExampleClass
{private string _name;public ExampleClass(string name = "Default name"){_name = name;}public void ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10){Console.WriteLine("{0}: {1}, {2}, and {3}.", _name, required, optionalstr, optionalint);}
}
六、方法重载
类似于C++, C# 也支持方法重载。C# 根据参数类型和参数个数选择最匹配的方法
命名参数和可选参数影响重载规则
- 如果方法每个参数或者是可选的,或按名称或位置恰好对一个实参,且该实参可转换为参数的类型,则方法成为候选项。
- 如果找到多个候选项,则首选转换的重载规则应用于显式指定的实参。忽略调用者没有提供实参的所有可选参数 。
- 如果两个候选项不相上下,优先选择没有使用缺省值的可选参数的候选项。 这是重载决策中优先选择参数较少的候选项规则产生 的结果。
相关文章:

【C# Programming】编程入门:方法和参数
一、方法 1、方法的定义 由一系列以执行特定的操作或计算结果语句组成。方法总是和类关联,类型将相关的方法分为一组。 方法名称 形参和实参(parameter & argument)返回值 2、命名空间 一种分类机制,用于组合功能相关的所有类型。命名空间是分级…...

【报错】 Cannot create property ‘showColumn‘ on number ‘-1‘
1、报错原因: 代码如下: 报错是因为:this.findObject(this.option.column, "thirdId")是一个number ,没有.showColumn属性 2、修改代码 将其变成object属性就行了...

C++容器string的运用和注意
介绍 首先,先说明,string在C的string头文件中定义,而在C语言中的字符串就是字符数组,在C中,string容器相当于C语言中的字符数组,string比C语言中的字符数组更为好用,如:C中cin/cout可…...

用对工具,你的全渠道电子商务业务就成功了一半
希望将全渠道电子商务纳入您的业务战略,但不确定从哪里开始?我们为您提供保障。这篇文章将指导您了解全渠道商务的基础知识,以及它与多渠道方法的区别,还将探讨利用全渠道方法的众多好处,并讨论企业如何通过全渠道客户…...

TDengine学习(1):采集量(Metric),标签(label),数据采集点,表,超级表,子表、库
因为TDengine是面向物联网诞生的一种数据库,所以在一些概念的命名上有一点相应的特色。 一、数据采集点 比如需要对一辆高铁上的各种信息进行采集,采集信息存入数据库中。我们可以对高铁车厢内的一些数据进行采集,比如:车厢内温…...

【洛谷 P1029】[NOIP2001 普及组] 最大公约数和最小公倍数问题 题解(辗转相除法)
[NOIP2001 普及组] 最大公约数和最小公倍数问题 题目描述 输入两个正整数 x 0 , y 0 x_0, y_0 x0,y0,求出满足下列条件的 P , Q P, Q P,Q 的个数: P , Q P,Q P,Q 是正整数。 要求 P , Q P, Q P,Q 以 x 0 x_0 x0 为最大公约数,以…...

Golang 中的 errors 包详解:返回自定义 error 类型
之前的文章《Golang 中的 errors 包详解》详细讲解了 errors 包的主要类型和函数,以及它们的使用方法。本文结合之前讲解的知识,来讲解一下根据自己或团队的项目要求如何返回自定义的 error 类型。 为什么需要自定义 error 类型? 在日常开发…...

C#开发的OpenRA游戏之信标按钮
前面已经分析了两个按钮:变卖和维修,接着下来就是分析信标按钮,这个按钮使用是比较少,但是对于多人游戏时,使用这个信号就很方便同盟军过来查看和帮助了,相当于一个朋友之间共同查看的地址。当你经过同盟标记的标志时,就会听到beacon detected,检测到信标,这就是你的盟…...

16字节协议的串口通信
1.协议要求 协议为帧传输,一共16字节。主要是2字节的固定帧头 EB 90,2字节的帧计数(用来计数发出的帧),10字节的数据和2字节的校验位 帧头:2字节,固定值 8’HEB、8’H90 帧计数:2字节,用来说明发出去帧是…...

升哲科技城市级“算力+数字底座”服务亮相2023服贸会
9月2日至6日,以“开放引领发展,合作共赢未来”为主题的2023年中国国际服务贸易交易会在北京隆重举办。作为城市级数据服务商,升哲科技(SENSORO)连续第四年参加服贸会,携城市级“算力数字底座”服务及在城市…...

动态规划之简单多状态
简单多状态 1. 按摩师(easy)2. 打家劫舍II (medium)3. 删除并获得点数(medium)4. 买卖股票的最佳时机含冷冻期(medium)5. 买卖股票的最佳时机III(hard) 1. 按…...

跨数据中心Multi-Fabric解决方案:L2和L3网络的高效连接和扩展
云数据中心里,为什么需要DCI互通? 云化数据中心,网络资源通过虚拟化技术形成资源池,实现业务与物理网络解耦,通过网络虚拟化,物理网络资源可以被分成多个虚拟网络资源,从而提高网络资源的使用效…...

upload-labs靶场通关详解
文章目录 Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16Pass-17Pass-18Pass-19Pass-20方法一(文件夹名欺骗绕过)方法二(%00截断攻击) Pass-21 Pass-01 绕过…...

Leetcode刷题笔记--Hot41-50
1--二叉树的层序遍历(102) 主要思路: 经典广度优先搜索,基于队列; 对于本题需要将同一层的节点放在一个数组中,因此遍历的时候需要用一个变量 nums 来记录当前层的节点数,即 nums 等于队列元素的…...

「MySQL-02」数据库的操纵、备份、还原和编码规则
目录 一、库操作 1. 创建数据库 2. 查看所有数据库 3. 删除数据库 4. 修改数据库 5. 进入一个数据库 二、查看和设置数据库的编码规则 1. MySQL的两个编码规则:字符集和校验规则 2. 查看MySQL当前使用的字符集以及校验规则 3. 查看MySQL支持的所有字符集 4. 查看MyS…...

Effective C++条款24——若所有参数皆需类型转换,请为此采用non-member涵数(设计与声明)
我在导读中提过,令classes支持隐式类型转换通常是个糟糕的主意。当然这条规则有其例外,最常见的例外是在建立数值类型时。假设你设计一个class用来表现有理数,允许整数“隐式转换”为有理数似乎颇为合理。的确,它并不比C内置从int…...

决策工具箱:战略分析必备工具与框架
跟随时代的步伐,企业战略也在不断演化。无论是初创企业还是知名企业,都需要有效的战略工具来指导其业务发展。探索这些必备工具,并学习如何最大限度地利用它们,是企业的一个学习目标。 战略分析工具和框架有很多,其中…...

【压力测试指南】没有任何文档,小白也可以做的压力测试
前言 一般在执行压力测试之前,会由开发提供出接口文档,包含一些接口的详细参数,便于测试工程师编写测试脚本。但在某些情况下,接口等相关文档缺失,那作为Tester,我们该如何顺利的实施压力测试呢࿱…...

Linux: memory: memblock: debug
文章目录 代码memblock=debug实例log代码 将内存相关的一些日志打开: static int __init early_memblock(char *p) {if (p && strstr(p, "debug")...

搬家快递服务小程序的便利性
在当今快节奏的生活中,搬家可能是很多人都需要面对的问题。无论是新房子还是新办公室,都需要高效、便捷的搬家服务。本文将介绍如何使用第三方小程序制作平台,如乔拓云平台,开发一款高效便捷的搬家服务小程序。 1. 注册登录第三方…...

软件架构师 Debugging
软件架构师 Debugging 目录概述需求: 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survi…...

7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)
C自学精简教程 目录(必读) 作业目标: 这个作业中,你需要综合运用之前文章中的知识,来解决一个相对完整的应用程序。 作业描述: 1 在这个作业中你需要在文本文件中存储学生通讯录的信息,并在程序启动的时候加载这些…...

学习使用php判断阿里云oss图片单图或批量上传、查询图片文件是否存在
学习使用php判断阿里云oss图片单图或批量上传、查询图片文件是否存在 doesObjectExist doesObjectExist 主要函数doesObjectExist /*** Base64上传文件* param string|array $images* param string $model_path* param string $model_type* param string $upload_path* param…...

重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!
引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face! Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型,有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数…...

Linux命令行
目录 CLI GUI 命令行界面 图形界面 命令行提示符 # $ 编辑 命令一般由三个部分组成 历史命令,使用上下键,或者使用history,ctrlr搜索历史命令 通配符 *,? 切换用户 su 作业管理 &,jobs,bg,fg CLI GUI 命令行界面 …...

[持续更新]计算机经典面试题基础篇Day1
[通用]计算机经典面试题基础篇Day1 1、jvm的组成 类加载器(Class Loader):负责将编译后的Java类加载到JVM中,并在运行时动态加载所需的类。运行时数据区(Runtime Data Area):是JVM的内存管理区…...

ProcessWindowFunction 结合自定义触发器的陷阱
背景: flink中常见的需求如下:统计某个页面一天内的点击率,每10秒输出一次,我们如果采用ProcessWindowFunction 结合自定义触发器如何实现呢?如果这样实现问题是什么呢? ProcessWindowFunction 结合自定义触发器实现…...

什么是jvm
一、初识JVM(虚拟机) JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Jav…...

kettle通过java步骤获取汉字首拼
kettle通过java步骤获取汉字首拼 用途描述 一组数据,需要获取汉字首拼后,输出; 实现效果 添加jar包 pinyin4j-2.5.0.jar 自定义常量数据 Java代码 完整代码: import net.sourceforge.pinyin4j.PinyinHelper; import net.sou…...

Conformer: Local Features Coupling Global Representationsfor Visual Recognition
论文链接:https://arxiv.org/abs/2105.03889 代码链接:https://github.com/pengzhiliang/Conformer 参考博文:Conformer论文以及代码解析(上)_conformer代码_从现在开始壹并超的博客-CSDN博客 摘要 在卷积神经网络…...