@ledsun blog

無味の味は佳境に入らざればすなわち知れず

C#

Windows Formの同期イベントハンドラーから入れ子になった非同期関数を呼ぶとデッドロックする

await と Task.Result によるデッドロックによるとWindows FormでTaskを使ったときにデッドロックするケースがあるようです。 検証してみます。 デッドロックするソースコード 試しに次のようなコードを書いてみました。 namespace AwaitDeadLockEight { pub…

NUnitをつかってテストコードを書くときのテストメソッド名の命名規則

NUnitのテストの命名規則をどうするとわかりやすくなるのか悩ましいのでまとめてみます。 describe と context がない NUnitにはRSpecとちがいdescribeとcontextに相当する機能がありません。 NUnitの公式のサンプルコードを見てみましょう。 https://github…

不慣れなプログラミング言語の定石を知るのにChatGPT

例えば、PHPでJSONファイルを読み込みたいとき PHPでJSONファイルを読み込むときの回答 例えば、PHPUnitでテストヘルパーを作りたいとき PHPUnitのヘルパー関数の定義方法の回答 例えば、Windows FormのDataGridViewでチェックボックスをクリックしたときに…

「デバッガーでの例外設定」とfinallyブロック内のブレークポイント

C#をデバッグ実行するとfinallyブロックに入らない - @ledsun blogを書いたら、つぎのような情報をもらいました。 「例外発生時に停止する」みたいな設定がONになってるんじゃないかしらhttps://t.co/pFsNahAN1B https://t.co/x5w89PxzzH— いわた (@wonderfu…

C#をデバッグ実行するとfinallyブロックに入らない

こういうC#のソースコードがあります。 using System; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) { try { var hoge = 0; var fuga = 1; var piyo = fuga / hoge; } finally { Console.WriteLine("finally"); } } }…

Roslynを使ってC#のクラス名を変更する

Roslynを使ってC#のソースコードを編集する - @ledsun blog でRoslynをつかうとC#のソースコードが編集出来るとわかりました。 編集内容を変えて練習します。 クラス名を変えてみます。 using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp;…

Roslynを使ってC#のソースコードを編集する

自分で自分用のC#のソースコード編集ツールをつくったら捗りそうなことに気がつきました。 ググってみたら GitHub - dotnet/roslyn: The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs. というのでC#のソース…

複数プログラミング言語をいっぺんに実行するスクリプトをMakefileで書く

C#とJavaScriptとRubyのプログラミングを比較するためにGitHub - ledsun/enumerable: C#とJavaScriptとRubyのコレクション操作を比較するためのリポジトリです。を作りました。 動作確認のために、全部のプログラムをバーンと実行するスクリプトが欲しいです…

C#とJavaScriptとRubyのコレクション操作

大抵のプログラミング言語でコレクション(列挙できる何か)をメソッドチェーンで操作できます。 プログラミング言語ごとに、ちょっとずつちがうので整理してみようと思います。 僕の馴染みのあるC#、JavaScript、Rubyでそれぞれ書いてみます。 お題 お題は…

C#でFizzBuzz

C# FizzBuzz Switch Solution - Stack Overflow のみたことないタイプのパターンマッチングを参考にしました。 static string FizzBuzz(int number) { return number switch { < 1 or > 100 => "", _ => (number % 3, number % 5) switch { (0, 0) => "FIZZB…

snapを使ってdotnetコマンドをインストールする

Snap を使用して Linux に .NET をインストールする - .NET | Microsoft Docs の手順でインストールしてみます。 $ sudo snap install dotnet-sdk --classic --channel=6.0 [sudo] password for ledsun: $ dotnet-sdk (6.0/stable) 6.0.301 from Microsoft .…

NUnitのパラメタライズドテスト

NUnitではTestCase属性で、テスト関数にわたす引数が設定出来ます。 TestCase | NUnit Docs のサンプルを例にすると、次です。 [TestCase(12, 3, ExpectedResult=4)] [TestCase(12, 2, ExpectedResult=6)] [TestCase(12, 4, ExpectedResult=3)] public int D…

アプリケーション構成ファイルはなくてもよい

Visual Studioで.NET Frameworkを使ったアプリケーションをつくろうとするとプロジェクトにApp.configというファイルができます。 Windows FormなりWPFなりのデスクトップアプリケーションの場合、ビルドすると出力ディレクトリに実行ファイル名.configとい…

.NET 6に挨拶する

次のメッセージボックスを表示するだけのアプリケーションです。 表示するメッセージボックス Visual Studio 2022で、新しいプロジェクトを追加して「Windowsフォームアプリ」を選びます。 .NET Frameworkのバージョンは6にします。 Program.csの内容を次の…

.NET FrameworkのPrintPreviewControl.Documentプロパティは.NET 4からInvalidatePreviewメソッドを呼ぶ

とあるアプリケーションの対象とする.NET Frameworkのバージョンを上げたところ printPreviewControl.Document = pd; という、一見、副作用がなさそうなソースコードの有無で振るまいが変わるようになりました。 調べてみたら、表題の通り、PrintPreviewCont…

オブジェクト指向設計とは

オブジェクト指向という言葉には オブジェクト指向分析(OOA) オブジェクト指向設計(OOD) オブジェクト指向プログラミング(OOP) の三つの意味があります。 オブジェクト指向初心者泣かせです。 ここではオブジェクト指向設計を説明します。 ソフトウェアの設…

DAOの詳細設計 C#編

J2EEパターンから始まって今となっては一般的になったDAOパターン、の詳細設計。 DTO DTOは更新時間、更新ユーザ以外のテーブルカラムをすべて持たせる。 カラム名とプロパティ名を対応させておくとINSERTとUPDATEのSQLを動的に生成できて楽。 マスタメンテ…

ASP.NET GridViewのヘッダ固定スクロール IE8以降

スタイルシートの用意。scroll1クラスをtableに指定します。 *1 .scroll1 thead, .scroll1 tbody { float: left; } .scroll1 tbody { height: 100px; overflow-y: scroll; } GridViewはデフォルトではtheadを生成しないので、次のおまじない*2 *3。 GridView…

よくやる単純作業リファクタリング

C#

usingの並べ替え Ctrk + K, Ctrl + D ローカル変数の型をvarに 余計な空行を削除 一回しか使わないローカル変数をインライン展開 定義順変更 DAOのメソッドをCRUD順に並べる ユーザコントロールのメソッドを、public、イベントハンドラ、privateの順に並べる…

文字列をカンマでつないだ時に最後のカンマをつけない方法

つい配列にJoinして、インテリセンスがLINQっぽい表示を出し、「何Joinだっけ〜?」と頭を悩ますのでメモ。

C#3.0のLINQと拡張メソッドでリファクタリング

リファクタリングしたらC#3.0、特にLINQと拡張メソッドが素晴らしいことを実感しました。例示します。 元コード C#2.0で書きました。 リファクタリング後 C#3.0です。大きい変更点は ループをLIQNとstring.Joinに置き換え インスタンスメソッドを拡張メソッ…

ページ遷移用のヘルパークラス

前回のエントリのようにクエリストリングにURLに使えない文字列を入れる時は、Responce.Reideirectに渡す前にURLエンコーディングする必要があります。毎回エンコードを意識するのは面倒なので以下のようなクラスを作ってみました。 使い方 hoge=fugaという…

背景色を薄くする

C#

背景色を薄くするためにRGBを変更します。 int oldColor = BackColor.ToArgb(); int r = (oldColor & 0x00FF0000) >> 16; int g = (oldColor & 0x0000FF00) >> 8; int b = oldColor & 0x000000FF; int addValue = 20; r = (r + addValue) > 0xFF ? 0xFF : r …

System.Webを使わずにTwitterで発言する

C#

WebClientの代わりにWebRequestを使い、HttpUtility.UrlEncodeの代わりにUri.EscapeUriStringを使うとSystem.webへの参照を追加する必要がなくなります。WebRequestはデフォルトでGETメソッドを使うため明示的にPOSTメソッドを指定する必要があります。 usin…

Twitterで発言する

C#

C#からTwitterに発言するコードです。NetworkCredential生成の第一引数にTwitterのユーザ名、第二引数をパスワードを入れれば発言することが出来ます。 コンソールプロジェクトを新規作成し、System.Webへの参照を追加し、下記のプロジェクトを張り付ければ…

Round関数の四捨五入とJIS丸め

C#

.NET FrameworkではRound関数は四捨五入ではなく、JIS丸め*1という方式をとっています。次のように四捨五入とは違う結果が返ってきます。 using System; using System.Data; using NUnit.Framework; using NUnit.Framework.SyntaxHelpers; [TestFixture] pub…

反復子ブロック

C#

前回作成したGetEnumuratorメソッドで反復しブロックがどのようなコードを生成したかReflector*1で見てみましょう。 public IEnumerator<int> GetEnumerator() { <GetEnumerator>d__0 d__ = new <GetEnumerator>d__0(0); d__.<>4__this = this; return d__; } d__0というクラスを返すメソッドと</getenumerator></getenumerator></int>…

GetEnumeratorの実装。

C#

C#で自作のクラスをforeach文で呼び出したい場合はGetEnumuratorメソッドを実装すればforeach文で呼び出せるようになります*1。次のforeach文は foreach (int i in new Simplest()) { Console.WriteLine(i); } 以下のシンタックスシュガーです。 IEnumerator…

インデクサの実装

C#

C#で以下のようなインデックスを指定するアクセスメソッドを持ったクラスを、インデクサ*1で置き換えたいと思うことがあると思います。 public class MyDic { private Dictionary<string, string> _data; public string GetAt(string index) { return _data[index]: } } クラ</string,>…

InternalTestCaseパターン

C#

http://www.itarchitect.jp/technology_and_programming/-/35057-2.htmlNUnitで書くとこんな感じになります。 JUnit4と大体同じだと思いますが、staticなクラスはテストできないので注意が必要です。 製品コードとテストコードがすぐ隣にあるのがいいですね…