c#中的可空类型和空合并操作符(Nullable Types 和 Null Coalescing Operator)

在本文中,我们将讨论可空类型和空合并操作符以及如何在基于c#的代码中使用它们。

这是c#编程中的一个基本概念。在这里,我将解释可空类型,c#中的空合并操作符,以及如何在LINQ中使用该操作符。

c#中的数据类型分为两大类:值类型和引用类型。

值类型变量不能为空,但是我们可以在引用类型变量中指定一个空值。

让我们检查当我们给值类型赋空时将会发生什么。

因此,当我试图为一个整数分配一个空值时,它会显示以下错误:“不能将null转换为'Int',因为它是一个非空值类型。”

这是我们在编码时经常遇到的一种常见错误。

有两种方法可以解决这个问题:

  • Nullable<int> x = null;
  • int ? x = null;

上面展示了在c#中将非空值类型转换为空值类型的两种方法。由此,我们可以得出这样的结论:如果一个类型可以被赋值,或者可以赋值为null,那么这个类型就是可空的。默认情况下,所有引用类型,例如字符串,都是可空的,但是所有的值类型,如Int32,都不是。

可空类型有两个成员。

1、 HasValue:HasValue是布尔值类型。当变量包含非空值时,它将被设置为true。

static void Main(string[] args)  
{  
 int? x = 5;  
 if(x.HasValue)  
  {  
    Console.WriteLine("contain not nullable value.");  
  }  
 else  
  {  
    Console.WriteLine("contain Null value.");  
  }  
    Console.ReadLine();  
}

因此输出将包含一个非空值。

2、Value: 是个对象类型。它包含可空类型存储的数据。

static void Main(string[] args)  
{  
int? x = 5;  
if(x.HasValue)  
{  
Console.WriteLine(x.Value.ToString());  
}  
else  
{  
Console.WriteLine("contain Null value.");  
}  
Console.ReadLine();

这里输出是-5。

这都是关于c#中的可空类型。

接下来我将讨论c#中的空合并运算符(Null Coalescing operator) 。

Null-Collation

Null-collation(??)是c#中的一个重要运算符。根据MSDN的定义:?操作符称为null-coalescing操作符,用于为可空值类型或引用类型定义一个默认值。它返回左操作数,如果操作数不为空;否则,它返回正确的操作数。cnull合并运算符(??)是一个二元运算符,它简化了对Null值的检查。它用于在值为空时为变量分配一个默认值。

class Program  
    {  
        static void Main(string[] args)  
        {  
            string name = null;  
            string myname = name ?? "Laxmi";  
            Console.WriteLine(myname);  
            Console.ReadLine();  
        }  
    }

这里的输出是Laxmi。这是因为变量名为null, null合并操作符检查空值。如果它为空,那么它将分配默认值。

在属性中,我们也可以使用像这样的空合并运算符。

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  

namespace NullCollation  
{  
    class employee  
    {  

    }  
    class Program  
    {  

        static string _name;  

        static string Name  
        {  
            get  
            {  
                return _name ?? "Kailash";  
            }  
            set  
            {  
                _name = value;  
            }  
        }  
        public int age { get; set; }  
        static void Main(string[] args)  
        {  

            Console.WriteLine(Name);  
            Console.ReadLine();  
        }  
    }  
}

现在我向你们展示这个运算符是如何在LINQ中使用的。

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  

namespace NullCollation  
{  
    public class Employee  
    {  
        public int Id { get; set; }  
        public int age { get; set; }  
        public string name { get; set; }  
        public string gender { get; set; }  
    }  
    class Program  
    {  

        static void Main(string[] args)  
        {  
            List<Employee> li = new List<Employee>();  
            li.Add(new Employee { Id = 1, age = 19, 
            name = "Ritesh", gender = "M" });  
            li.Add(new Employee { Id = 2, age = 20,
             name = "sujit", gender = "M" });  
            li.Add(new Employee { Id = 3, age = 23,
             name = "Kabir", gender = "F" });  
            li.Add(new Employee { Id = 4, age = 3,
             name = null, gender = "F" });  
            li.Add(new Employee { Id = 5, age = 24, 
            name = "Kamlesh", gender = "M" });  
            li.Add(new Employee { Id = 6, age = 28, 
            name = "Manoj", gender = "M" });  
            var Data = from emp in li where emp.Id == 4 select new { 
            Name = emp.name ?? "No name" };  
            foreach (var obj in Data)  
            {  
                Console.WriteLine(obj.Name);  
            }  
            Console.ReadLine();  
        }  
    }  
}

通过这种方式,我们可以在LINQ查询中使用null合并运算符。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

C#基础知识—父类和子类的关系

2641
来自专栏我是业余自学C/C++的

字典 原

字典(dictionary)是由一些形如(key,value)的数对所组成的集合,其中key是关键字,value是与关键字key对应的值(另一种说法是,valu...

1301
来自专栏恰童鞋骚年

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类、匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱...

1173
来自专栏blackheart的专栏

[C#6] 7-索引初始化器

0. 目录 C#6 新增特性目录 1. 老版本的代码 1 private static void Main() 2 { 3 var dictionary...

2277
来自专栏大内老A

深入理解C# 3.x的新特性(2):Extension Method[下篇]

四、Extension Method的本质 通过上面一节的介绍,我们知道了在C#中如何去定义一个Extension Method:它是定义在一个Static c...

2089
来自专栏高爽的专栏

Collections.sort in JDK6:MergeSort

       本文是对JDK6中Collections.sort方法的源码解析,也可以看作是对Comparison method violates its ge...

2430
来自专栏CodingToDie

百篇(2):c# 学习笔记

C# hello world /** 基本格式 */ using System; using System.Collections.Generic; u...

3064
来自专栏james大数据架构

c#字符串操作方法实例

# 字符串是使用 string 关键字声明的一个字符数组。字符串是使用引号声明的,如下例所示: string s = "Hello, World!"; 字符串...

2868
来自专栏西安-晁州

TypeScript学习笔记之接口类型

TypeScript的接口,个人理解就是一种约束,包括各种类型的契约或者代码定义上的契约。当然,和java中的用法基本一致,接口可以被继承也可以被实现。 定义一...

1960
来自专栏GreenLeaves

C# 获取所有对象的字符串表示一ToString方法

应用程序开发过程中经常需要获取对象的字符串表示.Object类中定义了一个ToString的虚方法.所以在任何类型的实例上都能调用该方法.

671

扫码关注云+社区

领取腾讯云代金券