最短で C# を学びたいです。C# の言語的知識はほぼ 0 です。
効率の良い学習方法を教えてください!
背景
Web コンテンツの更新を行うためのデスクトップアプリを作ろうと思い、「ならば C# でしょw」と3連休で学習を始めたのですが、ちょっと効率よく学びたいと考え質問してみました。
当方 PHPer で、作成してきたアプリは Web サービスがほとんどです。
現在の学習方法
Microsoft Visual Studio 2017 Community を使用して、サンプルを動かしながら座学中。
参照サイト:C# のガイド-docs.microsoft.com
飽きたら、Qiita 等の入門記事閲覧
知りたい情報
PHPer が C# を学ぶにあたって注意すべき箇所
デスクトップアプリ制作の勘所
採用すべきコーディング規約(フレームワーク デザインのガイドラインを今は読んでます)
学習に向いた参照すべき OSS
採用するパッケージの選定基準
今の所の感想
できることが広がった感じがして、厨二病的万能感に浸っています。
ただ、php との差異が大きく、ある程度勘所を押さえないと、遠回りしそうだなぁと。
知りたい情報のキッカケは以下な感じ
・ツール(VS)に従って作ると、Form1.cs がどんどん大きくなって気持ち悪い
・this 省略したら、スコープがよく分からんくなるけど大丈夫?
・モダンな書き方を参考にしたいけど、参考にすべきコードが分からん。
Visual Studio が非常に良い仕事をしている気がするけど、そのせいで、学習に必要な基礎が飛んじゃってる気もする。ツールが肩代わりしている、初心者の気にすべき事もあれば教えてください!
散文的な質問で恐縮ですが、ご教示いただけると幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 06:00 編集
2018/09/17 06:01

退会済みユーザー
2018/09/17 06:06
2018/09/17 06:11
2018/09/17 06:12

退会済みユーザー
2018/09/17 06:41

回答8件
0
ベストアンサー
te2ji さんともあろう人に今更効率のよい勉強方法もなかろうと思うのですが
・ツール(VS)に従って作ると、Form1.cs がどんどん大きくなって気持ち悪い
イベントハンドラの中に全部書くのが楽ですから、そうなりがちです。
ですが、ビジネスロジックはなるべく他のクラスに分離してイベントハンドラはそれを呼び出すだけにするようにするといいと思います。
データバインディングが使えますので、まずはコントロールとオブジェクトとのバインディング、それとコントロールと設定(Properties.Settings.Settings)とのバインディングを調べてみるのが良いかと。
そうすれば分離しやすくなります。
・this 省略したら、スコープがよく分からんくなるけど大丈夫?
これは慣れですかね。
省略しなくても大丈夫です。
基本的にデザイナーから作ったイベントハンドラの中の this はフォームを指します。
ボタンクリックのイベントだろうがリストボックスの選択イベントだろうが、フォームです。
コントロールのイベントにフォームのメンバーを登録しているからです。
イベントを起こしたコントロールを知りたい時には sender を使います。
型は object なので、これを適切な型にキャストしてください。
・モダンな書き方を参考にしたいけど、参考にすべきコードが分からん。
今モダンなのはお使いの Windows Forms ではありません。
デスクトップアプリであれば大きく分けて WPF と UWP の二種類があります。
それらを MVVM で使います。
HTML と CSS の代わりに XAML、PHP と JavaScript の代わりに C# を使うというイメージです。
WPF は基本的に Windows 用で UWP は基本的に Windows 用です。
何を言ってるかわからないと思いますが、WPF は従来の Windows アプリを作るもので、UWP はマルチプラットフォームを一応うたった新しい Windows アプリを作るものです。
UWP は Windows タブレットで使えますが、機能制限が多く学習コストは上がります。
ただ、Windows Forms は圧倒的に学習コストは低く、現役で十分使えるパワーも持っていますから、無理にモダンを目指さずそこから入るのが楽しいと思います。
#追記(余談)
データバインディングと Reactive Extensions を使ったモダンっぽい書き方の例です。
###ソリューションの作成
Windows Forms プロジェクトを作成し、ボタンを 3 つ貼り付け、必ず名前を付けて保存してください。
ここでは WindowsFormsApp1 としました。
###Reactive Extensions のインストール
パッケージマネージャーコンソールを開き、Install-Package System.Reactive
とコマンドを実行してください。
これはソリューション毎にインストールされますので、別のソリューションでも使いたい場合にはその都度インストールする必要があります。
###Unlock クラスの作成
プロジェクトに新しいクラスを追加し、次のように書き換えてください。
そしてここで一度ビルドしてください。
C#
1using System; 2using System.ComponentModel; 3using System.Linq; 4using System.Reactive.Linq; 5using System.Runtime.CompilerServices; 6using System.Windows.Forms; 7 8namespace WindowsFormsApp1 9{ 10 public class Unlock : INotifyPropertyChanged 11 { 12 public event PropertyChangedEventHandler PropertyChanged; 13 14 protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) 15 { 16 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 17 } 18 19 public Unlock(params (Button button, int count)[] keys) 20 { 21 var orders = keys 22 .SelectMany(key => Enumerable.Repeat(key.button, key.count)) 23 .Reverse() 24 .ToArray(); 25 keys 26 .Select(key => key.button) 27 .Distinct() 28 .Select(button => Observable 29 .FromEventPattern<EventArgs>(button, nameof(button.Click)) 30 .Select(eventArgs => eventArgs.Sender) 31 .OfType<Button>()) 32 .Aggregate((a, b) => a.Merge(b)) 33 .Scan(Enumerable.Empty<Button>(), 34 (list, button) => new[] { button }.Concat(list).Take(orders.Length)) 35 .Subscribe(buttons => 36 { 37 Unlocked = buttons.SequenceEqual(orders); 38 }); 39 } 40 41 protected void SetValue<T>(ref T field, T value, [CallerMemberName]string propertyName = null) 42 { 43 if (Equals(field, value)) return; 44 field = value; 45 OnPropertyChanged(propertyName); 46 } 47 48 private bool unlocked = false; 49 public bool Unlocked 50 { 51 get => unlocked; 52 set => SetValue(ref unlocked, value); 53 } 54 } 55}
###ボタンと Unlock をバインド
デザイナーを開き、button3 のプロパティを開き、(DataBindings) を展開し、「詳細」の「…」をクリックしてください。
プロパティペインから Enabled を選択し、バインドコンボボックスをドロップダウンし、「プロジェクトデータソースの追加…」をクリックしてください。
「オブジェクト」を選択して「次へ」
「Unlock」にチェックをつけて「完了」
「OK」で閉じると、「unlockBindingSource」がフォームに追加され、button3.Enabled がそれとバインドされます。
###Form1
デザイナーで button3 をダブルクリックし、次のように書き換えてください。
C#
1using System; 2using System.Windows.Forms; 3 4namespace WindowsFormsApp1 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 Unlock = new Unlock((button1, 1), (button2, 2), (button1, 1)); 12 } 13 14 public Unlock Unlock 15 { 16 get => (Unlock)unlockBindingSource.DataSource; 17 set => unlockBindingSource.DataSource = value; 18 } 19 20 private void button3_Click(object sender, EventArgs e) 21 { 22 if (!Unlock.Unlocked) return; 23 MessageBox.Show("ガチャッ"); 24 } 25 } 26}
###実行
実行し、button1 を 1 回、button2 を 2 回、button1 を 1 回、この順に押してください。
button3 が押せるようになるので、それをクリックすると「ガチャッ」と表示されます。
この回数は Form1 のコンストラクタの以下の部分で指定しています。
C#
1Unlock = new Unlock((button1, 1), (button2, 2), (button1, 1));
これと同じことを真正直にしようと思えば、button1 button2 をクリックされた時に複雑なフラグ管理をしなければいけませんが、Reactive Extensions と LINQ を使うとこんなにすっきりと書くことができます。
最初は読みにくいと思いますが、読み慣れたらなんということはありません。
投稿2018/09/17 07:17
編集2018/09/17 15:08総合スコア28671
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 07:58

退会済みユーザー
2018/09/17 12:54 編集
2018/09/17 13:01

退会済みユーザー
2018/09/17 13:07

0
効率の良い悪いは人それぞれだと思うんです。私は。
ひたすら言語仕様を読んで覚えてしまえば思い通りに使えるようになる人もいるし、
人が書いたコードを読みまくって参考にすることで覚えていく人もいるし、
なんとなく行き当たりばったりに作りたいものを作り続けてそのうちマスターしちゃう人もいるし、
紙の本が好きな人もいればネット大好きな人もいれば人に教わりたい人もいるだろうし、
なにより、勉強を始めようとする時点でのベースの知識からして違いがあるのですから、性格とか加味するともうなにが最短でなにが効率が良いんだか、他人からはわかりません。
ちなみに私が新しい言語を覚えようとするときは、その言語の仕様とにらめっこしながらごくごく小さいコード片を書きまくるか、なんとなく傾向が似てる言語と同じように書いてみながら作りたいものを作ってしまいます。
それが良い(と言われる)書き方なのかどうかはあとまわしです。
仕事で使うんでもなければ、別に古い書き方だろうがセキュリティ的にNGだろうが気にしません。
そのうちなんとなくそういうのもわかってくる時がきます。
追記
とても古い記事ですが、こんなのありましたよ。
CodeZine - PHPでデスクトップアプリケーションを作る
PHPerならPHPerらしく、PHP貫いてもいいんじゃないですか。
投稿2018/09/17 05:31
編集2018/09/17 05:57総合スコア1803
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 05:34

退会済みユーザー
2018/09/17 06:03
2018/09/17 06:06
2018/09/17 14:32
2018/09/17 23:52 編集
2018/09/17 23:57
2018/09/18 00:22
2018/09/18 03:19

0
PHPで出来る事はPHPでやっちゃった方が良いと思うのでちゅ。
だから、PHPで出来ない事に絞って学習していくのが良いと思うのでちゅ。
あれもこれもそれもどれもやろうとしたら、時間が勿体無いのでちゅ。
特に、おっさんなら尚更でちゅ。
おっさんに残された時間は限られているのでちゅ。
というか、普通はthisなんていらないでちゅ。
thisが必要な方がおかしいでちゅ。
アンカー無しで話したら、それは高い確率で自分の事を言っているのでちゅ。
C#だろうが、E♭だろうが、やるべき事は変わらないのでちゅ。
「目の前にある現実世界の問題を解決する事」
おっさんたちは、その辺のところが全く理解できていないから
やれあの言語がどうした、この言語はなんだ、どうでも良い事ばっかりにこだわっているのでちゅ。
いい加減に目を覚ますのでちゅ。
投稿2018/09/17 05:41

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
その言語が一番有利な状況で実際に使えるものを書く。(まぁWindowsアプリとか)
言語解説書とか、言語仕様書とか、一通り解説しているものをざっと読む。
便利そうなライブラリ取り込んで使う。使いながらそのコードを読む。
以下繰り返し。
ということだと思いますが、PHPでも同じ話だったのでは。
自分が必要だと感じていない言語は身につきません。
(という議論をしたいのでしょうか…)
それと、公式の開発環境が非常に強力であれば、まずそれに頼るべきです。
言語と開発環境との関係は、プログラマのわがまま以上に強いです。
スコープだってエディタが理解してくれてるならそれでいいと思います。
投稿2018/09/17 06:18
総合スコア1563
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 06:36 編集

退会済みユーザー
2018/09/17 06:51

退会済みユーザー
2018/09/17 09:49

0
やりたいことは、必ずしもアプリを使う必要があるのか、というところに立ち返ったほうが良いかもしれません。
Web コンテンツの更新というのは、どういうことでしょうか。
- 一般的な Web サイトにおける、例えば「お知らせ」や「ニュース」といった情報を更新する
- 広告などの画像を差し替える
- 画面デザインを変更する
こういったことだと、下手にアプリを作るより直接操作したほうが自由度も手間も下がるでしょう。せいぜい情報更新でしょうが、それなら Web アプリで十分なはずです。
システムで必要なのは「必要なことを過不足なくできる」ことであって、それを実現できるなら手段は問わないのです。変に C# にこだわると、この必要条件を満たせない可能性があります。
手段と目的を取り違えてはだめです。
投稿2018/09/17 05:52
総合スコア13705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 05:57

退会済みユーザー
2018/09/17 06:10

0
せっかくなので、備忘録を回答として切り出すことにしましたw
役に立った情報を、追記していきます。
備忘録
たいとるそのままw 逆説的に php との差分が把握できる。
PHPができても他言語の学習には役に立たない理由を考えてみた
少し古いけど、ツールまで含めた C# のエッセンス
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
コーディングガイドラインの記事を見つけました。
C# コーディングガイドライン&プラクティス 2021 - Qiita
コメント欄で少し燃えてますが参考にはなると思います。
投稿2018/09/20 06:26
編集2021/11/26 03:09
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/20 11:29

退会済みユーザー
2018/09/20 12:29

0
なんて横着な質問だと思ってみてたけど、ユーザースコア見て質問回答履歴を一覧だけどさらっと見たらなんでこんな質問してるんだろう?って疑問に思った
とりあえず、windowsの簡単なツール程度ならwormの方が手っ取り早いのは事実なんだけど、問題はwebformsくらいしか同じ雰囲気の使い方がなくて、WPFならUWPや多分Xamarin(自分は触ったことない)等、当分の間主流となる画面との連携を楽にしてくれる環境になるのでformはやらなくてもいい気がします
https://blog.okazuki.jp/entry/2014/12/27/200015
自分はWPFを始める際にここ見て色々試してみました
MVVMも規模が大きなものでないのならVVMでモデル抜きにしても良いかと
PHPのベテランということでおそらくはJSもそれなりに経験があると思いますので、LinqであればJSとの比較が良いかもしれません
https://mseeeen.msen.jp/linq-basic-for-javascript-programmers-1/
この辺りとか(自分は逆にC#からJSに置き換える方向で見ていますが)
ラムダ式もアロー関数でES2015だったか2016だったかから導入されているはずなので入りやすいんじゃないかとは思います
また、C#そのものであれば
https://ufcpp.net/
こちらのサイトを見ると良いかと思います
C#という言語だけでなく.NET FRAMEWORKも重要ですし(ただし4.8で打ち止めになって今後は.NET Coreのみになるらしい?)
C#は触れば触るほど好きになる言語らしいので、これを切っ掛けにC#主体になってもいいんですよ
ちなみに、C#はDelphi作った人が開発した言語で、C#の"#"は"+"4つが集まったものに見えるというのが理由らしいですなのでJAVAのコピーというよりもDelphiを元にC++の悪い点を改善して作ったって感じだと思います
投稿2018/09/17 15:16
総合スコア1367
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 22:56

0
まあ、spookybirdさんとほぼ、同意見なんですが、、。
Cをしばらくやって、C++をかじって、Javaも適当にやってきたら、C#も同類。
どっちかと言うと、.Netをどう使えるかの方が問題だったりとします。
どなたかのコメント(?)に、C#とVBの違いは、.Netの呼び出し方だけとあったけど、その通りと思う。 (個人的には VBよりも使い易いと思う。)
自分の場合、本、読んでもなかなか覚えられない、勉強会も同様。実際に必要になって使いだすとなんとかなっている感じです。言語仕様とかはほとんど斜め読み、と言うか、積読(Netの場合、リンクが増えるだけ)。独自用語も困った時、調べてます。(この辺、誤解されやすいですが、理屈に正しいより、使える方が大切でしょう)
・ツール(VS)に従って作ると、Form1.cs がどんどん大きくなって気持ち悪い
これは、大きくなったところで、機能とかでクラス分割を考える。
・this 省略したら、スコープがよく分からんくなるけど大丈夫?
これは慣れって気がします。ただ、Formの Size とか、Width とか、一般的過ぎて、this無しだと落ち着かないけど、VS が要らないって言ってくるので削除。
・モダンな書き方を参考にしたいけど、参考にすべきコードが分からん。
なにがモダンか私も分かりません。コーディングルールも同様。流行もあるので、あまり深入りしないようにしてます。
自分の記憶では、C# は、C++の代わりに Javaを使おうとしたが、著作権問題を回避するために、MSが作ったと記憶しています。(だから、Javaに似ている)
投稿2018/09/17 07:43
総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/09/17 09:54

退会済みユーザー
2018/09/17 10:35

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。