Programming tips

(Last Update : 2025/11/03)
【設定】 [VS code] 文字コードを自動判定する
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → [テキストエディター] → [ファイル] または
左下歯車アイコン(管理) → [設定] → [テキストエディター] → [ファイル]
[Auto Guess Encoding]
  • off : 自動判定しない
  • on : 自動判定する
【設定】 [VS2022] 「診断ツール」を表示する
デバッグ実行中に [デバッグ] → [ウィンドウ] → [診断ツールの表示]
【コーディング】[コマンドプロンプト/バッチファイル] カレントパスを取得、現在の日付・時刻を取得、空行を出力、条件分岐、終了コードを取得、一定間隔で繰り返し実行
cd %~dp0
set logfile=log.txt

@echo off

: loop1

: loop2
(ここで何か実行)
echo %date% %time%
rem time /t
echo.
if %errorlevel% geq 1 goto loop2

timeout 600 /nobreak
rem powershell sleep 600

goto loop1

@echo on
実行されているファイルのパスを取得する
%~dp0 実行されているファイルのパスを取得する
%0 実行されているファイルのフルパス
~ %0から"(ダブルクオート)を除く
d %0をドライブ文字だけに展開する
p %0をファイル名だけに展開する

現在の日付・時刻を取得する
%date% %time% 日付 時刻を取得する
time /t 時刻を出力する

空行を出力する
echo. 空行を出力する

条件分岐 if (数値として比較)
equ 等しい
neq 等しくない
gtr より大きい
geq 以上
leq 以下
lss より小さい(=未満)

条件分岐 if (文字列として比較)
== 等しい

終了コードを取得する
%errorlevel% 等しい
※doループを使うときなどは環境変数の即時展開に注意

一定時間待つ
timeout 600 /nobreak カウントダウンあり
キー入力による中断なし
powershell sleep 600 指定時間スリープ
【設定】 [VS2022] [C#6.0 VS2015 ~] string.Format("{}") を文字列補間 $"{}" に置き換えると...
  • 直観的かつ短い書式になるのでコーディングしやすい
    string.Format() string s = string.Format("a の値は {0}, b の値は {1}", a, b);
    文字列補間 $ string s = $"a の値は {a}, b の値は {b}";

  • コンパイルは通ってしまい実行時に例外発生となるコーディングミスも、コンパイルエラーになるのでみつけやすい
    例1 引数不足 string s = string.Format("a の値は {0}, b の値は {1}", a);
    例2 書式ミス string s = string.Format("[0}", s);

  • どちらでも書式設定は可能
    [3桁区切り] 1,000 var n = 1000;
    string s = string.Format("{0:#,0}", n);
    string s = $"{n:#,0}";
    [3桁区切り, 小数点] 1,000.00 var n = 1000;
    string s = string.Format("{0:N}", n);
    string s = $"{n:N}";
    [3桁区切り, 通貨記号] \1,000 var n = 1000;
    string s = string.Format("{0:C}", n);
    string s = $"{n:C}";
    [桁数指定, ゼロ埋め] 0010 var n = 10;
    string s = string.Format("{0:0000}", n);
    string s = string.Format("{0:D4}", n);
    string s = $"{n:0000}";
    string s = $"{n:D4}";
    [桁数指定, 16進数表記] 0a
    [桁数指定, 16進数表記] 0A
    var n = 10;
    string s = string.Format("{0:x2}", n);
    string s = string.Format("{0:X2}", n);
    string s = $"{n:x2}";
    string s = $"{n:X2}";
    [日付] 2022/02/13
    [日付] 2022年2月13日
    var d = DateTime.Now;
    string s = string.Format("{0:yyyy/MM/dd}", d);
    string s = string.Format("{0:d}", d);
    string s = string.Format("{0:D}", d);
    string s = $"{d:yyyy/MM/dd}";
    string s = $"{d:d}";
    string s = $"{d:D}";
    [時刻] 10:13
    [時刻] 10:13:03
    var d = DateTime.Now;
    string s = string.Format("{0:t}", d);
    string s = string.Format("{0:T}", d);
    string s = $"{d:t}";
    string s = $"{d:T}";
    [日時] 2022年2月13日 10:13
    [日時] 2022年2月13日 10:13:03
    [日時] 2022/02/13 10:13
    [日時] 2022/02/13 10:13:03
    var d = DateTime.Now;
    string s = string.Format("{0:f}", d);
    string s = string.Format("{0:F}", d);
    string s = string.Format("{0:g}", d);
    string s = string.Format("{0:G}", d);
    string s = $"{d:f}";
    string s = $"{d:F}";
    string s = $"{d:g}";
    string s = $"{d:G}";
    [月日] 2月13日
    [年月] 2022年2月
    var d = DateTime.Now;
    string s = string.Format("{0:M}", d);
    string s = string.Format("{0:m}", d);
    string s = string.Format("{0:Y}", d);
    string s = string.Format("{0:y}", d);
    string s = $"{d:M}";
    string s = $"{d:m}";
    string s = $"{d:Y}";
    string s = $"{d:y}";
    [日時(UTC)] 2022/02/13 01:13:03
    [日時(UTC)] 2022-02-13 01:13:03Z
    var d = DateTime.Now;
    string s = string.Format("{0:U}", d);
    string s = string.Format("{0:u}", d);
    string s = $"{d:U}";
    string s = $"{d:u}";
    [日時(ISO 8601)] 2022-02-13T10:13:03.1585180+09:00
    [日時(ISO 8601)] 2022-02-13T10:13:03
    var d = DateTime.Now;
    string s = string.Format("{0:O}", d);
    string s = string.Format("{0:o}", d);
    string s = string.Format("{0:s}", d);
    string s = $"{d:O}";
    string s = $"{d:o}";
    string s = $"{d:s}";
    [日時(RFC1123)] Sun, 13 Feb 2022 10:13:03 GMT var d = DateTime.Now;
    string s = string.Format("{0:R}", d);
    string s = string.Format("{0:r}", d);
    string s = $"{d:R}";
    string s = $"{d:r}";
    [パーセント] 10.00% var n = 0.1;
    string s = string.Format("{0:P}", n);
    string s = $"{n:P}";

【設定】 [VS2022] C# Winforms でトーストを使う (非公式な方法)
Microsoft.Toolkit.Uwp.Notifications を使用する
  1. プロジェクトを右クリック
  2. → 追加 → 参照 → Windows で以下を追加
    ・Windows.Data
    ・Windows.Ui
  3. 名前空間を追加
    using Windows.UI.Notifications;
  4. コード
    ToastNotificationManager.CreateToastNotifier("Microsoft.Windows.Computer").Show(toast);
[参考]
・外部 dll 追加不要
・Windows 8.1 ではトーストが表示されない (CreateToastNotifier() の引数が不適切なのかも知れないが未調査)
【設定】 [VS2022] C# Winforms でトーストを使う (Microsoft公式情報)
Microsoft.Toolkit.Uwp.Notifications を使用する
  1. プロジェクトを右クリック
  2. NuGetパッケージの管理をクリック
  3. Microsoft.Toolkit.Uwp.Notificationsを検索、インストール
  4. 名前空間を追加
    using Microsoft.Toolkit.Uwp.Notifications;
  5. エラーがでる場合は、プロジェクトの [参照] 右クリック → [PackageReference] で packages.config をクリック
  6. 通知や通知のボタンのクリックを検出するには ToastNotificationManagerCompat.OnActivated イベントを追加
[参考]
・(Microsoft) C# アプリからローカル トースト通知を送信する
.NET5のWPFアプリでインタラクティブなトースト通知を実装する
・(@IT) 便利なUWP用拡張機能/NuGetパッケージを発見!
・(Microsoft) packages.config から PackageReference への移行
[備考]
・exe + Microsoft.Toolkit.Uwp.Notifications.dll + System.ValueTuple.dll になる
・Windows 8.1 で以下の例外発生 (Windows10 SDK を参照するようになることに起因 ?)
System.InvalidOperationException: Failed initializing notifications ---> System.MissingMethodException: メソッドが見つかりません: 'Windows.UI.Notifications.ToastNotificationHistory Windows.UI.Notifications.ToastNotificationManager.get_History()'
【設定】 [VS code] テキストの折り返しを設定する
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → [テキストエディター] または
左下歯車アイコン(管理) → [設定] → [テキストエディター]
[Editor: Word Wrap]
  • off : 折り返さない
  • on : エディターの幅で折り返す
  • WordWrapColumn : editor.wordWrapColumn で設定した値で折り返す
  • bounded : 表示領域と editor.wordWrapColumn で設定した値で、幅の小さいほうで折り返す
【設定】 [VS code] フォントを変更する
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → [テキストエディター] → [フォント] または
左下歯車アイコン(管理) → [設定] → [テキストエディター] → [フォント]
[Editor: Font Family]
  • 複数のフォントを指定する場合はカンマで区切る (指定順で優先される)
  • フォント名がスペースを含む場合はクオーテーションで囲む
  • 例: Consolas, 'メイリオ', monospace (デフォルト 'Courier New' から変更)
【設定】 [VS code] フォントサイズを変更する
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → [テキストエディター] → [フォント] または
左下歯車アイコン(管理) → [設定] → [テキストエディター] → [フォント]
[Editor: Font Size] (ピクセル単位)
【設定】 [VS code] 開いたファイルで使われているインデント方式を使用する
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → 検索ボックスに入力 "indentation"
[Editor: Detect Indentation]
  • チェックあり : ファイルがファイルの中身に基づいて開かれる場合、Editor: Tab Size と Editor:Insert Spaces を自動的に検出する
【設定】 [VS code] タブをn個のスペースに変換する/しない
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → 検索ボックスに入力 "insert spaces"
[Editor: Insert Spaces]
  • チェックあり : タブをスペースに変換する
  • チェックなし : タブをスペースに変換しない
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → 検索ボックスに入力 "tabSize"
[Editor: Tab Size] = スペースの文字数 n を入力
【設定】 [VS code] 空白文字(タブ, スペース)を表示有無の変更
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → 検索ボックスに入力 "whitespace"
[Editor: Render Whitespace]
  • none : 表示しない
  • boundary : 単語間の単一空白文字のみ表示
  • selection : 選択中のみ空白文字を表示
  • trailing : 末尾の空白文字のみ表示
  • all : すべての空白文字を表示
【設定】 [VS code] インデントのタブ・スペース一括変換
開いたファイルのインデントを自動的に読み取って表示 → ステータスバー
  • ステータスバー [タブのサイズ:X]
    [インデントをタブに変換] または [インデントをスペースに変換] を選択
  • [メニューバー] → [表示] → [コマンドパレット] → 入力 "インデント"
    [インデントをタブに変換] または [インデントをスペースに変換] を選択
【インストール】 [VS code] オフラインPCへのインストール
本体
  • ダウンロード
    • VSCode公式ページ を開く
    • (インストーラーを使う場合) [Download for Windows] ボタンを押してダウンロードする
    • (インストーラーを使わない場合:ポータブルモード) [Download for Windows] ボタンの右の下向き矢印を押す
    • [Download for Windows] ボタンの右の下向き矢印を押す
    • [Other downloads] を押して表示されるページから Windows の zip をダウンロードする
  • インストール
    • (インストーラーを使う場合) インストーラーを実行する
    • (インストーラーを使わない場合::ポータブルモード) zip ファイルを展開するだけ
日本語化オプション
  • ダウンロード
  • インストール
    • (インストーラーを使う場合) 下記「日本語化」参照、vsixファイルを指定
    • (インストーラーを使わない場合:ポータブルモード) VSCodeを展開したフォルダ内にdataフォルダを作成する
    • Code.exeを起動する
    • 左下のアイコン [EXTENSIONS(拡張機能)]を押す
    • [EXTENSIONS] バー右上の…を押す
    • [Install from VSIX...] を押す
    • VSIXファイルを選択する
    • しばらくすると右下にポップアップが表示されるので
    • [Restart Now] をクリックして再起動する
【設定】 [VS code] 日本語化
[メニューバー] → [View] → [command palette] → [configure display language] → [install additional languages...] → [Japanese Language Pack for Visual Studio Code]
【自動スケーリング】 [VS2019] AutoScaleModeを設定してもDataGridViewの列幅や複数行のTextBoxの幅,高さなどは自動追従しない
自力で調整する
【自動スケーリング】 [VS2019] AutoScaleModeを設定しても自動スケーリングに追従しない場合
app.manifest のこの設定が有効か確認する
<application xmlns="urn:schemas-microsoft-com:asm.v3">
 <windowsSettings>
  <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
 </windowsSettings>
</application>
【MailKit, MimeKit】 [VS2019] NuGetパッケージ の追加・更新
[プロジェクト] → [NuGetパッケージの管理]
【管理者として実行】 [VS2017/2019] マニフェストファイルを設定
[プロジェクト]→[新しい項目の追加]→[Visual C# アイテム]→[アプリケーション マニフェスト ファイル (Windows のみ)]
[プロパティ]→[構成プロパティ]→[リンカー]→[マニフェストファイル]
requestedExecutionLevel level="asInvoker" → "requireAdministrator"
【フォーム位置,サイズ保存】 [VS2017/2019] 前回終了時のフォームのポジション・サイズ・状態で起動する
  • プロジェクト [プロパティ]→[設定] で以下の3項目を作成する。
    名前 種類 スコープ
    F1Location System.Drawing.Point ユーザー 0,0
    F1Size System.Drawing.Size ユーザー 0,0
    F1State System.Windows.Forms.FormWindowState ユーザー Normal
  • FormClosing で保存する。
    (namespace が異なると Properties がないエラーになるので注意。)
     Properties.Settings.Default.F1State = this.WindowState;
     if (this.WindowState == FormWindowState.Normal)
     {
      // WindowState が Normal なら location, size を記憶する
      Properties.Settings.Default.F1Location = this.Location;
      Properties.Settings.Default.F1Size = this.Size;
     }
     else
     {
      // minimized, maximized なら RestoreBounds の Location, Size を記憶する
      Properties.Settings.Default.F1Location = this.RestoreBounds.Location;
      Properties.Settings.Default.F1Size = this.RestoreBounds.Size;
     }
     // 設定を保存する
     Properties.Settings.Default.Save();
  • Load で読み込む。
    (ディスプレイの変動などで前回の Location, Size が表示領域外になっている場合もあるので注意。)
     this.Location = Properties.Settings.Default.F1Location;
     this.Size = Properties.Settings.Default.F1Size;
【フォーム位置,サイズ保存】 [VS2017/2019] フォーム起動時・終了時のイベントを追加する
フォーム [デザイン]→[プロパティ]→[イベント(雷アイコン)]→[動作] Load, FormClosing
【編集】 [VS2019] タブをスペースに変換しない
[ツール]→[オプション]→[テキストエディター]→[すべての言語 or いずれかの言語を選択]→[タブ]
  • [タブ] → [空白を挿入] から [タブを保持] に選択変更
  • [タブ] → [タブのサイズ] [インデントのサイズ] = 4 (お好みで)
  • [インデント] → [ブロック] [スマート] はお好みで
【編集】 [VS2017] インデント設定
[ツール]→[オプション]→[テキストエディター]→[すべての言語 or いずれかの言語を選択]→[タブ]
  • [空白を挿入] = スペース
  • [タブを保持] = タブ
【編集】 [VS2017/2019] sdf と ipch を別フォルダーにすることでプロジェクトのサイズを小さくする
[ツール]→[オプション]→[テキストエディター]→[C/C++]→[詳細]→[フォールバック位置]
  • [常にフォールバック位置を使用] False → True 変更
  • [フォールバック位置] = フォルダー名指定
【編集】 [VS2017] 一括自動インデント
エディターでソースコードを一括自動インデントするショートカットキー。
  • ファイル全体:Ctrl-K, Ctrl-D
  • 選択範囲:Ctrl-K, Ctrl-F
【移植時の警告・エラー】 [VS2019] LNK4075 : /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。
(https://qiita.com/gocha/items/d690f1240813aef8b303)
UseDebugLibraries 属性が不足している。
プロジェクトをアップグレードすると vcxproj ファイルに本来記述されるべき UseDebugLibraries 属性が記述されないため、vcxproj ファイルをテキストエディタで開いて記述を追加する。
  • <PropertyGroup Condition = "'$(Configuration)|$(Platform)'=='Debug|Win32'" Label = "Configuration"> に <UseDebugLibraries>true</UseDebugLibraries> を追記
  • <PropertyGroup Condition = "'$(Configuration)|$(Platform)'=='Release|Win32'" Label = "Configuration"> に <UseDebugLibraries>false</UseDebugLibraries> を追記
【移植時の警告・エラー】 [VS2019] warning MSB8012 : TargetPath(….exe) が Linker の OutputFile プロパティ値(….exe) と一致しません。このため、プロジェクトが正常にビルドされない可能性があります。この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、 % (Link.OutputFile) で指定されている値と一致することを確認してください。
[プロジェクト]右クリック →[プロパティ] →[構成プロパティ] →[リンカー] →[全般]
[出力ファイル] 出力ファイル名指定から「親またはプロジェクトの規定値から継承」変更
【移植時の警告・エラー】 [VS2019] 警告D9035:オプション 'Gm'は非推奨になり、将来のリリースで削除されます
[プロジェクト]右クリック →[プロパティ] →[構成プロパティ] →[C / C++] →[コード生成]
[最小リビルドを有効にする] 「はい(/ Gm)」→「いいえ(/ Gm - )」または「親またはプロジェクトの規定値から継承」変更
【移植時の警告・エラー】 [VS2017/2019] エラー D8016 コマンド ライン オプション '/ZI' と '/Gy-' は同時に指定できません
[プロジェクト]→[構成プロパティ]→[C/C++]→[コード生成]
[関数レベルでリンクする] 「いいえ(/Gy-)」→「はい(/Gy)」または「親またはプロジェクトの規定値から継承」変更
【移植時の警告・エラー】 [VS2017/2019] ビルド警告:セキュリティ強化版の関数に変更
引数・戻り値も変わるので注意
  • fopen() → fopen_s()
  • sprintf() → sprintf_s()
  • strcpy() → strcpy_s()
  • strncpy() → strncpy_s()
  • localtime() → localtime_s()
【移植時の警告・エラー】 [VS2017] エラー C3861 'exit': 識別子が見つかりませんでした
【移植時の警告・エラー】 [VS2019] エラー C3861 'free': 識別子が見つかりませんでした
【移植時の警告・エラー】 [VS2019] エラー C3861 'malloc': 識別子が見つかりませんでした
#include <stdlib.h> を追加
【移植時の警告・エラー】 [VS2017] エラー RC1015 cannot open include file 'afxres.h'.
#include "afxres.h" → #include "winres.h" に変更
【移植時の警告・エラー】 [VS2017] エラー c1010001 Values of attribute "level" not equal in different manifest snippets.
自作のマニフェストファイルをプロジェクトから除外