2016-09-22 9 views
-1

私はメソッドを勉強していましたが、私は "ref"メソッドを見つけました。しかし、両方のコードは、同じことを達成するように見える:refパラメータと戻り値(メソッド)の違いは

class Program 
{ 
    static void Main(string[] args) 
    { 
     int number; 

     number = 5; 
     Console.WriteLine("Before method number= {0}", number); 

     AddThree (ref number); 

     Console.WriteLine("After method number={0}", number); 
     Console.ReadLine(); 

    } 

    private static void AddThree(ref int lol) //carbon copy....so int number= 5 here 
    { 
     lol = 3; 
     Console.WriteLine("inside method number={0}", lol); 


    } 


} 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 

     int number; 
     int print; 


     number = 5; 
     Console.WriteLine("Before method number= {0}", number); 

     print =AddThree(number); 

     Console.WriteLine("After method number={0}", print); 
     Console.ReadLine(); 

    } 

    private static int AddThree(int lol) //carbon copy....so int number= 5 here 
    { 
     lol = 3; 
     Console.WriteLine("inside method number={0}", lol); 
     return lol; 


    } 


} 

} 

-

REFパラメータは、戻り値を超えているという利点がありますか?個人的には大きな違いはありません。

答えて

6

refパラメータには戻り値があるという利点はありますか?個人的に私は大きな違いは見えません。

まあ通常refはすでにありますとき、何か他のものが返されて使用されている - 例えばint.TryParse(これはoutを使用しますが、これは似ています)。

  • outパラメータ
  • refパラメータC#でより一般的である可能性が高い複合値を(返す
  • :あなたは方法の2つの出力をしたい場合は、の選択肢を持っているので、C#が唯一、単一の値を返すことができますValueTuple付き7)

しかし、他の違いがあります - 重要なのは、refパラメータへの変更は、TEですぐ表示されます元の変数を変更するrms。それはあなたが同じ変数をエイリアシング2つのrefのパラメータがある場合、最も簡単に実証されています:

using System; 

class Test 
{ 
    static void Main() 
    { 
     int x = 0; 
     RefTwo(ref x, ref x); 
    } 

    static void RefTwo(ref int a, ref int b) 
    { 
     Console.WriteLine(a); // 0 
     b = 5; 
     Console.WriteLine(a); // 5! 
    } 
} 

ああ、あなたは「戻り」の値に部分的な方法をしたい場合は少し風変わりとして、あなたは基本的にはrefパラメータを必要とします部分的なメソッドはvoidでなければなりません。

非常に明確な利点がない限り、私は一般にrefのパラメータを避けます。彼らは私の見解では、相互作用をより複雑にしています。

+0

私はちょうど参照よりも値のメソッドを返す必要がありますか?返信方法は私にとってもっと論理的だと思われる –

+0

その2つの部分が私を笑わせてくれました。 – CSharpie

関連する問題