C# 中的 ?.

spmzfz 2018-03-18 09:04:48
https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/perform-left-outer-joins
我相问一下,关于左外部联接 编码 select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };
中 的?.怎么理解?微软MSDN对这个的解释页面在哪



class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}

public static void LeftOuterJoinExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };

var query = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };

foreach (var v in query)
{
Console.WriteLine($"{v.FirstName+":",-15}{v.PetName}");
}
}

...全文
230 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-03-19
  • 打赏
  • 举报
回复
那你解释下 from subpet in gj.DefaultIfEmpty()
masanaka 2018-03-19
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
新语法?不清楚,也无法测试 从语义上看 subpet?.Name ?? String.Empty 和 subpet ?? String.Empty 是等效的,不知为何要多此一举 可能是因为 subpet 是集合?
不等效啊。 subpet?.Name ?? String.Empty取的是subpet的name。 subpet ?? String.Empty取的是subpet,本身需要是string型才可以和String.Empty并列吧?
xuzuning 2018-03-19
  • 打赏
  • 举报
回复
新语法?不清楚,也无法测试 从语义上看 subpet?.Name ?? String.Empty 和 subpet ?? String.Empty 是等效的,不知为何要多此一举 可能是因为 subpet 是集合?
正怒月神 2018-03-19
  • 打赏
  • 举报
回复
这个语法糖是C#6.0比较实用的。
正怒月神 2018-03-19
  • 打赏
  • 举报
回复
subpet?.Name 是C#6.0的新语法。 代表判断subpet是否为null,如果是null就返回Null。否则返回subpet.Name
exception92 2018-03-19
  • 打赏
  • 举报
回复
threenewbee 2018-03-18
  • 打赏
  • 举报
回复
??表示如果是null,那么用后面的值,否则用前面的值
hez2010 2018-03-18
  • 打赏
  • 举报
回复
如果?.左边的东西如果为null,那么整个表达式的结果为null,否则跟.的作用是一样的。 ??的意思是如果??左边为null,则取??右边的东西,否则取??左边的东西。 a?.b ?? c 可以理解为:

if (a!=null)
{
    if (a.b!=null) return a.b;
    else return c;
}
else return c;
spmzfz 2018-03-18
  • 打赏
  • 举报
回复
主要是的 ?. ,我不知道MSDN 是怎么样解释的。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧