```

    class HogeClass
    
      # クラス変数 = 配列型
      @@class_variable = []
    
      # インスタンス変数 = 連想配列型
      @instance_variable = {}
    
      # コンストラクタ
      def initialize(name)
        @name = name
      end
    
      # インスタンスメソッド
      def instance_method_name(argument)
        # クラスメソッドの呼び出し
        class_method_name();
    
        # クラス変数へ値を追加
        @@class_variable << arg
    
        # クラス変数を参照して出力
        p @@class_variable
    
        # インスタンス変数を参照して出力
        p @instance_variable
    
      end
    
      # クラスメソッド
      def self.class_method_name
      end
    
      private
    
      # プライベートメソッド
      def private_method_name
      end
    
    end
    
```

頑張って書いてみようとしたのですが、  
クラス変数やインスタンス園数などがわからず、  
その他も自身がありません。

```

    public class HogeClass {
    
      public void instance_method(argument){
    
      }
    
      private void private_method_name(){
    
      }
    
    }
    
```

`void`はrubyの`def`と同じと考えてよいのでしょうか・・・・。

そのままC#で書く場合や、C#らしい書き方ではこうするなどありましたら教えて下さい。

よろしくお願いします。
CC BY-SA 3.0
2016-01-07T01:25:05.243
20686
2016-01-07T08:47:06.167
9149
question
ruby c#
このRubyコードをC#で書くとどうなりますか?
まずファイルの先頭に使用する名前空間を記述します。

```

    // Console用
    using System;
    
    // ArrayListおよびHashtable用
    using System.Collections;
    
    class HogeClass
    {
    
```

* * *

フィールドは **アクセス修飾子** ＋ **型名** ＋ **フィールド名**
で宣言し、必要な場合は初期値を設定します。クラス変数の場合、修飾子は`static`です。  
なおC#の配列は固定長なので、移植のために任意の型を受け付ける可変長リストの`ArrayList`を使用します。なお型が限定できる場合はジェネリック型の`List<T>`型を使用します。

```

        // @@class_variable = []
        static ArrayList class_variable = new ArrayList();
    
```

連想配列は非ジェネリックの場合`Hashtable`、ジェネリック型の場合`Dictionary<TKey, TValue>`を使用します。

```

        // @instance_variable = {}
        Hashtable instance_variable = new Hashtable();
    
```

* * *

コンストラクタは **アクセス修飾子** ＋ **型名** ＋ **引数**
で宣言します。フィールド`name`や、引数`name`の型(`string`?)も明示的に指定してください。

```

        // # コンストラクタ
        // def initialize(name)
        //   @name = name
        // end
    
        string name;
        public HogeClass(string name)
        {
            this.name = name;
        }
    
```

* * *
```

        //  def instance_method_name(argument)
        public void instance_method(object argument)
        {
            // # クラスメソッドの呼び出し
            class_method_name();
    
```

リストへの追加は`Add`メソッドを使用します。

```

            // # クラス変数へ値を追加
            // @@class_variable << arg
            class_variable.Add(argument);
    
```

コンソール出力は`Console.WriteLine`などで行えますが、表示内容はRubyと異なりますので、`foreach`や`string.Join`等を使用しないと希望の出力にならないかもしれません。

```

            // # クラス変数を参照して出力
            // p @@class_variable
            Console.WriteLine(class_variable);
    
            // # インスタンス変数を参照して出力
            // p @instance_variable
            Console.WriteLine(instance_variable);
    
        // end
        }
    
```

* * *

その他のシグネチャですが、C#では`public`/`private`等の修飾子をメンバー毎に指定する必要があるので注意してください。なおアクセス修飾子を省略すると`private`扱いになります。

```

        // # クラスメソッド
        // def self.class_method_name
        // end
        public static void class_method_name()
        {
        }
    
        // private
    
        // # プライベートメソッド
        // def private_method_name
        // end
        private void private_method_name()
        {
        }
    }
    
```

## voidの意味

質問中にある`void`についてですが、これは戻り値の型です。C#のメソッド定義はメソッド名の前にメソッドが戻す値の型を明示する必要があります。

```

    public int IntegerMethod()
    {
        return 1234;
    }
    
    static string TextMethod()
    {
        return "1234";
    }
    
```

戻り値の特殊な事例として、メソッドが値を返さない場合に使用するのが`void`キーワードです。  
C#では上記のように **型名** ＋ **メソッド名** ＋ **引数**
という宣言があった場合にメソッドと認識されるため、Rubyの`def`に直接相当するキーワードはありません。
CC BY-SA 3.0
2016-01-07T02:02:59.300
20691
2016-01-07T08:47:06.167
2016-01-07T08:47:06.167
5750
5750
20686
answer
１：１対応する完全な変換はpgrhoさんが書かれているのでそれ以外を。

名前は自由につけることができますが、[名前に関するガイドライン](https://msdn.microsoft.com/ja-
jp/library/ms229002\(v=vs.100\).aspx)がありますので、それに従うことをお勧めします。

またC#では全てに明示的な型指定が必要で、例えばnameは（たぶん文字列が格納されるのでしょうから）`string`型となります。配列も任意の型を格納できる[`ArrayList`](https://msdn.microsoft.com/ja-
jp/library/system.collections.arraylist\(v=vs.100\).aspx)を使用することもできますが、通常は型指定できる[`List<T>`](https://msdn.microsoft.com/ja-
jp/library/6sh2ey19\(v=vs.100\).aspx)を使用します。[`Hashtable`](https://msdn.microsoft.com/ja-
jp/library/system.collections.hashtable\(v=vs.100\).aspx)も同様に[`Dictionary<TKey,
TValue>`](https://msdn.microsoft.com/ja-
jp/library/xfhwa508\(v=vs.100\).aspx)です。

C#では`public` / `private`以外にも[アクセス修飾子](https://msdn.microsoft.com/ja-
jp/library/ms173121.aspx)が用意されているため、適切に選択するようにしてください。
CC BY-SA 3.0
2016-01-07T02:21:54.747
20692
2016-01-07T02:21:54.747
4236
20686
answer