Подтвердить что ты не робот

Общий тип возврата в С#

Практиковал Дженерики. Рассмотрим метод стека ниже. Каков наилучший способ проверки ошибок, кроме исключения исключений в универсальном методе. Что делать, если я хочу вернуть некоторый результат в этот метод.

public T pop()
{
    if (top >= 0)
        return arr[top--];
    return -1 or null;
}
4b9b3361

Ответ 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; 
    }
}