0Pricing
C# Academy · Урок

Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)

В C# 6 нет ссылочных типов, допускающих null (string?). Изучите безопасную обработку null: проверки входных данных, понятную документацию, вспомогательный метод Require.NotNull и отличие от Nullable для типов значений.

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

Осведомлённость о NRT и запасной вариант

Идея: обнуляемые ссылочные типы (например, string?) добавляют проверки компилятора в новых версиях C#.

  • C# 6 не поддерживает string?
  • Используйте защитные проверки, понятную документацию и простые вспомогательные методы
  • По умолчанию возвращайте не-null

Защита от null

Добавляйте проверки с помощью ArgumentNullException для параметров ссылочного типа, а затем рассматривайте значения как не равные null.

using System;

public static class Greeter
{
  // Contract: name must not be null (C# 6 has no string? to enforce)
  public static string Hello(string name)
  {
    if (name == null) throw new ArgumentNullException("name"); // guard
    return "Hello " + name.ToUpper(); // safe after guard
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(Greeter.Hello("Ada"));
    try
    {
      Console.WriteLine(Greeter.Hello(null)); // will throw (by design)
    }
    catch (Exception ex)
    {
      Console.WriteLine("Caught: " + ex.GetType().Name);
    }
  }
}

Вспомогательный метод Require.NotNull

Создайте небольшой вспомогательный метод Require.NotNull, чтобы уменьшить шаблонный код и сделать намерение очевидным.

using System;

public static class Require
{
  // Works for reference types; returns the validated value
  public static T NotNull<T>(T value, string name) where T : class
  {
    if (value == null) throw new ArgumentNullException(name);
    return value;
  }
}

public sealed class Email
{
  public string Address { get; private set; }

  public Email(string address)
  {
    Address = Require.NotNull(address, "address").Trim();
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Email e = new Email("user@mail.com");
    Console.WriteLine(e.Address);
  }
}

Nullable<T> и ссылочные типы

Nullable<T> (например, int?) предназначен для типов значений. Ссылочные типы уже могут иметь значение null, поэтому в C# 6 мы используем защитные проверки.

using System;

public class Program
{
  public static void Main(string[] args)
  {
    int x = 5;              // value type (non-nullable)
    int? maybe = null;      // Nullable<T> works for value types
    Console.WriteLine("x=" + x);
    Console.WriteLine("maybe has value? " + maybe.HasValue);
    Console.WriteLine("maybe or default: " + (maybe ?? -1));
  }
}

Документирование контрактов null

Указывайте допустимость null в документации XML и будьте последовательны: либо всегда возвращайте не-null, либо явно документируйте случаи, когда возможно значение null.

using System;

/// <summary>
/// Parses "key=value" and returns the value part.
/// Returns null if the format is invalid.
/// </summary>
public static class Parser
{
  // Explicitly document when null can be returned.
  public static string TryGetValue(string line)
  {
    if (line == null) throw new ArgumentNullException("line");
    int idx = line.IndexOf("=");
    if (idx < 0 || idx == line.Length - 1) return null; // documented nullable return
    return line.Substring(idx + 1);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(Parser.TryGetValue("a=1"));
    Console.WriteLine(Parser.TryGetValue("oops")); // prints nothing (null)
  }
}

Контрольный список безопасности от null (C# 6)

Контрольный список:

  • Проверяйте входные данные с помощью ArgumentNullException.
  • По умолчанию возвращайте не-null; документируйте все возвращаемые значения, которые могут быть null.
  • Используйте небольшие вспомогательные методы (Require.NotNull), чтобы код оставался аккуратным.
  • Когда это уместно, отдавайте предпочтение перегрузкам, исключающим null (например, пустой строке вместо null).

Безопасность от null в C# 6

Быстрая проверка: в C# 6 (без обнуляемых ссылочных типов) какой подход помогает уменьшить количество ошибок, связанных с null, в общедоступных API?

Повторение

Повторение: NRT — более новая возможность. В C# 6 обеспечивайте безопасность с помощью защитных проверок, понятной документации, вспомогательных методов и предсказуемых контрактов, возвращающих не-null.

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

Урок «Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)» бесплатный?

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

Чему я научусь в уроке «Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)»?

В C# 6 нет ссылочных типов, допускающих null (string?). Изучите безопасную обработку null: проверки входных данных, понятную документацию, вспомогательный метод Require.NotNull и отличие от Nullable… Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

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

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.

Сколько времени занимает урок «Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обобщённые методы и типы; ограничения
  2. Вариативность (in/out) с интерфейсами и делегатами
  3. Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)
← Назад к C# Academy