2013-09-26 2 views
4

Я пишу программу C#, а мастер VSTO VisualStudio генерирует код ниже.Возвращает ли конструктор null?

private static string GetResourceText(string resourceName) 
{ 
    Assembly asm = Assembly.GetExecutingAssembly(); 
    string[] resourceNames = asm.GetManifestResourceNames(); 
    for (int i = 0; i < resourceNames.Length; ++i) 
    { 
     if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0) 
     { 
      using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i]))) 
      { 
       if (resourceReader != null) 
       { 
        return resourceReader.ReadToEnd(); 
       } 
      } 
     } 
    } 
    return null; 
} 

Я думаю if (resourceReader != null) является излишним, так как конструктор всегда возвращает не нулевое. Не так ли?

+5

Это правильно, 'resourceReader' никогда не может быть пустым в данном случае - это либо выбросить исключение, или возвращать' StreamReader' – CodingIntrigue

ответ

6

В обычном нормальном коде конструктор не возвращает null. Там : несколько запутанных способов: force конструктор для возврата null, но это такой причудливый край, что вы его никогда не увидите. Во всех смыслах: new на этом объекте никогда не вернется null - и совершенно бессмысленно добавлять нулевую проверку после new(), особенно для чего-то разумного, например StreamReader.

простого случай, когда вы можете получить нуль:

object obj = new int?() 

Но это просто выставляя тонкое поведение бокса обнуляемых типов. Чем сложнее способа получения застройщика вернуться null требует зол:

static void Main() { 
    var obj = new MyFunnyType(); // wow! null! 
} 

class MyFunnyProxyAttribute : ProxyAttribute { 
    public override MarshalByRefObject CreateInstance(Type serverType) { 
     return null; 
    } 
} 
[MyFunnyProxy] 
class MyFunnyType : ContextBoundObject { } 
+5

Вы пропустили директиву: 'using System.Evil;' –

+0

«Позвольте мне рассказать вам небольшую историю о человеке по имени« Shhh » –

+0

Я буду осторожен с Proxies ... – unarist

0

Readline или другие методы могут возвращать null, но streamreader не будет. Поскольку вы назначаете экземпляр одновременно, вы его создаете. Поэтому бесполезно проверять.

1

По ReSharper:

if (resourceReader != null) 

Выражение всегда верно

Это потому, что StreamReader конструктор будет никогда возвращение null. На самом деле, я не могу думать ни о каком времени с моей головы, где конструктор будет когда-либо return null.

+0

Я не уверен, что я буду полагаться на R #, его эвристика иногда ошибочна. – svick

+0

@svick 99/100 они обычно находятся на месте. – mattytommo

+0

На самом деле это можно сделать - даже для классов; Я отредактирую его в моем примере, но это просто для любопытства. –

0

конструктора вернуть их ссылку на класс. и он не равен нулю.

0

Конструкторы не должен возвращаться неопределенных значения Везде и на EVERYTIME

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