Что такое default (object); делать в С#?

Вопрос:Googling только подходит с ключевым словом, но я наткнулся на какой-то код, который говорит MyVariable = default(MyObject); и мне интересно, что это значит... Лучший ответ: Для ссылочного типа он возвращает null Для значения типа, отличного от Nullable, он возвращает нулевое значение Для Nullable он возвращает пустое (псевдо-нулевое) значение (на самом деле это повторная постановка второй

Вопрос:

Googling только подходит с ключевым словом, но я наткнулся на какой-то код, который говорит

MyVariable = default(MyObject);

и мне интересно, что это значит…

Лучший ответ:

  • Для ссылочного типа он возвращает null
  • Для значения типа, отличного от Nullable<T>, он возвращает нулевое значение
  • Для Nullable<T> он возвращает пустое (псевдо-нулевое) значение (на самом деле это повторная постановка второй пули, но стоит сделать ее явной)

Самое большое использование default(T) в дженериках, и такие вещи, как шаблон Try…:

bool TryGetValue(out T value) { if(NoDataIsAvailable) { value = default(T); // because I have to set it to *something* return false; } value = GetData(); return true; }

Как это бывает, я также использую его в некотором генерации кода, где больно инициализировать поля/переменные, но если вы знаете тип:

bool someField = default(bool); int someOtherField = default(int) global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType); Ответ №1

default ключевое слово вернет null для ссылочных типов и zero для числовых типов значений.

Для struct s он возвращает каждый член структуры, инициализированный нулем или нулем, в зависимости от того, являются ли они значениями или ссылочными типами.

из MSDN

Simple Sample code :<br> class Foo { public string Bar { get; set; } } struct Bar { public int FooBar { get; set; } public Foo BarFoo { get; set; } } public class AddPrinterConnection { public static void Main() { int n = default(int); Foo f = default(Foo); Bar b = default(Bar); Console.WriteLine(n); if (f == null) Console.WriteLine(«f is null»); Console.WriteLine(«b.FooBar = {0}»,b.FooBar); if (b.BarFoo == null) Console.WriteLine(«b.BarFoo is null»); } }

ВЫВОД:

0 f is null b.FooBar = 0 b.BarFoo is null Ответ №2

Значение по умолчанию MyObject. См. ключевое слово по умолчанию в общем коде (руководство по программированию на С#) (MSDN):

В родовых классах и методах возникает одна проблема: как назначить значение по умолчанию параметризованного типа T, если вы не знаете заблаговременно:

  • Будет ли T ссылочным типом или типом значения.
  • Если T – тип значения, будет ли это числовое значение или структура.

Учитывая переменную t параметризованного типа T, оператор t = null действует только в том случае, если T является ссылочным типом, а t = 0 будет работать только для числовые значения, но не для структур. Решение состоит в том, чтобы использовать ключевое слово по умолчанию, которое будет возвращать значение null для ссылочных типов и ноль для числовых значений. Для структур будет возвращен каждый член структура, инициализированная нулем или нулем, в зависимости от того, являются ли они значения или ссылочные типы. Следующий пример из Класс GenericList показывает, как использовать ключевое слово по умолчанию. Для большего информацию см. в разделе Общие сведения.

public class GenericList<T> { private class Node { //… public Node Next; public T Data; } private Node head; //… public T GetNext() { T temp = default(T); Node current = head; if (current != null) { temp = current.Data; current = current.Next; } return temp; } } Ответ №3

Задает значение по умолчанию для type. Это будет null для ссылочные типы и нуль для значения типы.

См. по умолчанию

Ответ №4

Ключевое слово default возвращает значение “по умолчанию” или “пустое” для переменной запрашиваемого типа.

Для всех ссылочных типов (определенных с помощью class, delegate и т.д.) это null. Для типов значений (определенных с помощью struct, enum и т.д.) Это значение с нулевым значением (например, int 0, DateTime 0001-01-01 00:00:00 и т.д.).

В основном он используется с общим кодом, который может применяться как к ссылочным, так и к типам значений, поскольку вы не можете назначить null переменной типа значения.

Ответ №5

Он установит значение объекта по умолчанию для переменной:
null для ссылочных типов и 0 для типов значений.

Ответ №6

Возможно, это может вам помочь:

using System; using System.Collections.Generic; namespace Wrox.ProCSharp.Generics { public class DocumentManager < T > { private readonly Queue < T > documentQueue = new Queue < T > (); public void AddDocument(T doc) { lock (this) { documentQueue.Enqueue(doc); } } public bool IsDocumentAvailable { get { return documentQueue.Count > 0; } } } }

Невозможно назначить нулевые общие типы. Причина в том, что общий тип также может быть создан как тип значения, а null разрешен только с ссылочными типами. Чтобы обойти эту проблему, вы можете использовать ключевое слово по умолчанию. С ключевым словом по умолчанию null присваивается ссылочным типам, а 0 – типам значений.

public T GetDocument() { T doc = default(T); lock (this) { doc = documentQueue.Dequeue(); } return doc; }

Ключевое слово по умолчанию имеет несколько значений в зависимости от контекста, в котором он используется. Выключатель
оператор использует значение по умолчанию для определения случая по умолчанию, а с помощью дженериков значение по умолчанию используется для инициализации общих типов либо нулями, либо 0 в зависимости от того, является ли это ссылочным или типом значения.

Оцените статью
Добавить комментарий