c#方法重载,可选参数,命名参数。

其实这里没什么可说哦,c++的语法大同小异。先看一段代码。

class Program {

    public static void Test(int a) {
        Console.WriteLine("只有一个参数a=={0}", a);
    }
    public static void Test(int a, int b = 5) {
        Console.WriteLine("有两个参数a=={0},b=={1}", a, b);
    }
    static void Main() {
        Test(5);
        Console.ReadLine();
    }
}

方法重载,可选参数两种技术一起使用,很难一眼看出最终调用的是那个方法。只有在所有参数(可选参数除外)都恰好有一个实参,而且该参数具有兼容类型的情况下,才说一个调用适用于一个方法。虽然这限制了可调用方法的数量,但不足唯一性的表示方法。为了进一步区分方法,编译器只是用调用者显示标识的参数,忽略调用者没有指定的哦可选参数。所以,假如由于一个方法有可选参数,造成两个方法都适用,编译器最终稿选择的是无可选参数的方法。正如这段代码所反映的。

方法解析:

当编译器必须从一系列适用的方法中选择一个最适合某个特定调用方法的时候,会选择拥有最具体的参数类型的那个方法。假如有两个适用的方法。每个要求将实参隐式的转化为形参类型,编译器最终选择的是更具体的派生类型的那个方法的实现。

例如:

假如调用者传递的是一个int,那么接受double的方法将优先于接受object的方法,这是由于double比object更加具体,因为,有不是double的object,但是没有不是object的double,所以double更加具体。

如果有多个适用的方法,但无法从中挑出最具唯一的,编译器就会报错,指明存在二义性。

如下面的这些方法:

static void Method(object thing){};

static void Method (double thing){};

static void Method (long thing){};

static viod Method(int thing){};

调用method(42)会被解析成为int,因为存在着一个从实参类型到新参类型完全匹配的方法,如果删除该方法,那么重载解析会选择long版本,因为long比double和object更加具体的版本。

c#规范包含额外的规则来决定byte,ushort,uint,ulong和其他数值类型之间的隐士转换,但在写程序的时候,最好是使用显示转型,以方便别人理解你想调用哪个目标方法。

命名参数

class Program {
    public static void Test(int a, int b) {
        Console.WriteLine("a=={0},b={1}", a, b);
    }
    static void Main() {
        Test(b: 5, a: 3);
        Console.ReadLine();
    }
}

命名参数对于含有可选参数的方法是极大的便利。

但是牺牲了接口的灵活性,要将参数名视为API的一部分,如果API之间的版本兼容性很重要,就要避免更改参数名。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 01:42:53

c#方法重载,可选参数,命名参数。的相关文章

c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

 一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会对调用者的初始变量产生任何影响. 当方法传递的参数是引用类型是,只是将变量的引用复制到目标参数中,实参和形参的引用指向内存中的同一位置.所以,在目标方法中对形参所做的更改会影响调用者的初始变量. 二.一些特殊的方法参数 1.引用参数---ref (使值类型的变量做方法参数时也可以传引用) 一些数据类型(

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

Java知多少(22)方法重载

在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 重载是面向对象的一个基本特性. 下面看一个详细的实例. 1 public class Demo{ 2 // 一个普通的方法,不带参数 3 void test(){ 4 System.out.println("No parameters"); 5 }

好程序员训练营-Java方法重载

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 重载是面向对象的一个基

C# 方法重载

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 //////////////////////////////////////////////////// 6 // 方法重载: 7 // 1. 方法名称必须相同 8 // 2. 参数个数必须不同(如果参数个数相同,那么类型必须不同) 9 // 3. 参数类型必须不同 10 // 4. 和返回值无关 11 /

9.Java方法重载

在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 重载是面向对象的一个基本特性. 下面看一个详细的实例. public class Demo{ // 一个普通的方法,不带参数 void test(){ System.out.println("No parameters"); } // 重载上面的方法

Java笔记 —— 方法重载和方法重写

h2 { color: #4ABCDE } a { text-decoration: none !important } a:hover { color: red !important; text-decoration: underline !important } pre { border: solid 1px #CCCCCC; background-color: #F8F8F8; margin: 15px; overflow: auto; white-space: pre; font-siz

C#参数知识盘点,形/实参、值/引用传递、ref、out、in、params、可选、命名等

引言 参数,也叫参变量,是一个变量.在方法签名中随处可见,实现了不同方法间的数据传递,基本上充斥在代码的各个角落里.实参是通过方法调用传递到方法的值的名称,形参是方法期望接收的值.在方法签名或者原型中,方法名称后的括号包含方法的参数及其类型的完整列表.参数声明指定参数中存储的值的类型.大小和标识符.然而小小参数的背后其实也是有着大学问的,所以本篇博文,您可以和博主一起把C#里面各式各样的参数复习一遍.我们先简单回顾一下各种各样的参数概念,对不同类型参数的使用场景有一个了解,再慢慢深入探讨参数的传

可选参数、命名参数、.NET的特殊类型、特性

1.可选参数和命名参数    1.1可选参数        语法:            [修饰符] 返回类型 方法名(必选参数n,可选参数n)        注意:            1.必选参数可以不存在,也可以有多个:可选参数可以有1个或多个            2.可选参数必须放在必选参数之后            3.可选参数在定义时需要赋初始值            4.可选参数之间也需要使用,进行分隔            5.调用可选参数时,不能跨参数赋值    1.2命名