【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. 注册登录第三方…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
