ref和Out关键字可以决定方法重载

时间:2017-10-16 06:37:37

标签: c#

我有一个关于下面给出的方法重叠的问题 Fun1(int a); Fun1(ref int a);

这种方法是否重载?如果是,那么为什么,如果否,那么为什么?

2 个答案:

答案 0 :(得分:1)

根据文件:

  

当一个方法具有ref或out参数而另一个方法具有值参数

时,方法可以重载

所以问题的答案是肯定的,但为什么呢?

根据函数重载的定义:

  

函数重载(也称为方法重载)是一种编程概念,它允许程序员定义两个或多个具有相同名称和相同范围的函数。每个函数都有一个唯一的签名(或标题),它来自:

  1. 功能/程序名称
  2. 参数数量
  3. 参数'输入
  4. 参数'为了
  5. 当你在不使用ref关键字的情况下传递参数时,实际上是在传递对变量的引用,因此参数的类型与不使用ref关键字传递的参数类型不同。

        public void function(ref int abc)
        {
            Console.WriteLine("Result Ref: " + abc);
        }
    
        public void function(int abc)
        {
            Console.WriteLine("Result: " + abc);
        }
    

    因此上述两个函数的签名与传递给两者的参数类型不一样。

    希望我能用我的答案满足你:)。

    另外,我想在讨论中添加另一个观点,即在使用一个函数并使用另一个函数的情况下不能进行重载,因为在这种情况下两个类型都被认为是相同的,因此在下列情况下不会出现重载:

        public void function(ref int abc)
        {
            Console.WriteLine("Result Ref: " + abc);
        }
    
        public void function(out int abc)
        {
            abc = 1221;
            Console.WriteLine("Result Out: " + abc);
        }
    

答案 1 :(得分:0)

1) Fun1(int a); 
2) Fun1(ref int a); 

1和2是不同的功能。 1 - 按值传递,2 - 按引用传递。

例如:

    public static void Func(int i)
    {
        i++;
        Console.WriteLine("int a = {0}", i);
    }
    public static void Func(ref int i)
    {
        i++;
        Console.WriteLine("ref int a = {0}", i);
    }
    static void Main(string[] args)
    {
        int a = 9;
        Func(ref a);
        // Func(a);
        Console.WriteLine("a = {0}", a);
        Console.Read();
    }

输出:

  

ref int a = 10

     

a = 10

表示a通过引用传递,函数Func(ref int i)可以更改其值。

第二种情况,当您在Func(a)功能结果中调用Main时:

  

int a = 10

     

a = 9

这意味着a按值传递。 您可以在一个类中实现这两个函数。