Каталог статей
обзор
Ключевое слово по умолчанию может использоваться в следующих контекстах:
- Задает регистр по умолчанию в операторе switch.
- В качестве оператора по умолчанию или значения по умолчанию для типов генерации текста.
- В качестве ограничения типа по умолчанию для переопределения универсального метода или явной реализации интерфейса.
Задает регистр по умолчанию в операторе switch
DisplayMeasurement(-4); // Output: Measured value is -4; too low.
DisplayMeasurement(5); // Output: Measured value is 5.
DisplayMeasurement(30); // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN); // Output: Failed measurement.
void DisplayMeasurement(double measurement)
{
switch (measurement)
{
case < 0.0:
Console.WriteLine($"Measured value is {
measurement}; too low.");
break;
case > 15.0:
Console.WriteLine($"Measured value is {
measurement}; too high.");
break;
case double.NaN:
Console.WriteLine("Failed measurement.");
break;
default:
Console.WriteLine($"Measured value is {
measurement}.");
break;
}
}
Функция такова: если все случаи не выполняются, он войдет по умолчанию, если не написано, он сразу выскочит из переключателя
как оператор по умолчанию по умолчанию или тип генерации текста по умолчанию
тип | По умолчанию |
---|---|
любой ссылочный тип | нулевой |
тип значения | нуль |
логический | ЛОЖЬ |
перечисление | Значение, созданное выражением (E)0, где E — идентификатор перечисления. |
структура | Сгенерированные значения устанавливаются путем установки всех полей типов значений в их значения по умолчанию и всех полей ссылочных типов в значение null. |
обнуляемый тип | Экземпляр, в котором свойство HasValue имеет значение false, а свойство Value не определено. |
default был улучшен в C# 7.1, default(T) больше не нужен
//变量赋值
C#7.0
var s = "字符串";
s = default(string);
C#7.1
var s = "字符串";
s = default;
//初始化赋值
C#7.0
var dstring = default(string);
var dint = default(int);
var dintNull = default(int?);
var d = default(dynamic);
var dt = default(DateTime);
var dt1 = default(DateTime?);
C#7.1
string s = default;
int i = default;
DateTime? dt = default;
dynamic d = default;
//可选参数
C#7.0
void Test(int a, string b = default(string))
{
}
C#7.1
void Test(int a, string b = default)
{
}
как ограничения типа по умолчанию для переопределений универсального метода или явных реализаций интерфейса
Добавление ссылочного типа, допускающего значение NULL, может создать двусмысленность в значении T? для универсальных методов. Если T является структурой, T? совпадает с System.Nullable. Однако, если T является ссылочным типом, T? указывает, что null является допустимым значением. Причина неоднозначности в том, что переопределяющие методы не могут содержать ограничений. Новое ограничение по умолчанию устраняет эту неоднозначность. Ограничение добавляется, когда базовый класс или интерфейс объявляют две перегрузки метода (одна с указанием ограничения структуры, а другая без применения ограничения структуры или класса):
public abstract class B
{
public void M<T>(T? item) where T : struct {
}
public abstract void M<T>(T? item);
}
Используйте ограничение по умолчанию, чтобы указать, что производный класс переопределяет метод, если в производном классе нет ограничений, или чтобы указать явную реализацию интерфейса. Эта практика действительна только для методов или явных реализаций интерфейса, которые переопределяют базовые методы:
public class D : B
{
// Without the "default" constraint, the compiler tries to override the first method in B
public override void M<T>(T? item) where T : default {
}
}
источник
Знакомство с использованием ключевого слова C# по умолчанию (выражение значения по умолчанию)
Выражение значения по умолчанию — создание значения по умолчанию