Общий тип возврата в С#
Практиковал Дженерики. Рассмотрим метод стека ниже. Каков наилучший способ проверки ошибок, кроме исключения исключений в универсальном методе. Что делать, если я хочу вернуть некоторый результат в этот метод.
public T pop()
{
if (top >= 0)
return arr[top--];
return -1 or null;
}
Ответы
Ответ 1
Единственное, что вы можете сделать, это вернуть default(T)
, который является значением по умолчанию для типа T
(null
для ссылочных типов, ноль для целых типов и объекта с нулевыми полями для других типов значений). Однако это, как правило, плохая идея, так как вы не сможете различить 0
, который был выписан, или 0
, который указывает на ошибку. Исключения, как правило, лучший способ пойти в таких случаях, но вы также можете изменить свой метод следующим образом:
public bool TryPop(out T value)
{
if (top >= 0)
{
value = arr[top--];
return true;
}
value = default(T);
return false;
}
Ответ 2
Вы можете сделать return default(T)
, который вернет 0 инициализированных типов значений (например, все числовые типы будут инициализированы до 0) и null для ссылочных типов.
Ответ 3
Кажется, что ваш вопрос действительно состоит из двух частей
Первая часть - это предоставление значения по умолчанию, если оно недоступно. Как отмечают другие люди, выражение С# default(T)
будет работать для этого сценария. Он возвращает null
для ссылочных типов и 0 инициализированных значений для структур.
Вторая часть - это лучший способ справиться с ошибкой, кроме как исключить исключение. API-интерфейсы Collection обычно используют шаблон TryXXX для этого типа сценариев.
bool TryPop(out T value) {
if ( top >= 0 ) {
value = arr[top--];
return true;
}
value = default(T);
return false;
}
Ответ 4
Я пришел сюда в поисках решения немного другой проблемы, включая статический метод, который принимает два генерических массива и возвращает новый общий массив. Поскольку мой метод был статичным, я не мог использовать этот пример, кроме как вдохновения. Вместо этого я разработал следующее решение.
T [ ] raMerged = ( T [ ] ) alMerged.ToArray ( typeof ( T ) );
return raMerged;
В приведенном выше фрагменте alMerged является ArrayList общих объектов T.
Это удовлетворяет условиям контракта, указанному сигнатурой метода, который выглядит следующим образом.
public static T [ ] MergeNewItemsIntoArray<T> (
T [ ] paMasterList ,
T [ ] paNewItems )
where T : IComparable , new ( )
В сигнатуре предложение where иллюстрирует мое решение другой проблемы, которую я нашел в нескольких потоках, ни одна из которых непосредственно не рассматривала этот вопрос. Тем не менее, надеюсь, это поможет хотя бы одной другой душе.
Ответ 5
Твой вопрос непонятен. Проверка ошибок может быть выполнена так же, как и всегда, - исключение. Приобретение ошибок обычно должно выполняться путем исключения исключений. В конце концов, это то, за что они нужны.
Если вы хотите вернуть null
, вы можете это сделать, но тогда вам нужно убедиться, что тип T
- это класс, а не структура, например:
public T pop()
where T: class
{
...
}
Ответ 6
Если вы хотите вернуть null, когда стек пуст, вы можете попробовать что-то вроде этого:
class GenericStack<T>
{
T[] arr;
int top;
public T pop()
{
if (top >= 0)
return arr[top--];
return default(T);
}
}
И тогда вы можете использовать его следующим образом:
var stack = new GenericStack<int?>();
var res = stack.pop(); // res will be null
Обратите внимание, что объект стека имеет тип int? поэтому мы можем вернуть нули.
Ответ 7
Прямой подход (использование генериков и возвращаемое значение или нуль)
class DemoClass<T> where T : struct
{
public T? PopValueOrNull()
{
if ( this._top >= 0 ) {
return this._arr[this._top--];
}
return null;
}
}