初学者のためのC#

C#とは

 C#はC++からJavaになる際に追加されたガーベージコレクション(GC)や中間言語を介して共通の実行環境で実行することなどを参考にMicrosoftが開発した言語です。C#はIL(中間言語)にコンパイル後.Net Framework上で実行されます。この.Net Framewokというのは標準でWindowsにインストールされており、そのためC#とその統合開発環境のVisual Studioを使うことで簡単にWindowsアプリケーションが開発・公開ができます。また、OUCCで主に使用しているUnityというゲーム作成に使われるフレームワークで使用する言語にも採用されています。

基本的な書き方

using System; // ファイル内でほかの名前空間のものを完全修飾型名を使わずに使用できるようにする

namespace Hoge // 名前空間はこうやって宣言する。
{
    public class Program // 処理は必ずクラスの中に関数を置いて書く
    { // 波カッコで範囲を示す

        public int HogeHoge { get { return _hogeHoge; } set { _hogeHoge = value; } } // プロパティの宣言方法
        private int _hogeHoge; // フィールドの宣言方法

        public static void Main()
        {
            Console.WriteLine("Hello World"); // 1文の最後は ; (セミコロン)で終わる
            var odds = Enumerable.Range(0, 100)
                .Where(i => i % 3 == 0)
                .ToArray(); // こんな感じで複数行にわたって書くことも可能。
            /*
            複数行コメントはこうやる
            */
        }
    }
}

StructとClass

 大きく分けてStructとClassの2種類があり、したのようにいろいろ違いはあります。StructはClassよりも動作が早いのですが参照型でないためにおこる様々な問題があるためオブジェクトを自分で定義する際は何か重要な問題がない限りClassで作ることをお勧めします。

structとclassの違い

struct class
オブジェクトの型 値型 参照型
データが保存されるメモリ スタック ヒープ
継承 interfaceの実装のみ class,interfaceともに可能
コンストラクタの定義 引数ありのものだけ可能 なんでも可能
nullableか nullを入れられない nullを入れられる

structの問題点

  • スタックに保存されるのでメモリを多く占有する大きなオブジェクトを入れると逆に遅くなる。
  • 参照型でないので関数やプロパティでとってきたものを変更してももとのオブジェクトを変更できない。(classでは可能)
  • 継承ができない
  • 引数なしのコンストラクタを作れない
  • nullを入れられない

他の問題を見たい方はC#に潜むstructの罠などを参考にしてみてください。

よく使う型

この中ではstringのみがclassでそのほかはstructです。

エイリアス 実装 リテラル 説明
byte System.Byte 0(収まる範囲内のみ) 符号なし整数(8bit) 主にバイナリデータのために使われます
short System.Int16 0(収まる範囲内のみ) 整数(16bit)
int System.Int32 0(収まる範囲内のみ) 整数(32bit)
long System.Int64 0(収まる範囲内のみ) 整数(64bit)
float System.Single 0f 小数型(32bit)
double System.Double 0.0又は0d 小数型(64bit)
decimal System.Decimal 0m 小数型(128bit)
bool System.Boolean true, false 真偽値(2bit)
char System.Char 'j' (シングルクォーテーションで囲む) UTF-16の文字(16bit)
string System.String "java" (ダブルクォーテーションで囲む) UTF-16の可変長文字列

使用例

int x = 1;
var x = 1; // varキーワードを使えば自動的に型を推測してくれる
System.Int32 x = 1; // こう書くこともできるが普通はしない

詳細(Microsoft公式ページ)

配列

C#で配列はclassであり、大きさは定義時に決定されます。書き方は以下の通りです。

int[] arr = new int[5]; //大きさ5の配列
string[] arr = new string[] { "a", "b", "c", "d", "e" }; //このように書いて初期化することも可能です。

var temp = arr[0]; //このように書くことで配列の要素にアクセスできます。

多次元配列

int[,] int[,,]のように書くことで多次元配列を作れます。たとえばint[3,4]とすると3×4多次元配列になります。

ジャグ配列

int[][]のように書くことでジャグ配列(ギザギザ配列)を作れます。これは配列の配列となっているので内側の配列の要素の数はそれぞれ違っても構いません。

演算子

定番の+ - * / %(余り)はありますが、pythonにはある累乗の**はありません。また、静的型付け言語なので以下のような整数同士の割り算は小数点以下が切り捨てられます。どちらかをdoubleにキャストしましょう。

int a = 10;
int b = 3;
int result = a / b; // 3
double result = (double) a / b // 3.333...

また、自分自身に+ - * / %を行う+= -= *= /= %=や、自分自身に1だけ足したりひいたりする++ -- などもあります。

int i = 0;
i += 1;    //これは
i = i + 1; //これと同等

i++;       //これは
i = i + 1; //これと同等

比較演算子として< <= > >= == !=があります。これらは前後のオブジェクトを比較して真偽値(bool)を返します。<= >=は数学における≦ ≧に相当し、== !=は数学における= ≠に相当します。また、&& ||はそれぞれ真偽値における論理積・論理和をあらわし、!は真偽値の直前につけることで真偽値を反転させることができます。

※論理積 二つともがtrueのときtrueを返す
※論理和 二つのうち一方がtrueのときtrueを返す。

ifとかforとか

条件分岐

C言語と違い条件式に指定できるのは真偽値だけです。ifステートメントとswitchステートメントが実装されており、詳しくはMicrosoft公式に書いてあります。

int x = 10;
if(x < 0)
{
  //ここに処理を書く
}
else if (x < 10) { /* else ifを使うことでいくつものパターンに対応できる */ }
else
  return 0; // 終わるときはelseで終わる。1文で終わるなら 波カッコ{} は不要

switch(x) //たくさんの条件で分岐したいときに使う
{
    case 10: // xが10の時の処理
        break;
    case 20: // xが20の時の処理
        break;
    default: // xが上のすべてと異なったときの処理
        break;
}

繰り返し

C#には繰り返しの処理としてforステートメント, foreachステートメント, whileステートメント, do-whileステートメントが実装されています。Microsoft公式を見るとここより詳しい情報を得られます。

for(var i = 0; i < 100; i++) // (初期化処理 ; 終了条件 ; ループが終わるごとに実行される)
{
    // 処理を書く
}

var arr = new int[]{ 0, 1, 2, 3, 4 };
foreach(var item in arr) //コレクションのループ
{
    item++;
}
foreach((var item, var i) in arr.Select((num, index) => (num, index))) //インデックス付きのコレクションのループ
{
    item += i;
}

while(true)
{
   // 条件を満たす間繰り返す。
}
do
{
  // 最初の一回実行され後条件を満たす間繰り返す。
}while(true)

デリゲート

C#では関数オブジェクトを格納するものとしてdelegateというもがあり、下のように定義し、使うことが可能です。

public delegate string Hoge(int x);//引数がint型 返り値がstring型の関数型Hoge

public class Program
{
  public static void Main()
  {
    Hoge func = new Hoge(Foo); //クラスをインスタンス化するときみたいにかける。
    Hoge func = Foo; //こうもかける。
  }

  public static string Foo(int x)
  {
    return x.ToString();
  }
}

このように定義できますが、実際はFuncActionを使うことが多いです。この2つはジェネリクスを用いて(厳密には違いますが)下のように定義されており、どんな型でもその場で指定して入れることができるので大変便利です。

public delegate void Action<T1>(T1 arg); //Actionは返り値がvoid
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2); //Funcは返り値がTResult(最後の型)

//使い方
public class Program
{
  public static void Main()
  {
    Func<int,int,int,string> func = Foo; //こんな感じで書けます。
  }

  public static string Foo(int x, int y, int z)
  {
    return x.ToString();
  }
}

コレクション

コレクションはデータをまとめて扱うためのクラスでジェネリクスなしのものはSystem.Collection名前空間に、ジェネリクスありのものはSystem.Collection.Generics名前空間にあります。代表的なコレクションはリストと辞書型があります。

リスト

リストは可変長配列のようなもので、配列とは違い検索メソッドやソートメソッドが実装されてたりします。

var arr = new List<int>();
arr.Add(3); //Addで追加
var temp = arr[0]; //これで中身を見る
arr.Remove(3); //引数と最初に一致したものを削除

詳細はMicrosoft公式で確認してください。

辞書型

辞書型はキーと値をセットで保持することができるコレクションです。

var dic = new Dictionary<string, string>();
dic.Add("key", "value"); //Addで追加
var temp = dic["key"]; //これで取得
dic.Remove("key"); //引数と一致したキーを持つ値を削除

詳細はMicrosoft公式で確認してください。

プロパティ

プロパティはclassやstructのメソッドをあたかもフィールドであるかのように扱う機能です。

public class Hoge
{
    public int Number
    {
        get
        {
            return _number;
        }
        private set // アクセス修飾子を片方だけ変えることが可能
        {
            if(value < 0) // 入ってきた値は valueキーワード に格納されている
                value = 0;
            _number = value;
        }
    }
    private _number;

    public int Id { get; private set; }  // getとsetだけ書いて中身は書かないとコンパイル時に
    public int Id { get{ return _id; } set{ _id = value; } }  // これみたいに展開される
    private int _id;

    public void HogeHoge()
    {
        Number = 10; //setプロパティが呼ばれる
    }
}

フィールドではなくプロパティで実装することのメリットはset時に制約をつけたりget時にnullの場合などで条件分岐したりできることがあります。また、interfaceにはフィールドは定義できないですがプロパティは実際は関数なので定義できます。

名前空間

C#ではコードを名前空間で分割することができす。下のようにクラスやメソッドと同じように宣言することができます。名前空間では同じ名前空間にあるもの、またはusingを使って宣言したものだけが制限なく使えます。別の名前空間のものを使用する際はA.Hogeのように名前空間から指定するかusing A;という文言を書いておく必要があります。

using System;
namespace A
{
   public class Hoge
   { }
}

yield return

yield returnで値を返すことで簡単にIEnumeratorを作ることができます。returnの代わりにyield returnを使うとIEnumeratorが自動的に生成され、foreachステートメントで使用できます。

public static void Main()
{
    foreach(var i in GetEnumerator())
    {
        // 処理
    }
}

private static IEnumerator GetEnumerator()
{
    int i = 0;
    while(true)
    {
        yield return i++;
    }
}

UnityではCoroutineという機能で使わています。

継承

C#はオブジェクト指向の言語なので継承が実装されています。継承とはあるクラスから性質を受け継いだ新しいクラスことで、派生とも呼ばれています。例としては以下のようなものがあります。

class Person
{
  public string name; // 名前
  public int    age;  // 年齢
}

class Student : Person
{
  public int    id;   // 学籍番号
}

継承 - C# によるプログラミング入門 | ++C++; // 未確認飛行 Cより

時間がなかったので継承はあとで書きます。

参考させていただいたサイト

Python 講習会を開催

5/22 (土) に Python 3 の講習会をオンライン開催しました。

Python は C/C++ のような言語よりも手軽に扱えることから多くの人に好まれている言語です。また、統計処理や機械学習系のライブラリが充実しており、その分野でも広く使われています。今回の講習会では、Python が持つ基本的な機能を網羅的に解説し、AtCoder Beginners Selection で演習することで、Python を活用できるようになることを目標としました。

資料は Discord で配布していますので、今回参加できなかった方もその資料で学習可能です!

今後の予定

次は6月初めに Linux の講習会、そして 5/29 - 6/26 にチーム開発イベントを同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトで紹介していますので、こちらもご確認ください。

Git と OOP の講習会を開催

5/15 (土) に SourceTree と GitHub による Git 講習会、5/16 (日) に TypeScript を用いたオブジェクト指向プログラミング (OOP) の講習会を Discord を用いてオンラインで開催しました。

Git 講習会

Git は分散型バージョン管理システムで、近年のソフトウェア開発で頻繁に利用されるほか、複数人開発では必須ツールとなっています。仕組みが複雑で初心者にはとっつきにくいのが難点ですが、使いこなせればソフトウェア開発を力強くサポートしてくれるとても便利なツールです。今回は、初学者にも比較的扱いやすい SourceTree という GUI ソフトウェアを用いて、Git を扱うのに最低限必要な技能を身に着けることに重点を置きました。

OOP 講習会

オブジェクト指向は「関数と型の関連付け」と「抽象化」を目的としたもので、「カプセル化」「継承」「多相」が主な特徴となります。近年はソフトウェアのメンテナンス性を重視する傾向が強まってきており、そういった点で合理的な OOP が広まっています。また、この考え方を取り入れた言語も数多く存在します。しかし、これもまた初学者にはとっつきにくいものであることから、今回は入門編としてその目的や定義を紹介したのち、TypeScript を題材として実際の実装例を確認しました。

今後の予定

次は 5/22 (土) に Python、6月初めに Linux の講習会を、同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

Blender と競プロの講習会を開催

5/8 (土) に Blender による 3D モデリング、5/9 (日) に競技プログラミングの講習会を Discord 新歓サーバーを用いてオンラインで実施しました。

Blender 講習会

約 90 分間という短時間で、VRChat で使える Avatar 制作の流れを学びました。短時間制作であることからポリゴンや着色などが荒くなっていますが、それでも様々な必須技術を学ぶことができました。

競プロ講習会

阪大競技プログラミング部 RAINBOU の部長を務めるこたまねぎ(Twitter: @small_onions)氏に、特別に講習会を開いていただきました。テーマは「全探索攻略」で、バグを減らすためのマクロ定義や文字列化 bit 全探索の活用、また C++ ライブラリの活用など、競プロに最前線で取り組んでいる方による様々なノウハウやアドバイスなどはとても新鮮で、競プロをそれなりにやっている受講者にとっても新たな発見がありました。

REP マクロを使う
bit 全探索
順列全列挙
複雑なデータ構造の操作は関数化

ご協力くださったこたまねぎ氏に感謝です!今後も、同じ志を持つ別団体との交流を進めていきたいですね。

今後の予定

次は 5/15 (土) 15:00 に Git、5/9 (日) 14:00 にオブジェクト指向プログラミングの講習会を、同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

ゲーム制作と Web の講習会を行いました

昨日 4/24(土) に Unity を用いた 2D ゲーム制作の講習会、そして本日 4/25(日) に HTML/CSS/JavaScript を用いた Web サイト制作の講習会を、Discord 新歓サーバーでオンラインで行いました。今回も、資料は Discord 新歓サーバーで配布していますので今回参加できなかった方もご参加下されば参照可能です。内容に関する質問もいつでも受け付けております。

2D ゲーム制作 (Unity)

Unity での 2D ゲーム制作の基礎として、ものすごく単純なゲームを作成しました。

単純とはいっても、スクリプトの書き方や当たり判定の実装、シーンの作成や遷移、そして Unity の各種機能の使い方など、Unity 初心者が身に着けるべき内容を丁寧に説明しています。Nintendo Switch 等の有名プラットフォームでも Unity で開発されたゲームが増えてきていますが、そういったゲーム開発の裏側に触れることができる講習会となりました。

以下に講習会のスライドを抜粋して掲載します。

Web サイト制作 (HTML/CSS/JavaScript)

Web サイト制作において最も基本的な HTML/CSS/JavaScript を用いて、簡単な Web サイトを作成しました。

まずは HTML で Web サイト制作への導入を行い、CSS で背景や文字などのスタイルを変更できることを確認したのち、最後に JavaScript でインタラクティブな Web サイトを実現できることを学びました。このブログも含め、日々目にする Web サイトの仕組みに触れることができる講習会となりました。

以下に講習会のスライドを抜粋して掲載します。

今後の予定

次は 5/8 (土) に Blender、5/9 (日) に競技プログラミングの講習会を、同じく Discord 新歓サーバーで予定しています。オンラインなので緊急事態宣言などの影響を受けることはありません!興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

C/C++ の講習会を開催しました

本日 4/18(日) に C 講習会、その準備編として昨日 4/17(土) に C++ 講習会を行いました。今回参加できなかった方も、講習会資料を Discord 新歓サーバーで配布していますので、ご参加下されば参照可能です。内容に関する質問もいつでも受け付けております。

C は広く利用される非常に有名な言語で大学の講義で1年から早速学びますが、プログラミング初学者にとっては修得が難しいものとなっており、それに向けた助けとなることを目指した内容としました。

講義の予習として、また、講義が理解できなかったときの参考書代わりとして、ご活用いただければ幸いです!

LT会 in OUCC

おはようございました

Posted by OUCC 展示、3DPCゲームなどの係 (2018 10/19)

昨日、OUCCにてLT(Light Talking)会が開催されました

そして部室に朝が来ました。

どうやら隣で幼稚園児が運動会しているようです。

ここちよい朝ですね。

というわけでおやすみなさzzz

LT会 in OUCC

OUCCにてLT会が開催されました

Posted by OUCC webサーバ係 (2018 10/19)

本日、OUCCにてLT(Light Talking)会が開催されました

LT会とは?

LT会とは、複数人が各々の話したい話題を持ち寄って、その分野について短時間で語り合う会です。

OUCCではコンピュータのことはもちろん、自身の趣味のことを話している部員もいました。

具体的には、AtCoderの攻略やVRの活動報告から、好きなアニメの紹介まで様々なことが話されました!

真面目な話をする人もいれば、ネタに走るやばい人もいてLT会は大盛況でした。