2010-04-09 3 views
2

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

Я пробовал с if condition.But есть ошибка.

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

ответ

13

Вы не можете сделать возвращаемое значение опционным.

Ваши два варианта либо возвращать null или пустой DataTable:

return new DataTable(); 

ИЛИ:

return null; 

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

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

Это как вернуть условно (предполагается, что переменная с именем DataTable):

if(gotTable) 
{ 
    return dataTable; 
} 
else 
{ 
    return null; 
} 
+0

@Oded, но как я могу написать оператор возврата в if condition like if table got then return datatable else null? – Harikrishna

+4

OMG! у вас есть код в вашем предложении :) – Amsakanna

+0

@ Oded, ok..I думал, что если мы сделаем возвращаемое значение условно, оно дает ошибку. спасибо ... Sir .. – Harikrishna

4

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

5

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

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

0
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); 

EDIT: Я не могу найти, как реализовать дополнительные out/ref параметры. Так что, возможно, это невозможно до .NET 4.0 или полностью невозможно.

+0

Ошибка компилятора у вас там! – leppie

+0

@leppie: Спасибо, исправлено. – abatishchev

+0

Только частично исправлено: P – leppie

2

Если ваш метод называется ParseTable, и он не выполняет «Parse» «Таблица», тогда он должен вызывать исключение. Преимущество этого заключается в том, что исключение может предоставить информацию о вызывающем абоненте о том, почему он не может разобрать (html был недействительным, неожиданным столбцом и т. Д.). Проблема с возвратом null заключается в том, что неожиданное исключение из-за исключения исключений почти никогда не говорит о причине проблемы.

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

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

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

+0

@Rob Fonseca-Ensor, что такое 'out' в параметре для метода? – Harikrishna

+0

@Harikrishna http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx –

Смежные вопросы