佐々木屋

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

1.C#、VB.NET

ここがダメだよ!VB.NET③(参照渡しの曖昧さ)

メソッドの引数は主にByValの値渡しとByRefの参照渡しがあります。VB.NETでは以下は等価です。 Private Sub Test(ByVal num As Integer) Private Sub Test(num As Integer) ByValの省略は意見が分かれますが、正直どちらでも私はいいと思います。ただ、VB6の…

型変換は何を使う?(string型⇒値型)

おおむね型変換が出そろったところで、「どれを使うか?」をシリーズで考えてみます。今回はstring型⇔値型です。 なお、以下は共通認識とします。 VB.NETのCIntやCDecなどのC●●●は、CTypeと等価なので全てCTypeで検証 時間計測はSystem.Diagnostics名前空間…

ここがダメだよ!VB.NET②(「()」の省略)

メソッドは必ず「()」が付きます。引数が必須であればいいのですが、VB.NETで引数無しの場合は「()」を省略してもコンパイルエラーにはなりません。 Dim a As String = (123).ToString() Dim b As String = (123).ToString C#は「()」が無いとコンパイルが通…

遅延評価と先行評価

式や配列などの走査で必要な要素を必要な時だけ評価するような挙動を遅延評価と言います。イテレーターは遅延評価される処理の典型です。LINQなどでも遅延評価があります。例えば、イテレーターでも出てきた以下の配列処理を考えます。 private List<string> Naiyo()</string>…

型変換は何を使う?(その②)

型変換は何を使う?(その①)の続きです。 sasaki816.hatenablog.com 数値型で有意なParse、TryParse 数値型はnullは許容しませんので、関数化できるならTryParse一択だと思います。但し、string型からの変換のみ利用できることと、TryParseはout引数を持ち…

抽象クラスと抽象メソッド

クラスを継承した時に仮想メソッドであれば派生先でオーバーライドできることは説明しました。この時、派生先で最初からオーバーライドありきで設計されたメソッドを抽象メソッドと呼びます。抽象メソッドは定義のみを記述し、詳細内容は派生クラスで記述し…

可変長引数②

可変長引数は引数無しで呼べる 可変長引数のメソッドに対してなにも指定せずメソッドを呼ぶと、nullが渡されます。つまり、メソッド側は空配列が作成されます。 private void TotalSum3(params int[] values) { Console.WriteLine(values.Count()); } public…

可変長引数①

ちょっと難しい言葉ですが、要はメソッドに渡せる引数の数が可変ということです。例えば以下のような同じ種の引数を複数必要とするメソッドを考えます。単純に引数を足す処理です。 引数は配列となっているので、当然メンバー変数を一旦配列に変換して引数に…

コンストラクタの継承(引数あり)

継承された派生クラスは基底クラスのメソッドを(protected以上であれば)自由に利用することができますが、コンストラクタは通常のメソッドと異なり、サブクラスで暗黙的に利用できるようにはなりません。基底クラスでコンストラクタを定義した場合は、派生…

ここがダメだよ!VB.NET①

どういうタイトルをつけようか迷いましたが、これが一番しっくりくるかな~? 私は手続き型言語もオブジェクト指向言語も関数言語も一通り経験してきましたが、一番好きな言語は何?と聞かれたら、断然C#と答えます。そしてC#とよく比較される言語の一つとし…

コンストラクタの継承(引数なし)

クラスの継承をすると基底クラスのフィールドやメソッドは(protected以上であれば)派生クラスからでも自由に利用することができますが、コンストラクタは少し挙動が異なります。引数が無い場合のコンストラクタは派生クラスが呼ばれた時点で自動的に基底ク…

オプション引数②

オプション引数がC#で長らく導入されてこなった詳しい経緯は不明ですが、私が想像するに「オーバーロードと機能がかぶるから」が一番の理由かなーと思っています。オプション引数とオーバーロードを組み合わせてしまうと、当然挙動が分かりにくくなりますの…

インターフェース

クラスの特定機能を保証(強制)する仕組みをインターフェースと言います。恐らく一番有名なインターフェースといえばIDisposableインターフェースですね。IDisposableはDisposeの実装が約束されますので、クラスを呼ぶ場合にusingステートメントが利用でき…

ポリモーフィズム(継承)

継承を利用したポリモーフィズムの実現です。デリゲートの場合はクラス内でも別クラスでも使えますが、継承は別クラスの場合に有効です。しかもデリゲートに比べると普段のクラス宣言と同じように使用出来ることや特別な記法は不要なので、特にVB.NETな方は…

型変換は何を使う?(その①)

型を覚えるときに必ずセットで出てくる型変換(キャスト)の話です。実は、型変換はC#とVB.NETでだいぶ違います。C#は変換方法がだいたい決まっているのですが、VB.NETでは変換方法がありすぎて、プログラマーによってまちまちなのです。そのため初学者はど…

デリゲートの使いどころ ③(マルチキャストデリゲート)

一つのデリゲートで複数のメソッドを連続で実行することをマルチキャストデリゲートと呼びます。これによってメソッドを任意のタイミングで追加して最後に実行するような処理も簡潔に書くことができます。例えば以下のようなメソッドをデリゲートで呼ぶとし…

シャドウとオーバーライドの違い

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…

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つ目「保留」です。プログラミングを構築していると、長いコードの中でどうしても「クラスの宣言」と「メソッドの実行」を分けて行いたい(タイミングが異なる)場面が結構あ…

継承(フォームの継承)

前回はクラスの継承について説明しましたが、フォームもクラスなわけなので継承可能です。ただ、コードを継承する場合と違い、コントロールを継承する場合は少しひと手間必要です。 継承するフォームの宣言 継承するフォームをコード上に宣言しますが、C#とV…