0Pricing
C# Academy · Урок

unmanaged, notnull, new() (эмуляция в C# 6)

C# 6 поддерживает ограничения class/struct/new(); эмулируйте более новые ограничения notnull/unmanaged с помощью проверок, формы API и соглашений.

«unmanaged, notnull, new() (эмуляция в C# 6)» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Обзор ограничений типов

Цель: эффективно использовать обобщённые ограничения C# 6.

  • класс и структура
  • new() для создания без активатора
  • Имитация notnull/unmanaged с помощью защитных проверок и проектирования API

Класс и структура

класс ограничивает 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() гарантирует наличие публичного конструктора без параметров, поэтому обобщённый код может напрямую вызвать 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 и явных проверок на null внутри API.

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. Можно использовать структуру и интерфейсы (например, 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.
  • Используйте new(), если нужно создавать T.
  • Имитируйте notnull с помощью проверок во время выполнения.
  • Имитируйте unmanaged через структуру и документированное использование (обычно для примитивных числовых типов).

Ограничение конструктора

Быстрая проверка: какое ограничение в C# 6 требует публичного конструктора без параметров у аргумента типа?

Повторение

Повторение: используйте класс/структуру/new() в C# 6. Имитируйте notnull проверками на null, а намерение unmanaged выражайте ограничениями на структуру и интерфейс.

Часто задаваемые вопросы

Урок «unmanaged, notnull, new() (эмуляция в C# 6)» бесплатный?

Да — полный текст урока «unmanaged, notnull, new() (эмуляция в C# 6)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «unmanaged, notnull, new() (эмуляция в C# 6)»?

C# 6 поддерживает ограничения class/struct/new(); эмулируйте более новые ограничения notnull/unmanaged с помощью проверок, формы API и соглашений. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 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