C# Academy · レッスン

unmanaged、notnull、new()(C# 6でのエミュレーション)

C# 6はclass/struct/new()制約をサポートします。新しいnotnull/unmanagedは、ガード、APIの形、規約によって再現します。

レッスン 1/38 ステップ

「unmanaged、notnull、new()(C# 6でのエミュレーション)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

制約の全体像

目標: C# 6のジェネリック制約を効果的に使います。

  • classとstructの使い分け
  • アクティベーターなしで生成するためのnew()
  • ガードとAPI設計でnotnull/unmanagedを再現する

classとstruct

classはTを参照型に限定し、structはTを値型に限定します。誤った使い方はコンパイル時に失敗します。

using System;

// Works only for reference types
public static class RefBox
{
  public static string Show<T>(T value) where T : class
  {
    return value == null ? "null ref" : "ref: " + value.ToString();
  }
}

// Works only for value types
public static class ValBox
{
  public static string Show<T>(T value) where T : struct
  {
    return "value: " + value.ToString();
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    string s = "hello";
    int n = 42;

    Console.WriteLine(RefBox.Show<string>(s)); // OK
    Console.WriteLine(ValBox.Show<int>(n));    // OK

    // Console.WriteLine(RefBox.Show<int>(n)); // compile-time error (int is struct)
    // Console.WriteLine(ValBox.Show<string>(s)); // compile-time error (string is class)
  }
}

実際のnew()

new()は、引数なしのpublicコンストラクターがあることを保証するため、ジェネリックコードから直接new T()を呼び出せます。

using System;

// Requires public parameterless ctor on T
public static class Factory
{
  public static T Create<T>() where T : new()
  {
    return new T(); // safe in C# 6 with new()
  }
}

public sealed class Sample
{
  public string Name { get; set; }
  public Sample() { Name = "default"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Sample x = Factory.Create<Sample>();
    Console.WriteLine("Created: " + x.Name);
  }
}

notnullの再現

C# 6にはnotnullがありません。where T : classと、API内部での明示的なnullガードによって近似します。

using System;

// C# 6 has no notnull constraint. Use where T : class and guard at runtime.
public static class NotNullApi
{
  public static int LengthOf<T>(T x) where T : class
  {
    if (x == null) throw new ArgumentNullException("x");
    return x.ToString().Length; // placeholder usage
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(NotNullApi.LengthOf<string>("hi")); // 2
    try
    {
      Console.WriteLine(NotNullApi.LengthOf<string>(null)); // throws
    }
    catch (Exception ex)
    {
      Console.WriteLine("Guard fired: " + ex.GetType().Name);
    }
  }
}

unmanagedの意図を再現

C# 6にはunmanagedがありません。structとインターフェース(例: IComparable)を使って、数値に近い値型を対象にできます。

using System;

// No unmanaged constraint in C# 6.
// Use struct for value types and restrict API usage (document numeric-only intent).
public static class NumericOps
{
  public static T Max<T>(T a, T b) where T : struct, IComparable
  {
    // Works for numeric primitives because they implement IComparable
    return (a.CompareTo(b) >= 0) ? a : b;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(NumericOps.Max<int>(3, 9));     // 9
    Console.WriteLine(NumericOps.Max<double>(2.5, 2)); // 2.5
  }
}

実践的なヒント

ヒント:

  • 早い段階でTを絞り込むためにclass/structを選びます。
  • Tを生成する必要がある場合はnew()を使います。
  • 実行時ガードでnotnullを再現します。
  • structと使用方法のドキュメント(多くの場合は数値プリミティブ)でunmanagedを再現します。

コンストラクター制約

確認問題: 型引数にpublicな引数なしコンストラクターを要求するC# 6の制約はどれですか?

振り返り

振り返り: C# 6ではclass/struct/new()を使います。nullチェックでnotnullを、structとインターフェース制約でunmanagedの意図を再現します。

無料で開始

AI チューターと学ぶ C# — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
93
レッスン
346

よくある質問

「unmanaged、notnull、new()(C# 6でのエミュレーション)」レッスンは無料ですか?

はい。「unmanaged、notnull、new()(C# 6でのエミュレーション)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「unmanaged、notnull、new()(C# 6でのエミュレーション)」で何を学びますか?

C# 6はclass/struct/new()制約をサポートします。新しいnotnull/unmanagedは、ガード、APIの形、規約によって再現します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「unmanaged、notnull、new()(C# 6でのエミュレーション)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. unmanaged、notnull、new()(C# 6でのエミュレーション)
  2. ジェネリック数学(概要)とジェネリック属性(関連する場合)
  3. 再利用可能なジェネリックユーティリティ
← C# Academyに戻る