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 (文字列として比較)
== 等しい
終了コードを取得する
※doループを使うときなどは環境変数の即時展開に注意%errorlevel% 等しい
一定時間待つ
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 を使用する
- プロジェクトを右クリック
- → 追加 → 参照 → Windows で以下を追加
・Windows.Data
・Windows.Ui - 名前空間を追加
using Windows.UI.Notifications; - コード
ToastNotificationManager.CreateToastNotifier("Microsoft.Windows.Computer").Show(toast);
・外部 dll 追加不要
・Windows 8.1 ではトーストが表示されない (CreateToastNotifier() の引数が不適切なのかも知れないが未調査)
- 【設定】 [VS2022] C# Winforms でトーストを使う (Microsoft公式情報)
-
Microsoft.Toolkit.Uwp.Notifications を使用する
- プロジェクトを右クリック
- NuGetパッケージの管理をクリック
- Microsoft.Toolkit.Uwp.Notificationsを検索、インストール
- 名前空間を追加
using Microsoft.Toolkit.Uwp.Notifications; - エラーがでる場合は、プロジェクトの [参照] 右クリック → [PackageReference] で packages.config をクリック
- 通知や通知のボタンのクリックを検出するには 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]
- チェックあり : タブをスペースに変換する
- チェックなし : タブをスペースに変換しない
[Editor: Tab Size] = スペースの文字数 n を入力
- 【設定】 [VS code] 空白文字(タブ, スペース)を表示有無の変更
-
[メニューバー] → [ファイル] → [ユーザー設定] → [設定] → 検索ボックスに入力 "whitespace"
[Editor: Render Whitespace]
- none : 表示しない
- boundary : 単語間の単一空白文字のみ表示
- selection : 選択中のみ空白文字を表示
- trailing : 末尾の空白文字のみ表示
- all : すべての空白文字を表示
- 【設定】 [VS code] インデントのタブ・スペース一括変換
-
開いたファイルのインデントを自動的に読み取って表示 → ステータスバー
-
ステータスバー [タブのサイズ:X]
[インデントをタブに変換] または [インデントをスペースに変換] を選択 -
[メニューバー] → [表示] → [コマンドパレット] → 入力 "インデント"
[インデントをタブに変換] または [インデントをスペースに変換] を選択
-
ステータスバー [タブのサイズ:X]
- 【インストール】 [VS code] オフラインPCへのインストール
-
本体
-
ダウンロード
- VSCode公式ページ を開く
- (インストーラーを使う場合) [Download for Windows] ボタンを押してダウンロードする
- (インストーラーを使わない場合:ポータブルモード) [Download for Windows] ボタンの右の下向き矢印を押す
- [Download for Windows] ボタンの右の下向き矢印を押す
- [Other downloads] を押して表示されるページから Windows の zip をダウンロードする
-
インストール
- (インストーラーを使う場合) インストーラーを実行する
- (インストーラーを使わない場合::ポータブルモード) zip ファイルを展開するだけ
-
ダウンロード
- Marketplace の Japanese Language Pack for Visual Studio Code) を開く
- 右列 [Resources] の [Download Expression] を押してダウンロードする
-
インストール
- (インストーラーを使う場合) 下記「日本語化」参照、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;
-
プロジェクト [プロパティ]→[設定] で以下の3項目を作成する。
- 【フォーム位置,サイズ保存】 [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.
- 自作のマニフェストファイルをプロジェクトから除外