当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

Jorge2年前 (2022-05-08)C#/.net框架1181

请看演示程序。

我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。

下面例子中,你无法这样写:

            if(res1==null)

            {


            }

因为结构体的缺少值不是null。


演示程序:

C#
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{
    class Program
    {
        public struct structdata        {
            public string name;
            public Dictionary<string, int> dicData;
        }

        static List<structdata> list1 = new List<structdata>();
        static void Main(string[] args)
        {
            var dic1 = new Dictionary<string, int>();
            dic1.Add("key1", 1);
            dic1.Add("key2", 2);
            var dic2 = new Dictionary<string, int>();
            dic1.Add("key3", 3);
            dic1.Add("key4", 4);
            list1.Add(new structdata() { name = "lxy1", dicData= dic1 });
            list1.Add(new structdata() { name = "lxy2", dicData = dic2 });

            var res1=list1.Find(s => s.name == "lxy1");
            structdata? res2 = list1.Find(s => s.name == "lxy22");
        }
    }}


如果我用?符号呢?像下面这样写

structdata? res2 = list1.Find(s => s.name == "lxy22");


这时候下面这样写就合法了。但是结果不对。此时res2为false,不正确

        if(res2==null)

            {


            }


通过变量监视可以看到,res2整体不是null, 只是因为?符号的原因,可以做为null返回。但是find()还是返回的缺省值。

image.png


因此,还是得像下面这样写:

    if(res2.Value.name==null && res2.Value.dicData==null)

            {

                Console.WriteLine("is null");

            }




#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。


扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=39

标签: .NET.NET框架
分享给朋友:

“C# 当List.Find()返回一个结构体对象时,如何判断它为空?” 的相关文章

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件是很强。可以实现类似Vitual Studio属性面板那样的效果。但是。。。。我们一直痛苦它在选择和修改项目的时候很慢。我的用法是使用控件的SelectObject来绑定数据。C# PgridMotionSpeed.SelectedObject ...

C#字符串与享元(Flyweight)模式

C#字符串与享元(Flyweight)模式

注:关注这个话题是因为看到C#的关键字 lock时,其传入引用对象。因为string也是引用对象,所以能否做为lock的参数?对于这个问题,要搞明白C#的字符串的一个特点,它使用类似于享元模式的机制。因此在lock中锁字符串是相当不安全的。下面贴子是对C#字符串与享元模式的深入讨论。写这个文章,主要...

C#中使用RegisterWindowMessage进行进程之间进行通讯

C#中使用RegisterWindowMessage进行进程之间进行通讯

注:大家都知道在window里,进程之间通讯可以用消息通讯。但是有个较冷门的知识就是RegisterWindowMessage。一般的sendmessage和postmessage是需要在窗体程序间进行通讯,你得知道对方窗口的句柄。这个句柄每次启动程序时是系统分配的,每次不一样。有了这个Regist...

索引器(C# 编程指南)

索引器(C# 编程指南)

 索引器允许类或结构的实例就像数组一样进行索引。 无需显式指定类型或实例成员,即可设置或检索索引值。 索引器类似于属性,不同之处在于它们的访问器需要使用参数。以下示例定义了一个泛型类,其中包含用于赋值和检索值的简单 get 和 set 访问器方法。&...

细说进程、应用程序域与上下文之间的关系(一)——进程的概念与作用

细说进程、应用程序域与上下文之间的关系(一)——进程的概念与作用

引言本文主要是介绍进程(Process)、应用程序域(AppDomain)、.NET上下文(Context)的概念与操作。虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助。在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。