首页 > 解决方案 > 元组 .Find 和对象引用未设置为对象的实例

问题描述

我有一个包含 HTTP 标头及其值的元组。我的这部分代码使用 Content-Encoding: 标头来确定内容是使用 gzip 压缩还是 deflate 压缩的。

var contentEncoding = responseHeaders.Find(p => p.Item1.ToLower() == "content-encoding");

// decompress the content if needed
if (!String.IsNullOrEmpty(contentEncoding.Item2))
    if (contentEncoding.Item2.ToLower() == "gzip")
        bodyPlain = Tools.Gunzip(ret);
    else if (contentEncoding.Item2.ToLower() == "deflate")
        bodyPlain = Tools.Decompress(ret);
    else
        bodyPlain = UTF8Encoding.UTF8.GetString(ret);
else
    bodyPlain = UTF8Encoding.UTF8.GetString(ret);

我的问题是,如果 responseHeaders.Find 不返回结果,那么 contentEncoding.Item2 不存在,我得到

你调用的对象是空的。

我尝试使用 String.IsNullOrEmpty 和 !=null 检查 contentEncoding.Item2,但它仍然返回上述错误。

我还尝试在使用它之前指定 contentEncoding,如下所示:

var contentEncoding = new Tuple<string,string>("","");
contentEncoding = responseHeaders.Find(p => p.Item1.ToLower() == "content-encoding");

但仍然得到同样的错误。

我在这里做错了什么,有没有更好的方法来实现这一点?

标签: c#nulltuples

解决方案


这似乎对我来说效果更好。感谢 Thomas Schremser 提出的合并运算符的想法:

                    switch (contentEncoding?.Item2.ToLower() ?? String.Empty)
                    {
                        case "":
                            bodyPlain = UTF8Encoding.UTF8.GetString(ret);
                            break;
                        case "gzip":
                            bodyPlain = Tools.Gunzip(ret);
                            break;
                        case "deflate":
                            bodyPlain = Tools.Decompress(ret);
                            break;
                    }

推荐阅读