4

我正在编写 C# 程序,VisualStudio 的 VSTO 向导生成以下代码。

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)是多余的,因为构造函数总是返回不为空。不是吗?

4

5 回答 5

8

在常规的理智代码中,构造函数不会返回null。有一些复杂的方法可以强制构造函数返回null,但这是一个非常奇怪的边缘情况,你永远不会看到它。出于所有意图和目的:new在这个对象上永远不会返回null- 在 a 之后添加一个空检查是完全没有意义的new(),特别是对于像StreamReader.

一个可以得到 null的简单案例:

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 { }
于 2013-09-26T11:06:17.137 回答
1

根据 ReSharper:

if (resourceReader != null)

表达总是正确的

那是因为StreamReader构造函数永远不会返回null。事实上,我想不出任何时候构造函数返回null

于 2013-09-26T11:04:00.070 回答
0

构造函数不应该每次都返回 Null 值

于 2013-09-26T12:51:55.730 回答
0

构造函数返回它们的类引用。它不为空。

于 2013-09-26T11:14:38.057 回答
0

Readline或其他方法可以返回 null 但streamreader不会。因为您是在创建实例的同时分配实例。所以检查是没有用的。

于 2013-09-26T11:03:39.543 回答