Как сделать возвращаемое значение необязательным для метода, если это возможно? - PullRequest
2 голосов
/ 09 апреля 2010

У меня есть метод private static DataTable ParseTable(HtmlNode table), и иногда этот метод не имеет возвращаемого значения, тогда я хочу сделать возвращаемое значение необязательным.

Я пытался с if условие. Но есть ошибка.

Как я могу сделать возвращаемое значение необязательным для метода, если это возможно?

Ответы [ 5 ]

13 голосов
/ 09 апреля 2010

Нельзя сделать возвращаемое значение необязательным.

Вы можете вернуть либо null, либо пустое DataTable:

return new DataTable();

OR

return null;

Какой из них прав? Это зависит от логики вашего приложения и от того, сколько null проверок вы готовы выполнить в вызывающих функциях.

Обновление: (следующий комментарий)

Вот как вернуть условно (предполагается, что переменная называется dataTable):

 if(gotTable)
 {
   return dataTable;
 }
 else
 {
   return null;
 }
5 голосов
/ 09 апреля 2010

Вот для чего null. Ваш метод может не возвращать объект, возвращая null.

Имейте в виду, что возвращение null может усложнить задачу для вызывающих абонентов, поскольку они должны проверить нулевое значение перед использованием возвращенной ссылки, поэтому в некоторых случаях может быть лучше вернуть Null Object .

4 голосов
/ 09 апреля 2010

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

2 голосов
/ 09 апреля 2010

Если ваш метод называется ParseTable, и он не может выполнить "Parse" a "Table", то он должен вызвать исключение. Преимущество этого заключается в том, что исключение может дать вызывающей стороне информацию о том, почему он не может выполнить синтаксический анализ (HTML был недействительным, неожиданный столбец и т. Д.). Проблема с возвратом нулевого значения состоит в том, что неожиданное исключение нулевой ссылки почти никогда не сообщает вам причину проблемы.

"Правильный" способ создать метод, который пытается разобрать таблицу, но, к счастью, ничего не делает, если не может быть найден результат:

public bool TryParseTable(HtmlNode table, out DataTable result){
    // your code...
    if(success)
    {
        result = //the table you parsed
        return true;
    }
    else
    {
        result = null;
        return false;
    }
}

Хорошо, так что «result» может быть нулевым после вызова этого метода, но, по крайней мере, вызывающая сторона более склонна использовать оператор if благодаря типу возвращаемого значения и имени метода.

0 голосов
/ 09 апреля 2010
private static void ParseTable(HtmlNode table, out DataTable data)
{
   // do the parse, fill bool gotTable 
   data = gotTable ? new DataTable() : null;
}

private static void ParseTable(HtmlNode table)
{
   ParseTable(table, out null);
}

если звонящему нужен стол

DataTable data;
ParseTable(table, out data);

если нет

ParseTable(table);

РЕДАКТИРОВАТЬ: Я не могу найти, как реализовать необязательные out/ref параметры. Так что, возможно, это невозможно до .NET 4.0 или полностью невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...