当前位置: 首页 > 知识库问答 >
问题:

问号和点运算符是什么?。在C#6.0中是什么意思?

陈茂
2023-03-14

VS2015预览版中有了C#6.0,我们有了一个新的操作符, ,可以这样使用:

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

它到底做什么?


共有3个答案

宗安宁
2023-03-14

这对于C#来说是相对较新的,这使得我们很容易在方法链中调用关于null或非null值的函数。

实现同样的事情的旧方法是:

var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

现在,只需以下几点,它就变得容易多了:

member?.someFunction(var someParam);

我强烈推荐这个文档页面。

蔺宇
2023-03-14

它在展平层次和/或映射对象时非常有用。而不是:

if (Model.Model2 == null
  || Model.Model2.Model3 == null
  || Model.Model2.Model3.Model4 == null
  || Model.Model2.Model3.Model4.Name == null)
{
  mapped.Name = "N/A"
}
else
{
  mapped.Name = Model.Model2.Model3.Model4.Name;
}

可以这样写(逻辑同上)

mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";

DotNetFiddle.Net工作示例。

(或空合并运算符不同于?或空条件运算符)。

它也可以在赋值运算符的外侧使用。而不是

Action<TValue> myAction = null;

if (myAction != null)
{
  myAction(TValue);
}

它可以简化为:

myAction?.Invoke(TValue);

DotNetFiddle示例:

使用系统;

public class Program
{
  public static void Main()
  {
    Action<string> consoleWrite = null;
    
    consoleWrite?.Invoke("Test 1");
    
    consoleWrite = (s) => Console.WriteLine(s);
    
    consoleWrite?.Invoke("Test 2");
  }
}

结果:

测试2

基本上,我已经申请了?。一个接一个的模型。我想知道它是否可以直接应用于模型,还是只适用于导航属性?

的?或左值上的空条件运算符运算符,无论值的类型如何。编译器不关心右边的值是多少。这是简单的编译器魔法(意味着它做了一些你已经可以做的事情,只是在一个简化的为什么)。

举个例子

  var a = model?.Value;

就跟说

  var a = model == null ? null : model.Value;

在第二种情况下,检查null的计算值与返回的值没有关联。如果左边的值为null,空条件运算符基本上总是返回null。

成员的类型(方法、字段、属性、构造函数)。值与此无关。

DotNetFiddle示例不起作用的原因是用于的编译器。Net 4.7.2与支持空条件运算符的c#版本不兼容。将其更改为。Net 5,作品:

https://dotnetfiddle.net/7EWoO5

叶俊郎
2023-03-14
匿名用户

它是空条件运算符。它基本上意味着:

对第一个操作数求值;如果为null,则停止,结果为null。否则,对第二个操作数求值(作为第一个操作数的成员访问)

在你的例子中,重点是如果anull,那么a?。PropertyOfA将计算为null,而不是抛出一个异常——然后将null引用与foo(使用字符串的=重载)进行比较,发现它们不相等,执行将进入if语句的主体。

换句话说,是这样的:

string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
    ...
}

... 除了a只计算一次。

请注意,这也可以更改表达式的类型。例如,考虑<代码>文件信息。长度。这是一个long类型的属性,但如果将其与null条件运算符一起使用,则会得到long类型的表达式

FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null

 类似资料:
  • 本文向大家介绍双问号(??)运算符在PHP中是什么意思?,包括了双问号(??)运算符在PHP中是什么意思?的使用技巧和注意事项,需要的朋友参考一下 PHP 7添加了新的运算符双问号(??)运算符。在PHP 7中,双问号(??)运算符称为Null合并运算符。 如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则,返回其第二个操作数。从左到右评估。Null合并运算符也可以链形式使

  • 问题内容: 关于使用问号“?”的两个问题 在打印功能的括号内加上冒号“:”运算符:它们是做什么的?另外,有人知道它们的标准术语吗,或者在哪里可以找到有关它们使用的更多信息?我读过它们类似于’if’‘else’语句。 问题答案: 这是三元条件运算符,可以在任何地方使用,而不仅仅是print语句。它有时被称为“三元运算符”,但它不是唯一的三元运算符,而是最常见的一个。 这是Wikipedia的一个很好

  • 问题内容: PHP中的“ =&” /“&=”运算符是什么意思?在哪里可以阅读有关它们的信息? 搜索Google没有帮助。 问题答案: 的缩写,是按位与运算符。 分配$ a作为对$ b 的引用。

  • 问题内容: 我知道出于文档目的注释中的含义,但除此之外又意味着什么?(我通常只会在Google上搜索,但结果中会显示每个非字母符号) 问题答案: 该符号表示Java注释。Java注释的作用是,它为变量,方法,类,接口或其他语言元素添加了特殊的属性。(可以在声明注释时进行配置)。向某事物添加注释时,程序的其他部分可以检查某事物是否具有注释。然后,它可以使用此信息来完成所需的任何工作。 让我举几个例子

  • 问题内容: 除了标准,,和运营商; 但什么是这些均值(,,,)? 又如何操作? in返回正常的余数模量,但是仅当,为什么会这样?怎么办? 又如何操作?它有什么作用? 问题答案: :求幂 :异或(按位) :模数 :除以积分结果(舍弃余数)

  • 问题内容: 运算符在Python中是什么意思,例如l或代码? 在解释器内部如何处理? 它会影响性能吗?是快还是慢? 什么时候有用,什么时候没有? 应该在函数声明中还是在调用中使用它? 问题答案: 单颗星将序列集合解压缩为位置参数,因此你可以执行以下操作: 这将打开元组的包装,使其实际执行为: 双星 只使用字典并因此命名参数来做同样的事情: 你还可以结合: 另请参见Python文档的4.7.4-解包