配列は引数としてメソッド パラメーターに渡すことができます。配列は参照型であるためメソッドで要素の値を変更できます
値型である配列化されていないintやstring等はメソッドに渡し内容を変更しても変更されません
クラスも参照型であるためクラス内の値型はすべて参照扱いとなり変更されます
struct構造体は値型であるためメソッドに渡しても構造体内の値型は変更されません
ただし、構造体内で配列を宣言している場合、その配列は参照型として扱われ変更されます
構造体内で宣言されているクラスの型は参照型として扱われ変更されます

(要考察:つまるところstruct内で配列やカスタム型を使うのは結局、参照型として扱われる為、あまり意味がない??)


class ClassTest4
   {
       public class MyClass
       {
           public int MyProperty { get; set; }
       }

       public void MethodStr(string[] str)
       {
           str[0] = "clr";
           str[1] = "clr";
           str[2] = "clr";
       }

       public void MethodInt(int[] inte)
       {
           inte[0] = 0;
           inte[1] = 0;
           inte[2] = 0;
       }

       public void MethodValue(int value)
       {
           value = 0;
       }

       public void MethodSentence(string sentence)
       {
           sentence = "clr";
       }

       public void MethodMyClass(MyClass my)
       {
           my.MyProperty = 0;
       }

       public ClassTest4()
       {
           int value = 555;
           string sentence = "Test";
           MyClass my = new MyClass() { MyProperty = 999 };
           string[] str = { "one", "two", "three", "four", "five" };
           int[] inte = { 1, 2, 3, 4, 5 };

           MethodValue(value);
           MethodSentence(sentence);
           MethodMyClass(my);
           MethodStr(str);
           MethodInt(inte);

           Console.WriteLine("{0} : {1}",value,sentence);
           Console.WriteLine("myclass.MyProperty= "+my.MyProperty);
           foreach (var item in str)
           {
               Console.WriteLine(item);
           }
           foreach (var item in inte)
           {
               Console.WriteLine(item);
           }
       }
   }
結果はこうなる
555 : Test
myclass.MyProperty= 0
clr
clr
clr
four
five
0
0
0
4
5

<構造体を関数に渡した場合の例>
注意点:構造体内で配列を扱った場合、たとえ構造体内でも参照型となり、メソッドで引数として渡した場合、その配列部分は内容の値が変更可能となる

class ClassTest5
   {
       public struct MyStruct
       {
           public string Name { get; set; }
           public int ID { get; set; }
           public int[] number;              //構造体内で配列(参照)を作成している
       }

       public void Method(MyStruct my)
       {
           my.Name = "Taro";
           my.ID = 555;
           my.number[0] = 0;
           my.number[1] = 0;
           my.number[2] = 0;
       }

       public ClassTest5()
       {
           MyStruct my = new MyStruct() { Name = "MyName", ID = 1, number = new int[]{1,2,3,4,5 } };
           Method(my);
           Console.WriteLine(my.Name +" : "+ my.ID);
           foreach (var item in my.number)
           {
               Console.WriteLine(item);
           }
       }
   }
結果はこうなる
MyName : 1
0
0
0
4
5
結果が構造体内の「配列部分」だけ変更されている点に注目
最終更新:2012年06月01日 00:45