投稿

#18 C#で学ぶ日付と時刻の扱いの基本

C#の日付操作は、`DateTime`という型を使い、分かりやすいメソッド名で操作できるのが特徴です。この記事では、C#における日付の基本的な扱い方と、実務でハマりやすいポイントを解説します。 DateTimeを使う DateTime now = DateTime.Now; Console.WriteLine(now); `DateTime.Now`は実行環境のローカル時刻を返します。サーバーとクライアントで環境が違うアプリでは、後述する`DateTimeOffset`や`DateTime.UtcNow`との使い分けが重要になります。 日付を文字列にする Console.WriteLine(now.ToString("yyyy年MM月dd日")); Console.WriteLine(now.ToString("HH:mm:ss")); `ToString`の引数に渡す書式指定子を変えることで、表示形式を自由にカスタマイズできます。`yyyy`は西暦4桁、`MM`は月(2桁)、`dd`は日(2桁)を表します。よく使う組み合わせは覚えておくと便利です。 文字列から日付に変換する 逆に、文字列を`DateTime`に変換したい場合は`DateTime.Parse`や`DateTime.TryParse`を使います。 string input = "2026-08-18"; if (DateTime.TryParse(input, out DateTime result)) { Console.WriteLine(result); } `Parse`は変換に失敗すると例外を投げますが、`TryParse`は失敗時に`false`を返すだけなので、ユーザー入力のように形式が保証されていない値を扱う場合は`TryParse`を使うのが安全です。 日付を計算する DateTime threeDaysLater = now.AddDays(3); DateTime lastMonth = now.AddMonths(-1); TimeSpan diff = threeDaysLater - now; `AddDays`や`AddMonths`は負の値を渡すことで過去方向への計算も...

#17 C++で学ぶモジュールとパッケージの基本

C++のファイル整理は、伝統的な「ヘッダーファイル」という仕組みに加え、比較的新しい「名前空間」や「モジュール」も使われます。この記事では、C++におけるファイル分割の基本を解説します。 ヘッダーファイルと実装ファイル C++では、関数の宣言を .h ファイルに、中身を .cpp ファイルに分けて書くのが伝統的な方法です。 // utils.h #pragma once void greet(std::string name); // utils.cpp #include "utils.h" #include <iostream> void greet(std::string name) { std::cout << "こんにちは、" << name << "さん" << std::endl; } // main.cpp #include "utils.h" int main() { greet("太郎"); } #pragma once は、同じヘッダーファイルが誤って複数回読み込まれるのを防ぐおまじないです。宣言(何ができるか)と実装(具体的にどう動くか)を分けておくことで、他のファイルからは .h だけを見れば使い方が分かるようになります。 namespaceという仕組み C#と同じく、C++にも namespace という仕組みがあり、名前の衝突を防ぐために使われます。 namespace utils { void greet(std::string name) { std::cout << "こんにちは、" << name << "さん" << std::endl; } } utils::greet("太郎"); 別々のライブラリで同じ名前の関数( greet など)が定義されていても、 namespace で囲んでおけば utils::greet のように区別して呼び出せるため、名前の衝突を避けられます。 C+...

#17 C#で学ぶモジュールとパッケージの基本

C#のファイル整理は「名前空間(namespace)」という仕組みで行います。この記事では、C#における名前空間の基本と、外部ライブラリ(NuGetパッケージ)の使い方をあわせて解説します。 namespaceの宣言 namespace MyProject.Utils { public class Greeter { public static void Greet(string name) { Console.WriteLine($"こんにちは、{name}さん"); } } } C# 10以降では、ファイル全体を1つの名前空間にする場合、波かっこを省略した「ファイルスコープ名前空間」というシンプルな書き方もできます。 namespace MyProject.Utils; public class Greeter { public static void Greet(string name) { Console.WriteLine($"こんにちは、{name}さん"); } } 他の名前空間から使う using MyProject.Utils; Greeter.Greet("太郎"); `using`を書くことで、その名前空間のクラスをフルパス無しで呼び出せるようになります。同じクラス名が複数の名前空間に存在する場合は、`MyProject.Utils.Greeter`のようにフルパスで指定して曖昧さを解消できます。 外部パッケージ(NuGet)を使う 他の人が作ったライブラリを使いたい場合は、NuGetというパッケージ管理の仕組みを使います。 dotnet add package Newtonsoft.Json インストール後は、そのライブラリの名前空間を`using`で読み込めば、自分のコードと同じように使えます。 C#ならではの注意点 C#の`namespace`は、Javaの`package`のようにフォルダ構造と厳密に一致させる必要はありません。とはいえ、多くのプロジェクトではフォルダ構造と名前空間を揃えるのが慣習になっており、Visual Studioも...

#16 C++で学ぶ辞書型(マップ)の基本

C++で名前と値の組み合わせを扱うには、 std::map という仕組みを使います。この記事では、C++における辞書に相当する使い方と、安全な値の取り出し方を解説します。 mapを作ってみる #include std::map scores; scores["太郎"] = 90; scores["次郎"] = 85; 値を取り出す 存在しないキーで直接アクセスすると、その型のデフォルト値が新しく作られてしまうことがあるため、 find() を使って事前に確認するのが安全です。 auto it = scores.find("太郎"); if (it != scores.end()) { std::cout second it->first がキー、 it->second が値を表します。 キーの有無だけを調べる if (scores.count("太郎") > 0) { std::cout 比較的新しいC++では scores.contains("太郎") という、より直感的な書き方も使えます。 全てのキーと値を順に処理する for (const auto& pair : scores) { std::cout 構造化束縛という比較的新しい書き方を使うと、 pair.first ・ pair.second の代わりに、キーと値を直接名前付きで受け取れます。 for (const auto& [name, score] : scores) { std::cout キーが無いときだけ値を設定する 「既にあれば何もせず、無ければ挿入する」という処理は insert を使うと1行で書けます。 scores.insert({"三郎", 78}); // 既に"三郎"キーがあれば何も起きない C++ならではの注意点 std::map は、内部でキーが自動的に並べ替えられて管理されるという特徴があります。 for で繰り返し処理すると、キーの昇順で取り出されることが保証されています。順序を気にしない場合は、 std::unor...

#16 C#で学ぶ辞書型(マップ)の基本

C#で名前と値の組み合わせを扱うには、 Dictionary というクラスを使います。この記事では、C#における辞書(連想配列)の使い方と、実務でよく使う操作を解説します。 Dictionaryを作ってみる var scores = new Dictionary<string, int>(); scores["太郎"] = 90; scores["花子"] = 85; Dictionary<TKey, TValue> のように、キーと値それぞれの型を山かっこの中で指定します。上の例では、キーが文字列( string )、値が整数( int )の辞書を作っています。 値を取り出す 存在しないキーで直接アクセスすると例外が発生するため、 TryGetValue という安全な取り出し方がよく使われます。 if (scores.TryGetValue("太郎", out int score)) { Console.WriteLine(score); } else { Console.WriteLine("見つかりませんでした"); } キーが存在するか確認する 値そのものは不要で、キーの有無だけ調べたい場合は ContainsKey を使います。 if (scores.ContainsKey("太郎")) { Console.WriteLine("太郎さんのデータがあります"); } 削除したい場合は Remove("太郎") を呼び出すだけで、キーと値のペアがまとめて取り除かれます。 全てのキーと値を順に処理する foreach (var pair in scores) { Console.WriteLine($"{pair.Key}: {pair.Value}"); } pair.Key ・ pair.Value のほかに、C# 7.0以降では foreach (var (name, score) in scores) のように、キーと値を直接分解して受け取る書き方も使えます。 C#ならではの注意点 TryGetVal...

#6 Dartで学ぶループの基本

Dartのループは、C言語系の言語に共通する標準的な書き方が基本です。この記事では、Dartにおけるループの基本と、Flutter開発を見据えた使い分けを解説します。 for文の基本 for (int i = 0; i < 5; i++) { print(i); } for-in文でリストの中身を処理する リストの中身を1つずつ処理したい場合は、 for...in を使います。 var fruits = ["りんご", "みかん", "ぶどう"]; for (var fruit in fruits) { print(fruit); } forEachメソッド Dartには、リストに対して直接 forEach を呼び出す書き方もあります。 fruits.forEach((fruit) { print(fruit); }); for...in との違いは、 forEach の中では break や continue が使えない点です。途中でループを止める可能性がある処理には for...in を、単純に全件処理したいだけなら forEach を、というように使い分けるとよいでしょう。 while文 int count = 0; while (count < 5) { print(count); count++; } 「最低1回は必ず実行してから条件を確認したい」場合は do-while を使います。 int count = 0; do { print(count); count++; } while (count < 5); 添字も一緒に取り出したい場合 for...in や forEach だけでは要素の番号(インデックス)が分からないため、番号も必要な場合は asMap() を組み合わせます。 fruits.asMap().forEach((index, fruit) { print("$index: $fruit"); }); Dartならではの注意点 Flutterでリスト表示の画面を作る際は、こうした基本的なループをそのまま使うのではなく、 ListVi...

#5 Dartで学ぶ条件分岐の基本

Dartの条件分岐は、C言語系の言語に共通する標準的な書き方に加えて、null安全と組み合わせた便利な書き方が用意されています。この記事では、Dartにおける条件分岐の基本と、便利な書き方を解説します。 if文の基本 int age = 20; if (age >= 18) { print("成人です"); } else { print("未成年です"); } 複数の条件を順に確認する if (age >= 65) { print("高齢者です"); } else if (age >= 18) { print("成人です"); } else { print("未成年です"); } switch文 候補が多い場合は switch を使います。 switch (day) { case 1: print("月曜日"); break; default: print("その他"); } null安全と組み合わせた書き方 Dartには、値がnullでないことを確認しつつ処理を進める if (value != null) という書き方に加えて、 ?? を使った簡潔な書き方もよく使われます。 String displayName = nickname ?? "名無しさん"; 「nullでなければその値を使い、値があれば処理を続ける」という書き方には ?. も便利です。 int? length = nickname?.length; 三項演算子で短く書く 「条件によって値を1つ選ぶ」だけの単純な分岐は、三項演算子でも書けます。 String status = age >= 18 ? "成人" : "未成年"; ifを式として使う 比較的新しいDartでは、リストやウィジェットを組み立てる際に、コレクションの中で直接 if を使う書き方もできます。 final items = [ "りんご...