Re:ゼロから始めるC#

Re:ゼロから始めるC#

JavaばっかやってましたがC#を使うことになったので備忘録的に

Level1 初めてのC#2~Hello World~

お昼ご飯にとんかつ食べたらやる気出てきたので続きかきます。
これの続きです。
chankato.hatenablog.com

Form1.csファイル

すみませんこれが正しくはなんていうファイル名というかファイルの種類なのかわかりませんでした。
知っている方いたら教えてください。

前回エントリーポイントからForm1のインスタンスが生成されているのでそちらを見てみましょうというところで力尽きましたので、そこから進みます。
画面的にはこれです。f:id:chankato:20190212121051p:plain

前も言った通りここではJavafxのようにドラッグアンドドロップでボタンなどを配置できるようです。
さっそくボタンを配置したいと思います。

ボタン配置

画面右側のツールボックスからButtonを選択し、ドラッグアンドドロップで中央の画面に配置します。
f:id:chankato:20190212144719p:plainf:id:chankato:20190212144723p:plain
ほんと押して持ってくるってだけなので超簡単です。
VS陵南戦で疲れ果ててポカリの缶すら開けられない三井寿でもギリできるくらい簡単です。f:id:chankato:20190212145332j:plain

ボタンプロパティ変更

ボタンの表示名がbutton1だと味気ないので変えましょう。
どうやって変えるんだろう、と適当に操作してみました。
ボタンをダブルクリック→なんか知らんけどコードが表示されるので駄目
f:id:chankato:20190212145723p:plain
と、ここで気づいたんですけど
さっきまでいじっていたForm1.csは正しくはForm1.cs[デザイン]というファイルなんですね。
そんでこのコードが書いてあるのがForm1.cs
17行目に

private void button1_Click(object sender, EventArgs e) {

        }

とあるので、多分ここに処理を書けばボタンクリック時の処理を変えられそうです。

ちなみに12行目の

public partial class Form1 : Form {

っていうのがあんまり見たことない記述だったんですけど調べてみたら継承を表しているようでした。
Javaで言うところの

extends

ってやつですね。使い方的にはこんな感じらしいです。

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

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

エントリーポイントのところで生成していたのは
13行目の

public Form1() {
            InitializeComponent();
        }

のようですね。Initializeとかいてあるのでインスタンス生成などの初期化処理の際に呼び出すものと思われます。

ただいまはここはいじらずにとりあえずデザインのほうを変えたいと思います。
画面右側に[プロパティ]と書いてある一覧があります。
f:id:chankato:20190212150620p:plain
それの下のほうに行くとそれっぽいのがあります。
[表示]>[Text]のところを変更してみます。
f:id:chankato:20190212150850p:plain
文字が入りきらなかったのでボタンの枠を引っ張ってみたら普通に大きくなりました。

ボタン効果設定

どうやってクリック時の処理を紐づけるかわからなかったのでGoogle先生におねだりしまくって教えてもらいました。
さっきのプロパティのところの上のほうに雷マークみたいなのがあるのでそれをクリックしてください。
そうするとこんな画面が表示されます。
f:id:chankato:20190212151232p:plain
これの一番上に[アクション]ってあってその中に[Click]といういかにもなのがあるので選択してください。
んで、そこの中にある[button1_Click]ってところをダブルクリックすると、先ほどのForm1.csの画面に遷移するようです。
f:id:chankato:20190212145723p:plain
さっきも言っていた通りこのpivateメソッドの中に処理を記述すればいいと思うので書いてみます。

とりあえずはOKボタンでも表示してみますかということで調べました。

   private void button1_Click(object sender, EventArgs e) {
            DialogResult result = MessageBox.Show("Hello World!");
        }

はい、これでCtrl+Sで保管したらF5押しちゃってください。
f:id:chankato:20190212154814p:plain
んでボタン押すと
f:id:chankato:20190212154817p:plain
ほい!ようこそC#力が支配する世界へ!

今回の獲得経験値

獲得量:56
次回レベルアップまで:147
現在レベル:Level2
獲得スキル:
 ボタン配置
 ボタン表示名変更
 ボタンクリック時アクション追加
 メッセージボックス表示
解放実績:
 ようこそ新世界
  C#を使って「Hello World」を出力する

Level1 初めてのC#~Hello World~

王様「さぁ勇者よ。今こそ魔王(受注案件)を倒すのじゃ!」
勇者「しかしながら王様、私には武器(開発環境)もなければスキル(知識)もありませんゆえ…」
王様「そこにWindows環境とVisualStudioがあるじゃろ?」
勇者「(VisualStudioは俺がインストールしたけどな?)」
王様「スキルなんてのは酒場で聞くもよし(ググレカス)、戦場で経験値を稼ぐもよし(テストコード書きまくれカス)」
勇者「藤原千花ちゃんみたいな可愛い娘が嫁に来てくれないと頑張れない…」
王様「もういいから!受注しちゃったから!敵(納期)もすぐそこまで来てるから!はい、行った行った!」
勇者「それか中野さんちの5人姉妹と仲良く暮らす権利を!」
王様「ほう?ちなみに誰派?」
勇者「圧倒的よつb―」
王様「そやつを叩き出せ!どう考えても三玖しかないだろカス!衛兵!衛兵!」
勇者「みんなちがってみんないいでしょおおお」

はい、ということで。
別案件に追われていましたがこちらも少しずつやっていきたいと思います。
この間C#について少しだけ調べたんですけどまぁ101番道路のジグザグマ倒したくらいの経験値しか得られなかったので1レベからスタートしていきたいと思います。
ちなみに5等分の花嫁では四葉が一番好きですがみんな可愛すぎるのでみんな好きです。

VisualStudio

冒頭でも言ってたVisualStudioってなに?ってとこなんですが、いわゆるIDEというもので開発するのに楽な環境のことです。
JavaではEclipseIntelliJVSCodeとかがそれに該当します。
正直メモ帳に書くだけでもプログラムというのは作れるのですが、見にくいしインデントとか合わせるのだるいしいいことといえば軽いくらいです。
おとなしくIDE使いましょう。
この辺は[VisualStudio インストール]とか調べればめっちゃ出てきます。自分もそれで入れました。
あと[VisualStudio テーマ変更]とか[VisualStudio フォント変更]とかでも調べると幸せになれます。
白いと目がチカチカ(書記のチカ、書記のチカ、ラー!)するので自分は大体黒っぽいテーマを選んでます。

f:id:chankato:20190212103718j:plain
藤原書記可愛いの図

プロジェクト作成

開くと「はじめに」みたいなのが表示されるんですけどとりあえずガン無視でプロジェクト作成したいと思います。
左上のほうにある[ファイル]>[新規作成]>[プロジェクト]と選択していきます。
f:id:chankato:20190212105043p:plain
するとこんな画面が表示されると思うんですけどここでさっそくわからん殺しが来ます。
これどれ選べばええのん?

自分が今回作りたいのはGUIのアプリケーションなのでコンソールアプリとかクラスライブラリは少なくとも違うんじゃないかなと思います。
そうなると上2つのどちらかなんだけどわからんので調べてみました。

WPFアプリ

Windows Presentation Foundation (WPF) は、デスクトップ クライアント アプリケーションを作成する UI フレームワークです。~~(この後めっちゃ書いてあるけどよくわからん)」
UIフレームワークとか書いてあるので今回の目的には沿ってそうです。
もうちょい頑張れよって人のためにもう少しだけ調べたことを簡単にまとめます。

  • 画像描画がベクタ形式
  • dpiを意識しなくても良い
  • 多少高機能だが描画の癖が強く扱いにくい

なるほどね。(わかってない)
とりあえずこんな感じです。

Windowsフォームアプリケーション

Windows Formsはマイクロソフト.NET Frameworkに含まれるグラフィカルユーザーインターフェイスAPIの名称である。
結局UIのAPIなのでこれでもよさそうです。
もうちょい頑張ってまとめたのが以下です。

  • 画像描画がラスタ形式
  • dpiを意識しないと環境によって表示がおかしくなる
  • 機能的にはWPFに劣るが扱いやすい

なるほどね。(わかってない)
難しそうなのでこっち使いたいな…

結局どっち使えばいいのん?

俺も調べたけどよくわかんねぇ…けどざっくりというとこんな感じらしいです。
「使い分けのイメージとしては、ビジネスがFormsで、ゲームがWPFです。
あるいは、四角い箱に文字を入れるのが中心ならForms、 アニメーション、3DCG、タッチパネルが中心ならWPF。」
超わかりやすい!
今回はビジネスで使うものなので上から2番目のWindowsフォームアプリを選択します。
※このままOK押すともう作成されちゃうので変えたかったら名前とか変えておきましょう。
 自分はとりあえずデフォルトのままにしました。
 でも先に1個作ってたので名前が2になってます。

プロジェクト作成後

OK押すとこんなのが出ると思います。
f:id:chankato:20190212112400p:plain

ではさっそく進めていきたいのだけれど、ちょっとわかんないことがありました。
さっき適当に指定したソリューションって何?

ソリューションとは

なんか位置づけ的にはJavaとかのプロジェクトのことでいい気がするんですがどうなんでしょう?てことで何が違うか調べてみました。

プロジェクト

Visual Studio でアプリ、Web サイト、プラグインなどを作成するときは、"プロジェクト" から始めます。 論理的には、実行可能ファイル、ライブラリ、または Web サイトにコンパイルされる、すべてのソース コード ファイル、アイコン、イメージ、データ ファイルなどがプロジェクトに含まれています。」

ソリューション

「プロジェクトはソリューション 内に含まれます。 ソリューションは、その名前にもかかわらず、"答え" ではありません。 1 つ以上の関連するプロジェクト、およびビルド情報、Visual Studio ウィンドウの設定、特定のプロジェクトに関連付けられていないその他のファイルに対するコンテナーに過ぎません。 ソリューションは独自の形式を持つテキスト ファイル (拡張子 .sln) で記述され、手動での編集は想定されていません。」

よくわかんないんだけど…

こういうのって読んでも大抵わからないよね…
もうちょいかみ砕いたの探してみます。
「1つのソリューションで、アプリ全体を管理することが一般的。つまり、「ソリューション=実際のアプリ」というケースがほとんどである。」
ってのがありました。
ソリューションとプロジェクトの関係性としては1:nになっていて1つのソリューションに複数のプロジェクトが存在している、というイメージであってるようです。
正直あんまわかんなかったんですけどその関係性だけわかったからひとまずいいかなってことにして先に進みます。誰かIQ3の私にも説明できそうならばお願いします。

エントリーポイント

ソリューションエクスプローラー(左のとこ。なんも設定してないと右にあるかも)を見てるとMainのとこを見つけたのでここがエントリーポイントなんだと思います。
ってかコメントにそう書いてあるのでそうでしょうね。
エントリーポイントってのはプログラムを実行したとき一番最初に呼ばれるところです。
f:id:chankato:20190212114450p:plain

Javaと比較して目に付くのはまず1~5行目の宣言にある

using

ってやつですね。言葉の意味とか位置からしJavaで言うところの

import

のことなんじゃないかと思います。

あとは7行目の

namespace

Javaだとクラス名が書いてあるところですが、少し違うようです。
自分はソリューション名もプロジェクト名も同じにしてしまったのでこれがどっちを指すのかわかりません。
なのでリファクタリング(名前変更)してソースが書き換わったほうを指してるのだろうなと思い片方ずつ変えてみたんですけども…
どっちを変えてもソースがかわんねぇ…えぇまじか。よくわかんないな…
試しに両方ともリファクタリングした状態でF5を押して見たんですけど問題なくビルドできちゃうんご。
Javaだと絶対エラーになると思ったんですが…

仕方ないのでプロジェクトを新規で作って名前を変えてみたところ
どうやらnamespaceではソリューション名ではなくプロジェクト名が指定されているようでした。

さっきちょっとフライングしてやっちゃったんですけどF5ボタンでデバッグの開始ができるようです。
ちなみに今の状態で実行するとこんな画面が表示されます。
f:id:chankato:20190212115840p:plain

あ!これ進研ゼミでやったやつだ!
はい、そうです。なんか最初に見た画面で出てきたやつですね。
話変わるけど進研ゼミでやったやつってか授業でやって進研ゼミでもやったやつってのが正しいですよねあれ。

16行目に

Application.Run(new Form1());

ってあるのでここでこのウィンドウを生成しているのだと思います。
んでこのForm1ってのはソリューションエクスプローラーにもあるのでそっち見てみたいと思います。

疲れたのでタイトル詐欺になりますが今回ここまでにします。
次回はボタンを押したらHello Worldって出すくらいまでをやってみたいと思います。

今回の獲得経験値

獲得量:53
次回レベルアップまで:47
獲得スキル:なし
解放実績:なし

開発用ノートPCを選ぶ

いきなり番外編ですみません。
C#全然関係ないけどちょっと面白かったので書きます。

開発機の購入背景

まず今自分の使えるPCとして以下のものがあります。
会社
Windows10(デスクトップ)
 モニターも27インチのを2枚もらってるので超やりやすい
MacBookAir(ノート)
 社内共有のということでしたがほかの人が使ってないのと先日Dockerを使わなきゃいけなかったのでWindowsじゃできねーって叫んで今手元に置かせてもらってます。
 正確にはできなくないんですけど、動作不良があったので使う気なくなりました。
 多分Windows10HomeじゃなくてProのほうならうまく動きます。(DockerはWindows環境じゃ動かないので仮想でLinuxとかをたちあげて使うんですけどVMWareがProじゃないと使えない!)


Windows10(デスクトップ)
 ゲーミングPCなので結構いけてるスペックしてます。イケてないお値段ですが。
MacBookPro(ノート)
 2015年くらいに買ったやつで古いです。
といった感じです。

そうなんです。WindowsのノートPCがないのです。
まぁなくてもよくねって思ってたんですが、今回のお仕事はお客さんのところに行ってUIの確認してもらってその場で直したりってできるのでノートPCで開発がしたい。。。
ついでに言うならおしゃれなカフェでおしゃれに開発したい。。。

ということで、会社の直属の上司でありプライベートでは師匠(プラモ、スピーカー、ゲーム、釣りと何でも詳しい)であるSさんに相談したところ
「よし、ヨドバシAkiba見に行きますか」とお返事をいただいたので見てきましたよってお話です。
ちなみにSさんはヨドバシAkibaマスターなので何が何階にあるとか調べなくてもついていくだけで目的の場所にたどり着けます。

開発機として必要なスペック

正直エンジニアでありながらマシンスペックとか何にも知らないのでいつものようにGoogle先生にききます。
Google先生!開発機として必要なPCのスペック教えて!」
「~~~~(なんかめっちゃいっぱい教えてくれる)」
Google先生!犬とか猫とか俺にもわかるようにわかりやすく教えて!」
CPU: i5 8世代以上、メモリ8GB以上、できればSSD、あと画面はでかいほうがやりやすいですよ」
「THX!」
ということでそんな感じのを探します。

ちなみにCPUについてですがi5ってのはIntelCore i5ねってわかったんですけど世代ってなに?って思ったので調べたところ
CPUの表記で「Core i5-7600K」「Core i5-8600K」とか見たことありませんか?
この数字の先頭の7とか8が世代を表してるらしいです。
んで、その後ろの数字は大きいほど新しいってことでした。

世代ってかなり重要らしくてi5とi7なら単純にi7のほうがいいと思ってたんですけど、7世代のi7より8世代のi5のほうがいい動きをするみたいです。
そのためよく広告とかに出てくる「Core i7のPCが〇〇万円!」みたいなのはすぐに飛びつかずちゃんと世代を確認してからにしましょう。

ちなみに今回見ていくのはCore i5-8250U以上のものになります。

さぁPC売り場へGO!

ということでさっそくヨドバシAkibaについたので8階の東京とんてき食べに行きます。
間違えました。とんてき食べたい。
はい、PC売り場は1階にあるので1階を探索します。探索というかSさんについていくだけなんですけどね。
まず最初に目に飛び込んでくるのはSurfaceです。
SurfaceMicroSoftが出してるPCなんですけどこれが超かっこいいです。
f:id:chankato:20190208112231j:plain
こんな感じです。
ちなみにこれキーボード外れます。(変形かっこいい)
f:id:chankato:20190208112234j:plain
こんな感じでタブレットっぽく使えます。
もちろん画面タッチで操作できます。(おしゃれかっこいい)
f:id:chankato:20190208112631p:plain
色は4色あって背面はこうなってます。(シンプルでできる大人風かっこいい)

はい、もうやばいでしょ。見た目いけすぎてる。
そんでもって超軽い!普通に驚く。

でも自分的に一番すごかったのはキーボードの打鍵感これはマジでやばい。
Amazon CAPTCHA

たぶんこれ

MacBookとか使ってる人ってあのキーボード大好きじゃないですか。自分も大好きなんですけど。
あんな感じです。最&高。間違いなく良いです。
このキーボードでカチャカチャしたい欲が高まってきます。

気になるお値段は…

でも自分の認識的にSurfaceって超高いんですよね。。。
お値段見てみましょうか。

今回自分が探しているスペックに合うものとして
CPU:Core i5-8250U メモリ:8GB 記憶容量:SSD256GBっていうちょうど良さそうなのがありました。
う~ん16万くらい。
たけぇ。
価格コムで調べると全く同じ型のものだと14万くらい。
やっぱ高いなぁ。

とりあえずほかの見てみましょう。
他のメーカーのを見るとだいたい同じようなスペックで9~15万くらいが相場のようです。
なんでこんなに適当な情報しかないかというともうSurfaceに心奪われすぎてて全然やる気起きなかったからです。
結構かっこいいのはあるんですがSurfaceよりビビッと来るものがない。やっぱり私Surfaceのこと忘れられない!っていう失恋後みたいな気分だったのであんま覚えてないってのが正直なところです。

ただやっぱ14万は高いですよね~ってダメもとでSさんに聞いてみたところ
「でもさ、SurfaceならOfficeソフト入ってるんだよね?ほかのに3万くらいでOffice入れるなら結局かわんなくない?」
と、神のお声が!

自分は知らなかったけどそうなんです!SurfaceってOffice入ってる値段なんですよ!
そう考えると普通に安くない?
いや、安くはないんだけど他のと比べても全然価格的によくないですか?

あれ?Surfaceって高いんじゃないの?

最初にも言った通り自分の認識ではSurfaceってバカ高いイメージだったんですけどそうでもなかったっけ?って思い調べてみました。

どうやらSurfaceってもう結構前に出たものらしく、最初のとかは2012年に出てたらしいです。
このころまだ自分は大学生でその時見た感想がそのまま脳内にあったようです。
確かに最初のころは高かったけど、今現在の価格はかなり下がっているみたいなので自分の認識とのギャップがあったのだと思います。
Officeいらないよーって人にはそうでもないかもしれませんが、OfficeもPCも欲しいっていう自分と同じタイプの人からするとかなり良い価格だと思います。

で、結局買ったん?

まだ買ってないですがその方向で話を進めてもらっています。
ちなみにSurfacePro6だとちょっと画面が小さいのでSurfaceLaptop2にする予定です。
キーボードと一体型ですがまぁ基本キーボード使うからいっかってなりました。


やっぱ新しいデバイスはテンションぶちあがりますね。
あー超楽しみだなぁ。。。

C#を始めるにあたって

ブログタイトルにもある通りC#についての知識は0です。
そもそもC#ってなんなん?というレベルなのでまずはそこから調べて例のHello Worldするまでやってみました。

C#とは

CってつくくらいだからC言語の進化系なのかなーと思ってましたがとりあえず調べます。
同じ開発のO谷さんもよく「今の時代は調べりゃなんでも出るから超便利」って言ってるので調べます。
素直な人間なので検索ワードに「C# とは」を設定しLet's Google!
すると当然たくさん出てくるんですが超わかりやすく言うとこんな感じです。

みたいなことがよく書かれていました。
とはいえよくわからなかったのでもう少しだけ調べました。

JavaC++のいいとこどり言語

何がいいとこどりなのかはいろんな人がかいているので興味があれば見てみてください。
そんなことより自分にとって大事なのは、C言語なんてやってないしJavaしかほとんどやってこなかったけど理解できるん?ってところです。
ファイル読み込みをするサンプルコードがあったので見てみました。

using System;
using System.IO;
namespace ConsoleApplication1
{
     class Program
    {
        static void Main(string[] args)
        {
            string path = @"c:\work\test.csv";
            using (var reader = new StreamReader(path, System.Text.Encoding.GetEncoding("shift_jis")))
            {
                string line = null;
                while ((line = reader.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            }
        }
    }
}

…あっ…ちょっと知らない記述もあるけどなんとなく理解できる!
他のソースも見てみましたが大体わかりそうです!
わからないところについてはこれから勉強していきます。

.NET Framework上で動作する

.NET Frameworkってのはなんとなく知っていたんですけど一応調べてみました。
自分の認識では、Windowsのアプリを動かすときに必要なやつくらいの認識でしたがまぁざっくりいうとこれであってました。
多分今回のプロジェクトでC#が採用されたのはWindowsGUIアプリを作成するからだと思います。
とにかくGUIのWindow作成とかが楽らしいです。
以前Go言語でGUIアプリを作成したときライブラリの不具合とかでそこそこ苦しんだので楽しみです。

でもWindowsじゃなくても動く

あれ?さっき .NET Framework上で動作するって言ったよね?いきなり嘘つくことある?
ってなりますよね。わかります。
どうやら「Mono」という「.NET Framework」互換環境がフリーで提供されているらしいのでMacとかでも動くらしいです。
ただやはりOS間の問題というか不具合があるのも否めないようです。
まぁ今回はWindowsでしか使わないので自分としてはどうでもいいといえばどうでもいいところ。

よし、さっそくHello Worldしようぜ

はい、というところでざっくりC#についてわかったので早速Hello Worldしてみよー
と、思ったんですがIDEのインストールに時間かかってるのと文字打つのにつかれたので次回にします。

ちなみにIDEはVisualStudioが良い!とのことだったのでVisualStudioを使います。
docs.microsoft.com

今までJavaの開発はEclipseVSCodeでやっていたのでこれもまた初めてです。。。
調べることいっぱいですが頑張りたいと思います。