Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# foreach语句中存在Null引用错误_C# - Fatal编程技术网

C# foreach语句中存在Null引用错误

C# foreach语句中存在Null引用错误,c#,C#,我在以下代码中得到一个空引用错误: string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist); string albumName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum); string songTitle = mov.get_Annotation((int)QTAnnotations

我在以下代码中得到一个空引用错误:

string artistName =     mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName =     mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle =     mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);
foreach (char c in artistName)
{
    artistName = artistName.Replace("?", "");
    artistName = artistName.Replace("*", "");
    artistName = artistName.Replace("/", "");
    artistName = artistName.Replace(":", "");
}
foreach (char c in albumName)
{
    albumName = albumName.Replace("?", "");
    albumName = albumName.Replace("*", "");
    albumName = albumName.Replace("/", "");
    albumName = albumName.Replace(":", "");
}
我从另一个人的项目中复制了这段代码,虽然我基本上理解了正在发生的事情,但我无法找出错误。错误在for each(artistName中的字符c)行上。
谢谢您的帮助。

首先,这段代码开头不好。对字符串进行迭代没有意义,但每次都要对其执行相同的替换

但是,问题的原因只能是
artistName
为空-当然,其他两个字符串也可能为空

你很可能想要这样的东西:

string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);

artistName = RemoveSymbols(artistName);
albumName = RemoveSymbols(albumName);

...

private static string RemoveSymbols(string input)
{
    if (input == null)
    {
        return input;
    }
    return input.Replace("?", "")
                .Replace("*", "")
                .Replace("/", "")
                .Replace(":", "");
}

如果找不到任何特定的注释,则在此之后仍将有空引用,但它不会引发异常。您只需要确定如何处理这些缺失的值。(例如,您可能希望使用硬编码的“未知”值,或者可能是空字符串。)

首先,此代码开头不好。对字符串进行迭代没有意义,但每次都要对其执行相同的替换

但是,问题的原因只能是
artistName
为空-当然,其他两个字符串也可能为空

你很可能想要这样的东西:

string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);

artistName = RemoveSymbols(artistName);
albumName = RemoveSymbols(albumName);

...

private static string RemoveSymbols(string input)
{
    if (input == null)
    {
        return input;
    }
    return input.Replace("?", "")
                .Replace("*", "")
                .Replace("/", "")
                .Replace(":", "");
}

如果找不到任何特定的注释,则在此之后仍将有空引用,但它不会引发异常。您只需要确定如何处理这些缺失的值。(例如,您可能希望使用硬编码的“未知”值,或者可能是空字符串。)

您可以在删除以下特殊字符之前添加验证

artistName= RemoveSymbols(artistName);
albumName= RemoveSymbols(albumName);

private static string RemoveSymbols(string input)
{
    if(!String.IsNullOrEmpty(input))
       return input;

    return  Regex.Replace(input, "[?*/:]", string.Empty);
}

现在您将不会得到
Null reference error
,但您需要找到从
mov.get_Annotation
方法接收Null值的原因。您可以在删除以下特殊字符之前添加验证

artistName= RemoveSymbols(artistName);
albumName= RemoveSymbols(albumName);

private static string RemoveSymbols(string input)
{
    if(!String.IsNullOrEmpty(input))
       return input;

    return  Regex.Replace(input, "[?*/:]", string.Empty);
}
现在您将不会得到
空引用错误
,但您需要找到从
mov接收空值的原因。get_Annotation
方法

C
提供了合并运算符
的优点。试着这样使用:

string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName  = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle  = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);

artistName = Regex.Replace(artistName ?? "" , @"[\*\:\/\?]" , "");
albumName  = Regex.Replace(albumName  ?? "" , @"[\*\:\/\?]" , "");
songTitle  = Regex.Replace(songTitle  ?? "" , @"[\*\:\/\?]" , "");
C#
提供了聚结运算符的优点
??
。试着这样使用:

string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName  = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle  = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);

artistName = Regex.Replace(artistName ?? "" , @"[\*\:\/\?]" , "");
albumName  = Regex.Replace(albumName  ?? "" , @"[\*\:\/\?]" , "");
songTitle  = Regex.Replace(songTitle  ?? "" , @"[\*\:\/\?]" , "");

artistName
null
。当您在
string artistName=…
上设置断点时,会看到什么?我知道,但我该如何做才能使艺术家名称不为null?我基本上需要删除非法字符才能使用目录中的字符串。我正在制作这个程序,但我有点需要它。看看我的
artistName
也是
null
。当你在
string artistName=…
上设置断点时,你会看到什么?我知道,但是我该怎么做才能使artistName不为null?我基本上需要删除非法字符才能使用目录中的字符串。我正在做这个程序,但我有点需要它。也看看我的。谢谢它停止了错误,不幸的是现在我的程序冻结了,没有错误:/@Tom:我建议你研究一下原因,如果你卡住了,再问一个新问题,并提供适当的细节。谢谢它停止了错误,不幸的是,现在我的程序冻结了,没有出现错误:/@Tom:我建议你先诊断一下原因,如果你遇到问题,再问一个新问题,并附上适当的细节。