C#でのout,ref,paramsパラメータの使用

7899 ワード

C#にはout,ref,paramsの3つの高度なパラメータがあります.
 
1、outパラメータ
  • メソッドreturnの使用 1つの値(数値またはポインタ値)しか返されません.outパラメータは、タイプにかかわらず、1つの方法で複数の値を返すのに役立ちます.
  • outパラメータを使用する場合は、次の点に注意してください.
  • メソッドを呼び出す前にoutパラメータに渡される変数は宣言するだけで、値を付与しても値を付与しなくてもよく、値を付与してもメソッドで上書きされます.
  • メソッドはoutパラメータを使用して変数を渡す場合、値を返すため、メソッド内で値を割り当てる必要があります.
  • メソッドのパラメータがoutキーワード修飾を使用する場合、このメソッドを呼び出すときも、outパラメータが伝達する変数の前にoutキーワードを付けなければならない.

  • static void Main(string[] args)
    {
      //   out            、   
      int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
      int max;
      int min;
      GetMaxMinSumAvg(nums, out  max, out min);
      Console.WriteLine(max);
      Console.WriteLine(min);
      Console.ReadKey();
    }
     
    public static void GetMaxMinSumAvg(int[] nums, out int max, out int min)
    {
      max = 0;  // out                 
      min = 0;
      if(nums.Length > 0)
      {
        for (int i =0; i < nums.Length; i++)
        {
          if (nums[i] > max)
            max = nums[i];
          if (nums[i] < min)
            min = nums[i];
        }
      }
    }
  • TryParseタイプ変換outパラメータを使用して変換結果値を返す:
  • Boolean int.TryParse(string s, out int result) //        int  ,out     result     (       result 0)  return Boolean   
       int.TryParse()  
    public static Boolean stringToInt(string s, out int result) {
      try
      {
        result = Convert.ToInt32(s);
        return true;
      }
      catch {
        result = 0;
        return false;
      }
    }

     
    2、 refパラメータ
  • ref キーワードは、outと同様に、パラメータを参照によって渡すことができます.すなわち、refは、元の数をコピーするのではなく、元の数を直接操作することができ、そのコピー項目を操作することができます.
  • refパラメータの役割:
  • はoutとは異なり、主にシーン内部で外部の値を変更する場合に適用される双方向に値を伝達することができる.すなわち、refパラメータは、初期化された変数をパラメータとして1つの方法に持ち込んで変更し、変更が完了した後、変更後の値を持ち出すことに重点を置いている.
  • refの役割は、主に値タイプやstringという特殊なタイプの参照タイプを他の参照タイプのようにメソッドで値を変更することができ、メソッドが終了した後、値を保存することができるようにすることである.

  • refパラメータを使用するには、次の点に注意してください.
  • refパラメータが伝達する変数は、伝達する前に必ず初期化されます.
  • メソッドのパラメータがrefキーワード修飾を使用する場合、このメソッドを呼び出すときもoutパラメータが渡す変数の前にrefキーワードを付けなければなりません.
  • メソッドは、refパラメータを用いて変数を伝達する場合、outとは異なり、メソッドでrefが修飾した変数を一定に付与する必要はないので、値を付与しなくてもよい.  

  • static void Main(string[] args)
    {
        int count = 5; // ref     ,       
        Add(ref count);
        Console.WriteLine(count);
        Console.ReadKey();
    }
     
    public static void Add(ref int i){
        i += 5; //       
    }

     
    3、 params可変パラメータ
  • params キーワードは、パラメータの個数が可変な場合にパラメータの配列型パラメータを採用することができる.例えば、 int sum(params int[] values).
  •  可変パラメータの役割:個数が不確定な可変パラメータを配列の形で伝達させ、方法のパラメータ個数が未知の場合に適した大量の配列集合パラメータを伝達するために使用される.
  • 可変パラメータを使用する場合は、次の点に注意してください.
  • params修飾子をrefおよびout修飾子と組み合わせて使用することは許されない.
  • メソッドのパラメータリストに複数のパラメータがある場合、params修飾パラメータは最後に置かなければならない.プログラムがパラメータがどれだけあるかを判断してエラーを報告しないように、前に置くことはできない.例: 
    int Sum(int initial, params int[] arr)
  • の1つの方法は、当然、可変パラメータと不変パラメータを含み、2つは同時に使用することができる.

  • public static int Sum(int initial, params int[] arr){  
        int sum = initial;
        for(int i = 0; i < arr.Length; i++)
            sum+=arr[i];
        }
        return sum;
    }