C# 中的语法糖

1.   using 代替了 try…catch…finally                                             

因为之前是学 Java 的,在连接数据库或者进行文件读写操作时很自然的就使用了 try…catch…finally…,在 C# 中这样写也肯定可以但是还有一种更优雅的写法(我看到别人这样说),那就是使用 using 关键字。

在使用各种流或者连接时【文件读写流,数据库连接等等】,在使用完毕后,需要关闭流和连接,(这里不讨论数据库连接需要归还到池子)

之前的代码是这样的:

复制代码
public void Test1()
        {
            SqlConnection conn = null;
            SqlDataReader reader = null;
            try
            {
                string strConn = ConfigurationManager.ConnectionStrings["strConn"].ToString();
                conn = new SqlConnection(strConn);
                conn.Open();
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "XXXXXXXXX";
                reader = cmd.ExecuteReader();
                //一些操作
            }
            catch (Exception e)
            {
                Console.WriteLine("出错啦!!");
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
                if (reader != null)
                {
                    reader.Dispose();
                }
            }
        }
复制代码

 

使用了 using 关键字之后是这样的:

复制代码
public void Test2()
        {
            string strConn = ConfigurationManager.ConnectionStrings["strConn"].ToString();
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "XXXXXXXXXX";
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        //一些操作
                    }
                }
            }
        }
复制代码

关于 using 关键字,有必要弄清楚“托管资源”和“非托管资源”,只有非托管资源才需要使用 using 关键字。

关于非托管资源和托管资源可以看这篇博客【      】

2.   动态对象,字段的省略                                                        

还记得在 Java 中写字段的读写方法时,快捷键用的相当的 6 ,那么 C# 中没有与其类似的对象呢,快捷键当然有,不过还有更猛的,就是不用写字段了,只管写读写属性就好,编译器会自动根据读写属性去生成字段。

public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Sex { get; set; }
    }

编译器在编译时就会自动生成字段,下面是编译过后的 IL代码目录,可以看到最下面生成了三个字段。

image

3.  两个问号“??”的作用                                                                

一个问号见过,在三目元算符里面就是。两个问号呢?

之前见到这样的写法也是比较奇葩的。看代码吧:

复制代码
public class Program
    {
        public static void Main(string[] args)
        {
            string a = null;
            var b = a ?? "woaini";
            Console.WriteLine("b : " + b);
            Console.WriteLine("=============");
            a = "msym";
            var c = a ?? "woaini";
            Console.WriteLine("c: " + c);

        }
    }
复制代码

运行看结果:

image

结论就是:问号左边的是 null 得话,那么得到就是问号右边的值,反之就是问号左边的值。

4.   扩展方法                                                                                 

这个可以看这个博客C# 中的扩展方法

还有这个博客,扩展方法的运用扩展方法的运用

其实我对扩展方法的理解,就是一个特殊的工具类,只不过和类型绑定在一起了。这只是我暂时的理解,因为还没涉及到底层。

 

5.  对象初始化器和匿名对象                                                      

这点和 JavaScript 的对象直接量就很像了。

复制代码
          //对象初始化器
            Person p = new Person {
                Name = "andy",
                Age = 24
            };
            //匿名对象
            var p2 = new { Name = "dimo", Age = 24 };
            Console.WriteLine(p.Name);
            Console.WriteLine(p2.Name);
复制代码

【未完待续】

 

回到主页

posted @   码上猿梦  阅读(2515)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示