函数参数默认值和指定传参

最近在编写代码时发现介绍C#参数默认值不能像PL/SQL那样直接设置default,网上也没有太多详细的资料,自己琢磨并试验后整理成果如下:

  • C#允许在函数声明部分定义默认值

  • 参数默认值设定后,调用时可以不用填写有默认值的参数

  • 参数传递顺序,顺序调用在前,指定参数调用在后

1.默认参数设置

一般函数声明

public void FuncPara(string a,string b)

设置默认值

public void FuncPara(string a="specify by default a",string b= "specify by default b")

public void FuncPara(string a="specify by default",string b= "specify by default")
{
MessageBox.Show(a +"\n"+ b+"\n");
}
private void button1_Click(object sender, EventArgs e)
{
FuncPara();
}

此时调用函数将采用默认值

messagebox出来的是:

specify by default a

specify by default b

在调用时重写默认参数

public void FuncPara(string a = "specify by default a", string b = "specify by default b")
{
MessageBox.Show(a + "\n" + b + "\n");
}
private void button1_Click(object sender, EventArgs e)
{
FuncPara( b: "specify by call");
}

此时调用函数a将采用默认值,b的值在调用时被重写了

messagebox出来的是:

specify by default a

specify by call

3.参数传递时的顺序

原则先传顺序参数值,后传指定参数,没有指定参数的传值全部是按照顺序传递的
3.1顺序调用

这是最基本的参数调用方式,根据参数顺序传参,顺序参数在编写和调用时应当放在前面

编写函数首部时,有默认值参数一旦出现,后面的参数应当全部为有默认值的参数否则编译器会报错

public void FuncPara(string c,string a="specify by default",string b= "specify by default")

调用时

FuncPara("c","a","b");
依次向参数c,a,b传值

错误写法

public void FuncPara(string a="specify by default",string c,string b= "specify by default")

3.2指定参数调用

你可以不按照顺序指定调用时的参数传值

public void FuncPara(string a="specify by default",string b= "specify by default")

只指定b,a采用默认值

FuncPara( b: "specify by call");

messagebox出来的是:

specify by default a

specify by call

也可以不按顺序:

FuncPara( b: "specify by call",a:"sdfe");

方法参数

为不具有 inrefout 的方法声明的参数会按值传递给调用的方法。 可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改后的值。 可以通过使用方法参数关键字更改此行为。

本部分介绍声明方法参数时可以使用的关键字:

  • params 指定此参数采用可变数量的参数。

  • in 指定此参数由引用传递,但只由调用方法读取。

  • ref 指定此参数由引用传递,可能由调用方法读取或写入。

  • out 指定此参数由引用传递,由调用方法写入。

params(C# 参考)

使用 params 关键字可以指定采用数目可变的参数的方法参数。 参数类型必须是一维数组。

在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。

如果 params 参数的声明类型不是一维数组,则会发生编译器错误 CS0225

使用 params 参数调用方法时,可以传入:

  • 数组元素类型的参数的逗号分隔列表。
  • 指定类型的参数的数组。
  • 无参数。 如果未发送任何参数,则 params 列表的长度为零。

in 参数修饰符(C# 参考)

in 关键字会导致按引用传递参数,但确保未修改参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 它类似于 refout 关键字,不同之处在于 in 参数无法通过调用的方法进行修改。 out 参数必须由调用的方法进行修改,这些修改在调用上下文中是可观察的,而 ref 参数是可以修改的。   在调用函数的时候in是可选的。用in声明参数的函数可以重载。更多用法请看

static void Method(in int argument)
{
// implementation removed
} Method(5); // OK, temporary variable created.
Method(5L); // CS1503: no implicit conversion from long to int
short s = 0;
Method(s); // OK, temporary int created with the value 0
Method(in s); // CS1503: cannot convert from in short to in int
int i = 42;
Method(i); // passed by readonly reference
Method(in i); // passed by readonly reference, explicitly using `in`

【C#基础概念】函数参数默认值和指定传参和方法参数的更多相关文章

  1. js定义参数默认值

    javascript可以用arguments定义参数组.   一.简单的定义参数默认值 function test1(a,b){ //如果有参数一,则返回参数一,如果没有返回默认值"这是参数 ...

  2. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  3. ES6函数参数默认值作用域的模拟原理实现与个人的一些推测

    一.函数参数默认值中模糊的独立作用域 我在ES6入门学习函数拓展这一篇博客中有记录,当函数的参数使用默认值时,参数会在初始化过程中产生一个独立的作用域,初始化完成作用域会消失:如果不使用参数默认值,不 ...

  4. 函数的默认值与动态参数arguments的总结

    在js函数与作用域,了解函数基本概念中,我们发现当函数的实参有一个没有上传的时候,对应的形参time展示的值就是undefined,如下代码所示: <!DOCTYPE html> < ...

  5. java函数参数默认值

    java函数参数默认值 今天,需要设定java函数参数的默认值,发现按照其它语言中的方法行不通 java中似乎只能通过函数的重载来实现 函数参数默认代码

  6. es6(三):es6中函数的扩展(参数默认值、rest参数、箭头函数)

    1.函数可以设置参数默认值 function test1(x,y=1){ console.log(x,y) } test1(10)//10 1 2.rest参数:形式为...变量名 function ...

  7. C++ 函数的重载和参数默认值

    函数的重载和参数默认值视频教程 函数的重载注意事项: 只会根据三项内容进行重载:参数的个数.参数的类型.参数的顺序 参数默认值: 参数的默认值可以在函数的定义中也可以在函数的声明中,但不能同时有 从第 ...

  8. ES6学习 --函数参数默认值与解构赋值默认值

    1. ES6的解构ES6中引入了解构赋值的操作,其作用是:将值从数组Array或属性从对象Object提取到不同的变量中 即分为两种情况:从数组Array中解构,以及从对象Object中解构 ①.从数 ...

  9. ES6 学习笔记之三 函数参数默认值

    定义函数时为参数指定默认值的能力,是现代动态编程语言的标配.在ES6出现之前,JavaScript是没有这种能力的,框架为了实现参数默认值,用了很多技巧. ES6 的默认参数值功能,与其他语言的语法类 ...

随机推荐

  1. java有四种访问权限

    Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有.默认.保护和公有,具体规则如下表:

  2. 新手如何入门linux,linux原来还可以这么学

    前言 在这个只有cangls和小白两人的小房间中,展开了一次关于学习方法的讨论. 小白:cangls啊,我想请教一个问题,您是如何记住那么多linux命令的. cangls:我啊,别人都看我的小电影, ...

  3. 简述BIO/NIO/AIO前世今生

    如下程序是简单实现了一个极其简单的WEB服务器,用来监听某个端口,接受客户端输入输出信息. 但这个程序有一个致命的问题就是连接会长时间阻塞 于是BIO版本出现了,改成了  一个连接 一个线程来处理请求 ...

  4. && || 区别

    command1 && command2 如果command1 成功,那么就执行command2 command1 || command2 如果command1 不成功,那么就执行co ...

  5. Nginx日志管理

    1 日志管理 1.1 Nginx日志描述 通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某个服务或server的性能瓶颈等.因此,将 ...

  6. 社交网络分析的 R 基础:(四)循环与并行

    前三章中列出的大多数示例代码都很短,并没有涉及到复杂的操作.从本章开始将会把前面介绍的数据结构组合起来,构成真正的程序.大部分程序是由条件语句和循环语句控制,R 语言中的条件语句(if-else)和 ...

  7. linux sftp

    转载请注明来源:https://www.cnblogs.com/hookjc/ sftp用法 1. 用sftp如何登录服务器 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输, ...

  8. mysql处理警告 Warning: Using a password on the command line interface can be insecure.

    vim /etc/mysql/my.cnf [mysqldump] user=user_name password=password 格式: [只用密码的命令] user=用户名 password=密 ...

  9. Serializable接口中serialVersionUID字段的作用

    序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类. 如果接收者加 ...

  10. k8s之yaml文件详解

    k8s之yaml文件详解 目录 k8s之yaml文件详解 1. k8s支持的文件格式 2. YAML语言格式 3. 查看api资源版本标签 4. 编写nginx-test.yaml资源配置清单 4.1 ...