C#
ハマりポイント— BoxingとGetType()誤用
出典: C# Interface の継承判定と暗黙キャストの定石(is / as / 暗黙キャスト 3パターン) — ハマりポイント— BoxingとGetType()誤用
// ❌罠1:値型InterfaceでBoxing大量発生(性能劣化)
public struct Point : IComparable<Point>
{
public int X { get; set; }
public int Y { get; set; }
public int CompareTo(Point other)=> /* 比較 */;
}
IComparable<Point> cmp = new Point { X = 1, Y = 2 }; // ← Boxing発生
// Pointはstruct(値型)なので、Interface型変数に代入した瞬間にヒープへコピー
//ループ内で大量に発生するとGC負荷で性能劣化
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「ハマりポイント— BoxingとGetType()誤用」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅パターン1: is +パターンマッチ(C# 7以降の本命) public void Process(object data) { if (data is IDataLoader loader)
▶ 実行可
パターン1: is +パターンマッチング(C# 7以降の本命)
#159cd4da0496
// ✅パターン2: as + nullチェック(複数候補をフラットに並べる) public string Describe(object obj) { var loader = obj as IDataLoader;未収録
パターン2: as + nullチェック(複数候補を並べる時)
#303ce1480b7a
// ✅パターン3-a:暗黙キャスト(継承関係が静的型レベルで明確) public class CsvLoader : IDataLoader { /* 実装 */ } CsvLoader csvLoader = new CsvLoader();未収録
パターン3:暗黙キャストと直接キャスト(型が確定している時だけ)
#113b3d707a4c
// ❌罠2: GetType()でInterface判定はできない if (obj.GetType()== typeof(IDataLoader))// ←常にfalse { //ここには到達しない(常にfalse)未収録
ハマりポイント— BoxingとGetType()誤用
#c0d195d72647
