佐々木屋

技術的なことから趣味まで色々書きます

不要な制御フラグ

制御フラグでの条件分岐はよくある手法の一つですが、これが多くなりすぎると非常に可読性が悪くなります。 課題① 例えば以下のコードを見てみましょう。 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判定)

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許容型です。null許容型は値型の後ろに「?」をつけるだけです。しかし、元々許容型である参照型やstring…

CodeBehindによるファイル追加で発生する問題

ASP.NETのプロジェクトファイルに既存ファイルを追加する場合、通常はVisualStudioのソリューションエクスプローラーから追加します。しかし、状況によってはOSのエクスプローラー上でファイルの移動をする場合があります。この場合、ASP.NETのプロジェクト…

null許容型(C#とVB.NETの違い)

参照型はnullを許容していますが、値型はどうでしょうか。実はここでもC#とVB.NETで微妙に挙動が異なります。 C#におけるnull代入時の挙動 参照型はnullを許容していますが、値型はnull非許容です。つまり、以下のような構文はそもそもコンパイルエラーとな…

this参照

this(VB.NETはMe)が一体どういう意味を持っているのか、どういったときに使用するのかを説明します。そもそも、ローカル変数とフィールド変数の名前がかぶらなければお目にかかることはないわけですが、オブジェクト指向型言語であれば一度や二度はかぶっ…

オーバーライド

よく間違えるNo1のオーバーライドです。「オーバーロード」とよく間違えて使う人がいますが、この二つ全く意味が違いますので混同しないように注意しましょう。オーバーライドはオブジェクト指向の「継承」分野で必要な機能となります。オーバーライドを…

ボックス化って何?

型変換でよく出てくる用語の一つに「ボックス化(又はボクシング)」があります。よくボックス化はコストがかかるとか言われますが、一体何の意味か分かりますか? 値型を参照型に変換する行為 簡単に言うとそういうことです。例えばint型をobject型に変換す…

非同期処理でフォームOpen/Closeを制御する

非同期処理中はスレッドセーフでなければアクセス出来ないことは以前説明しました。 sasaki816.hatenablog.com 今回は同じような内容ですが、非同期でフォームを開いたり閉じたりする処理を考えます。例えば、ボタンクリックを非同期処理で行い、その別スレ…

ポリモーフィズム(デリゲート)

デリゲート使用の説明①共通処理の場面で以下のコードを最後に紹介しましたが、実はこのコードには続きがあります。前回紹介したコードは以下の通り。 private delegate void testDlgt(); private void button1_Click(object sender, EventArgs e) { testDlgt…

デリゲートの使いどころ ②(保留)

デリゲートの使いどころとして、前回は共通処理をまとめる話をしました。 今回は2つ目「保留」です。プログラミングを構築していると、長いコードの中でどうしても「クラスの宣言」と「メソッドの実行」を分けて行いたい(タイミングが異なる)場面が結構あ…

Visual Studio 2019 プレビュー版

昨年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を重ねて書くことによりこれを防ぐことができます。 using (Class1 test1 = new Class1()) using (Class2 test2 = new Class2()){ ~ } Using test1 As New Class1, t…

デリゲート(匿名メソッドとラムダ式の利用)

前回、デリゲートの基本的な使い方であるメソッドを型のような形で保持させ使う話をしました。 デリゲートは他にも匿名メソッドやラムダ式でそのまま使う事が可能です。 匿名メソッドを利用 //デリゲートの宣言 delegate void ShowWriter(string value); //…

TryParseメソッドのカンマ区切り挙動

TryParseメソッドは、数値ではなくカンマ区切りの数値を渡したときの挙動が型によって微妙に違います。よく使われるint、long、double、decimalで説明します。 int value; Console.WriteLine(int.TryParse("1,234", out value)); //false long value; Consol…

デリゲート(基本)

デリゲートを本やサイトを調べると、「委譲」であったり、「代表者」、はたまた「C言語の関数ポインタ」という難しい表現が出てきます。ちょっと分かりにくいですよね。そして大抵、読み進めると何が書いてあるか分からなくなるのがデリゲートです。実はデリ…

非同期処理、マルチスレッド(async/await)

非同期処理最終話です。.Net Framework4.0でTaskクラスが登場し、非同期処理がより簡単に書けるようになりましたが、.Net Framework4.5からTaskクラスをもっと使いやすくしたasync/awaitが登場します。 非同期処理はThreadから始まり、Timerスレッドやデリ…

継承(クラスの継承)

継承にはクラス、Windowsフォーム、WEBフォームと大きく分けて3種類あります。今回はクラスの継承のお話しです。継承の中でも一番基礎的な部分となります。VB6出身の方だと聞きなれない言葉「継承」ですが、簡単に言えば「コピーを使いまわす」といったとこ…