C# 如何检查对象是否为空

5

我在if语句中遇到了检查对象是否为空的问题。

我有一个webClient尝试从网站获取JSON字符串,在try/catch中进行。如果出现错误,则是因为API中不存在3位数的国家代码,我只想跳过它。

这是我的代码:

    System.Net.WebClient wc = new System.Net.WebClient();

    RootObject ro;
    try
    {
        string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());

        JavaScriptSerializer js = new JavaScriptSerializer();

        ro = js.Deserialize<RootObject>(resp);
    }
    catch (Exception e)
    { }

    if (ro.Region != null)
    {
        Row.Region = ro.Region;
        Row.SubRegion = ro.Subregion;
    }

RootObject是一个用于反序列化的类。这部分工作很好。

然而,在if语句中,我遇到了一个错误:“未赋值的类‘ro’的使用”。

有人能帮我解决这个问题吗?在if语句中,ro按预期工作吗?

我还尝试检查特定节点,但仍然卡在“ro”部分。

此外,这是SSIS中的脚本组件。

谢谢


2
如果抛出错误并执行“catch”路径,则未初始化“ro”。这就是为什么会出现此错误的原因。 - croxy
那么就直接赋值。如果没有被分配,你希望程序做什么? - user202729
我希望它跳过并退出。如果API没有返回任何内容,那基本上已经完成了。 - KeithL
4
将 "Change RootObject ro to RootObject ro = null; and change ro.Region != null to ro?.Region != null" 翻译为中文: 将“更改RootObject ro 为 RootObject ro = null;”并将“ro.Region != null”更改为“ro?.Region != null”。 - Murray Foxcroft
Murray解决了它。我以为它开始是null。 - KeithL
4个回答

9
  1. It is possible that the try block will never assign a value to ro and thus it will be unassigned outside of try block. To fix that, assign a value:

    RootObject ro = null;
    
  2. Since ro could be null, you need to check for that in your if statement before you try to access a member:

    if (ro != null && ro.Region != null)
    {
        Row.Region = ro.Region;
        Row.SubRegion = ro.Subregion;
    }
    

谢谢。解决这个问题真的很棒。我还将if语句更改为if(ro!= null),并获得了期望的结果。 - KeithL

6

ro一个默认值,将RootObject ro更改为RootObject ro = null;

ro.Region != null更改为ro?.Region != null,以允许ro为空。

可能需要对吞咽的异常进行处理。

System.Net.WebClient wc;

RootObject ro = null;
try
{
    wc = new System.Net.WebClient();
    string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());

    JavaScriptSerializer js = new JavaScriptSerializer();

    ro = js.Deserialize<RootObject>(resp);
}
catch (Exception e)
{
    // Log your error
}

if (ro?.Region != null)
{
    Row.Region = ro.Region;
    Row.SubRegion = ro.Subregion;
}

4

对象 ro 应该被初始化,因为它在 try 块之外被调用。

RootObject ro = null;
try
{
    string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());

    JavaScriptSerializer js = new JavaScriptSerializer();

    ro = js.Deserialize<RootObject>(resp);
}
catch (Exception e)
{ }

if (ro?.Region != null)
{
    Row.Region = ro.Region;
    Row.SubRegion = ro.Subregion;
}

3

使用RootObject ro = null;初始化ro,并将if语句更改为

if (ro?.Region != null)
{
    Row.Region = ro.Region;
    Row.SubRegion = ro.Subregion;
}

这样的语句将检查 ro 是否为 null 或者 ro.Region 是否为 null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接