オプション引数がC#で長らく導入されてこなった詳しい経緯は不明ですが、私が想像するに「オーバーロードと機能がかぶるから」が一番の理由かなーと思っています。オプション引数とオーバーロードを組み合わせてしまうと、当然挙動が分かりにくくなりますの…
クラスの特定機能を保証(強制)する仕組みをインターフェースと言います。恐らく一番有名なインターフェースといえばIDisposableインターフェースですね。IDisposableはDisposeの実装が約束されますので、クラスを呼ぶ場合にusingステートメントが利用でき…
継承を利用したポリモーフィズムの実現です。デリゲートの場合はクラス内でも別クラスでも使えますが、継承は別クラスの場合に有効です。しかもデリゲートに比べると普段のクラス宣言と同じように使用出来ることや特別な記法は不要なので、特にVB.NETな方は…
型を覚えるときに必ずセットで出てくる型変換(キャスト)の話です。実は、型変換はC#とVB.NETでだいぶ違います。C#は変換方法がだいたい決まっているのですが、VB.NETでは変換方法がありすぎて、プログラマーによってまちまちなのです。そのため初学者はど…
一つのデリゲートで複数のメソッドを連続で実行することをマルチキャストデリゲートと呼びます。これによってメソッドを任意のタイミングで追加して最後に実行するような処理も簡潔に書くことができます。例えば以下のようなメソッドをデリゲートで呼ぶとし…
制御フラグでの条件分岐はよくある手法の一つですが、これが多くなりすぎると非常に可読性が悪くなります。 課題① 例えば以下のコードを見てみましょう。 int x = 1; int y = 2; bool flg = true; while (flg) { if (x * y > 10) flg = false; ++x; ++y; } D…
VB.NETにはオーバーライドに似たような機能でシャドウがあります。但し、オーバーライドとシャドウは機能としては似ているかもしれませんが、使用される意味としては全くの別物です。初学者は混同しがちなので注意して下さい。読んで字のごとくですが、シャ…
メソッドの戻り値やgetterプロパティでreturnではなくyield returnした構文のことをイテレーター(メソッド)と呼びます。イテレーターの概念はRubyやPythonもC#とほぼ同様です。なお、yieldはイールドと呼びます。イテレーターの概念は現在のオブジェクト指…
メソッドの引数を省略、既定値を設定できる機能をオプション引数と呼びます。オプション引数はC++やVB.NETでは昔からありましたが、C#では.NET Framework4.0から初めて導入されました。 オプション引数 C#は引数に既定値を設定するとオプション引数となりま…
null許容型を利用する上で重要なnull判定方法をいくつか説明します。 int? a = null; Dim a As Integer? = Nothing 等価(Is)による条件判断 if文による等価評価(Is)を行います。 if (a == null) { Console.WriteLine("nullだ"); } else { Console.WriteL…
派生クラスで基底クラスメソッドをオーバーライドされた場合、処理は派生クラス側で上書きされてしまいますが、別に基底クラスメソッドが消えるわけではなくちゃんと呼び出すことが可能です。基底クラスのメソッドを呼ぶ場合はbaseキーワード(VB.NETはMyBas…
値型がnullを許容しないことは分かりました。しかし、アプリケーション構築上、nullを許容しなければいけない場面もあります。そこで登場したのがnull許容型です。null許容型は値型の後ろに「?」をつけるだけです。しかし、元々許容型である参照型やstring…
ASP.NETのプロジェクトファイルに既存ファイルを追加する場合、通常はVisualStudioのソリューションエクスプローラーから追加します。しかし、状況によってはOSのエクスプローラー上でファイルの移動をする場合があります。この場合、ASP.NETのプロジェクト…
参照型はnullを許容していますが、値型はどうでしょうか。実はここでもC#とVB.NETで微妙に挙動が異なります。 C#におけるnull代入時の挙動 参照型はnullを許容していますが、値型はnull非許容です。つまり、以下のような構文はそもそもコンパイルエラーとな…
this(VB.NETはMe)が一体どういう意味を持っているのか、どういったときに使用するのかを説明します。そもそも、ローカル変数とフィールド変数の名前がかぶらなければお目にかかることはないわけですが、オブジェクト指向型言語であれば一度や二度はかぶっ…
よく間違えるNo1のオーバーライドです。「オーバーロード」とよく間違えて使う人がいますが、この二つ全く意味が違いますので混同しないように注意しましょう。オーバーライドはオブジェクト指向の「継承」分野で必要な機能となります。オーバーライドを…
型変換でよく出てくる用語の一つに「ボックス化(又はボクシング)」があります。よくボックス化はコストがかかるとか言われますが、一体何の意味か分かりますか? 値型を参照型に変換する行為 簡単に言うとそういうことです。例えばint型をobject型に変換す…
非同期処理中はスレッドセーフでなければアクセス出来ないことは以前説明しました。 sasaki816.hatenablog.com 今回は同じような内容ですが、非同期でフォームを開いたり閉じたりする処理を考えます。例えば、ボタンクリックを非同期処理で行い、その別スレ…
デリゲート使用の説明①共通処理の場面で以下のコードを最後に紹介しましたが、実はこのコードには続きがあります。前回紹介したコードは以下の通り。 private delegate void testDlgt(); private void button1_Click(object sender, EventArgs e) { testDlgt…
デリゲートの使いどころとして、前回は共通処理をまとめる話をしました。 今回は2つ目「保留」です。プログラミングを構築していると、長いコードの中でどうしても「クラスの宣言」と「メソッドの実行」を分けて行いたい(タイミングが異なる)場面が結構あ…
昨年12月にVisual Studio 2019 プレビュー版が公開されましたが、2月22日に宣伝があったので少し使ってみました。 基本的にVisual Studio 2017と共存可能のようです。devblogs.microsoft.comリファクタリング機能がかなり強化されていたり、アラートの…
前回はクラスの継承について説明しましたが、フォームもクラスなわけなので継承可能です。ただ、コードを継承する場合と違い、コントロールを継承する場合は少しひと手間必要です。 継承するフォームの宣言 継承するフォームをコード上に宣言しますが、C#とV…
コンテンツページからマスターページの公開メンバーへのアクセス方法です。 まずコンテンツページの.aspxファイル側にMasterTypeディレクティブを設定します。 <%@ Page masterPageFile="~/Site.master" ~~~~ %> <%@ MasterType VirtualPath="~/Site.mas…
課題 以下のコードのどこが問題でしょうか。 string[] colorNames = {"桃", "黒", "黄", "青", "赤" }; for (int i = 2; i <= colorNames.Length - 1; i++) { Console.WriteLine(colorNames[i]); } Dim colorNames As String() = {"桃", "黒", "黄", "青", "…
仕事場にて、「最近動作が遅くて困っている」との問い合わせがありました。ディスクアクセスがシーケンシャルでは出ているがランダムが全くでていない状況です。 確かにランダムIOが少し遅い気もします。 通常5400rpmだと1.0~1.2MB/s、7200rpmでも1.5MB/s前…
デリゲートは作成するアプリケーションの性質によっては全くお目にかからない(使う必要にならない)機能ですので、イマイチ使いどころが分からないかもしれません。そこで、デリゲートの恩恵が受けられる場面を3回に渡って説明しようと思います。 共通処理…
Windows7以降でローカルアカウントを忘れた場合の対処法です。 Administratorで入れるかどうかを確認 これを読んでいるということは、パソコン管理者のはずなのでAdministratorでログインできるかどうかを試みます。なお、Administratorが無効化されている場…
フォームアプリケーションで、複数のコントロールに一つの同じイベントを割り当てる方法です。共通処理イベントを作成します。第一引数を「sender(object型)」、第二引数を「e(EventArgs型)」とします。例えばボタンクリックの共通処理イベントを作成し…
複数のusingステートメントを利用する場合、構造化が複雑になり過ぎてしまいますが、usingを重ねて書くことによりこれを防ぐことができます。 using (Class1 test1 = new Class1()) using (Class2 test2 = new Class2()){ ~ } Using test1 As New Class1, t…
前回、デリゲートの基本的な使い方であるメソッドを型のような形で保持させ使う話をしました。 デリゲートは他にも匿名メソッドやラムダ式でそのまま使う事が可能です。 匿名メソッドを利用 //デリゲートの宣言 delegate void ShowWriter(string value); //…