C#中的方法重载

一、方法的重载

重载的含义:

    就是在同一个作用域内,可以声明几个功能类似的同名函数。调用时根据不同的实参列表选择相应的函数。

   

    重载的特点:

    函数名相同,参数列表不同。

    参数列表不同主要表现在参数个数的数据类型不同。在调用重载的方法时系统是根据所传递参数的不同判断用的是那个方法。

   

    方法的几个版本有不同的签名(即 ,方法名相同,但参数的个数和/或类 型不同)。 为了重载方法,只 需声明同名但参数个数或类型不同的方法即可:

    class ResultDisplayer

    {

        void DisplayResult(string result)

        {

    //implementation

}

void DisplayResult(int result)

{

    //implementation

}

}

如果不能使用可选参数,就可以使用方法重载来达到此目的:

class MyClass

{

    int Dosomething(int x) // want 2nd parameter with default value 10

         {

         Dosomething(x, 10);

}

        

         Int DoSomething(int x,int y)

{

         //implementation

}

}

在任何语言中,对于方法重载,如果调用了错误的重载方法,就有可能出现运行错误。

二、构造函数的重载

构造函数的重载遵循与其他方法相同的规则。换言之,可以为构造函数提供任意多的重载,只 要它们的签名有明显的区别即可:

public MyClass()

// zeroparameter construCtor

{

// construction code

}

 pub1ic MyClass(int number) // another overload

{

// construction code

         }

三、接口不能重载

    接口的定义:一般情况下,接口只能包含方法、属性、索引器和事件的声明。不能实例化接口,它只能包含其成员的签名,接口也不能有构造函数。

接口定义也不允许包含运算符重载,这不是因为声明它们在原则上有问题,而是接口的公共定义,如果接口包含运算符重载会引起一些与其他.NET语言不兼容的问题。

四、泛型的重载方法

泛型的操作符重 把Nullable类型强制转换为T类型的操作符重载是显式定义的,因为当has Value为 false时,它会抛出一个异常。强制转换为Numable型的操作符重载定义为隐式的,因为它总是能成功地转换:

public struct Nullable

    where T:struct

{

    public nullable(T value)

    {

    this.hasValue=true;

    this.value=value;

}

private bool hasValue;

public bool HasValue

{

    get{

        if(!hasValue)

        {

    Throw new InvalidOperationException(“no value”);

}

Return value;

}

}

public static explicet operator T(Nullable value)

{

    Return value.Value;

}

public static implicit operator Nullable (T value)

{

    Return new Nullable(value);

}

       

public override string ToString()

{

    If(!Hasvalue)

Return String.Epty;

    Return this.value.ToString();

}

}

泛型方法的重载

泛型方法可以重载,为特定的类型定义规范。这也适用于带泛型参数的方法。

Foo()方法定义了两种,第一种接受一个泛型参数,第二种是专门用于int参数的;

它在编译期间, 会使用最佳匹配。

public class MethodOverloads

{

    public void Foo (T obj)

    {

        Console.WriteLine(“Foo (T obj),obj type:{0}”,obj.GetType().Name);

}

   

    public void Foo(int x)

    {

        Console.WriteLine(“Foo(int x)”);

}

   

    public void Bar(T obj)

    {

    Foo(obj);

}

}

Fooo方法现在可以通过任意参数类型来调用。占下面的示例代码给该方法传递了一个 int 和一个 string:

Static void Moain()

{

    var test=new StaticClass();

    test.Foo(66);

    test.Foo(“str”);

}

运行该程序,可以从输出中看出选择了最佳匹配的方法:

C#中的方法重载_第1张图片

你可能感兴趣的:(c#)