检查每个对象级别是否存在。

4
让我们看一个如下的示例模型。
class student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public school SchoolName { get; set; }
}

class school
{
    public int ID { get; set; }
    public string Name { get; set; }
}

student student1 = new student();

我们都知道我们可以通过以下方式访问学校名称。

Console.WriteLine(student1.SchoolName.Name);

如果学校没有被分配给学生,那么student1.SchoolName将为null。所以上述的Console.WriteLine()会失败。
我最终不得不为所有这样的元素编写一个if语句,这很烦人。我们有其他处理这些情况的方法吗?
6个回答

5

试试这个:

Console.WriteLine(student1.SchoolName?.Name);

如果SchoolName为空,则不会评估Name属性。


对于不处理空值的方法,可以扩展为student1.SchoolName?.Name??defaultValue。 - Martheen
3
请注意,这是C# 6.0语法,OP可能正在使用旧版本。 - rexcfnghk
尝试这个: Console.WriteLine(student1.SchoolName == null) ? "" : student1.SchoolName.Name; - Baahubali

2
很遗憾,我们需要在之前的C#版本中进行显式null检查。
C# 6.0中,我们有了Null-Conditional运算符?
如果运算符左侧为null,则该运算符将其结果类型的null级联到右侧。这个运算符正是您要寻找的功能。
因此,您可以这样做。
Console.WriteLine(student1.SchoolName?.Name);

简而言之,如果您将 . 替换为空条件运算符 ?.,它将沿着链路级联空值:
请查看此示例

尝试在 Fiddle 中使用 Roslyn。 - Hari Prasad
在C# 6.0之前尝试这个, Console.WriteLine(student1.SchoolName == null) ? "" : student1.SchoolName.Name - Baahubali
谢谢大家。适用于C# 6.0。 - BetterLateThanNever

1

在较旧的C#版本(C# 6之前),您可以尝试使用条件运算符:

Console.WriteLine(student1.SchoolName !=null? student1.SchoolName.Name:string.empty);

三元运算符是一种类似于if的操作符。 - BetterLateThanNever
是的,但使用 if 来编写多行和代码块只是在一行中简单编写。 - error_handler

1
Few other options for you:
1. 定义属性 SchoolName,如下所示:
private school _SchoolName;
public school SchoolName
{
    get
    {
        if (_SchoolName == null)
            return new school() { ID = 0, Name = string.empty };
        else
            return _SchoolName;
    }
    set { _SchoolName = value; }
}

2.在打印值之前检查是否为null

Console.WriteLine(student1.SchoolName ==null?string.empty: student1.SchoolName.Name);

0
如果你使用的是 C# 6.0 之前的版本,那么你可以使用一个 三目运算符
Console.WriteLine(student1.SchoolName == null ? string.empty : student1.SchoolName.Name);

或者,使用 `空值条件运算符' 也可以解决问题:

Console.WriteLine(student1.SchoolName?.Name);

0

最佳实践是这样的:

class student
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    [ForeignKey(...)]
    public virtual school School { get; set; }
}

class school
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual List<student> Students {get; set; }
}

student student1 = new student();

Console.WriteLine(student1.School != null ? (student1.School.Name != null ? student1.School.Name : "n/a") : "n/a"); - Alex Kudryashev
你在回答中提到了一些属性。能否请您使用它们? - BetterLateThanNever

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