Ссылочные типы, допускающие 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
Повторение
Повторение: 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 — локальная установка не требуется.
Все уроки этого курса
- Обобщённые методы и типы; ограничения
- Вариативность (in/out) с интерфейсами и делегатами
- Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)