构造函数是否返回空值

本文关键字:空值 返回 是否 构造函数 | 更新日期: 2023-09-27 18:32:56

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

构造函数是否返回空值

在常规的理智代码中,构造函数不会返回null 。有一些复杂的方法可以强制构造函数返回null,但这是一个如此奇怪的边缘情况,你永远不会看到它。对于所有意图和目的:此对象上的new永远不会返回null - 并且在new()后添加 null 检查是完全没有意义的,尤其是对于像 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 { }

根据ReSharper:

if (resourceReader != null)

表达永远是真实的

那是因为StreamReader构造函数永远不会返回null事实上,我想不出构造函数会在我脑海中返回null的任何时间。

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

构造函数返回其类引用。 并且它不为空。

构造

函数不应将 null 值返回到 Everywhere 和 On EveryTime