C#语法糖(转载)

C#语法糖

转载于:简书 丶PanPan

定义

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。需要声明的是“语法糖”这个词绝非贬义词,它可以给我们带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。

1.属性

  • 简化前
private string _Name;
public string Name
{
   get { return _Name; }
   private set { _Name = value; }
}

private int _Age;
public int Age
{
   get { return _Age; }
   private set { _Age = value; }
}
  • 简化后
public string Name { get; set; }
public int Age { get; private set; }

2.委托

在.net 1.1时我们不得不声明方法后才在委托中使用,在.net 2.0之后我们可以使用匿名委托,他不单可以简化写法,还可以在匿名委托中访问范围内的变量;再后来Lambda表达式来了,写法就更简便了。

static void Main(string[] args)
{
    //调用委托
    var mc = new MyClass();

    //调用定义的委托方法
    mc.UseDelegate(new MyClass.TestDelegate(mc.Method), "Hello!");

    //使用匿名委托
    mc.UseDelegate(delegate(string str)
    {
        Console.WriteLine(str);
    }, "Hello!");

    //使用Lambda表达式
    mc.UseDelegate(s =>
    {
        Console.WriteLine(s);
    }, "Hello!");
}

class MyClass
{
    //定义委托
    public delegate void TestDelegate(string str);

    //义委托方法
    public void Method(string str)
    {
        Console.WriteLine(str);
    }

    public void UseDelegate(TestDelegate d, string str)
    {
        d(str);
    }
}

3.集合

  1. 初始化List集合的值
  • 简化前
var list = new List<string>();
list.Add("a");
list.Add("b");
list.Add("c");
  • 简化后
var list = new List<string> { "a", "b", "c" };

2.取List中的值

  • 简化前
foreach (var str in list)
{
    Console.WriteLine(str);
}
  • 简化后
list.ForEach(s => Console.WriteLine(s));

4.使用完毕后自动释放资源(using || try finally)

为了节约资源,每次使用完毕后都要释放掉资源,其中可以使用Using和try finally来进行释放资源操作。需要注意的是使用Using释放资源的对象都必须继承IDisposable接口(MSDN)。

  • try finally
SqlConnection conn = null;
try
{
    conn = new SqlConnection("数据库连接字符串");
    conn.Open();
}
finally
{
    conn.Close();
    conn.Dispose();
}

  • using
using (SqlConnection conn=new SqlConnection("数据库连接字符串"))
{
    conn.Open();
}

5.var隐式类型

从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var.隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。(MSDN)

var str = "string";

6.问号表达式

  • (?:)问号+冒号
var sex = "男";
var result = sex == "男" ? 1 : 0;//如果sex等于“男”result等于1,否则result等于0.
  • (??)两个问号
var str = null;
str = str ?? "str为null";//左边的变量如果为null则值为右边的变量,否则就是左边的变量值

7.类型实例化

class User
{
    public int Id {get;set;}
    public string Name {get;set;}
}
  • 简化前
var u = new User();
u.Id = 1;
u.Name = "User Name";
  • 简化后
var u = new User()
{
    Id = 1,
    Name = "User Name"
};

8.扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。 (MSDN)

注意:定义扩展方法的类必须和使用地方的类命名空间相同(如果不同命名空间记得先引入命名空间)

//定义扩展方法
public static class StringExtensions
{
    public static bool IsEmpty(this string str)
    {
        return string.IsNullOrEmpty(str);
    }
}
//调用扩展方法
var temp="123";
var result = temp.IsEmpty();

9.匿名类

匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。可通过使用 new 运算符和对象初始值创建匿名类型。(MSDN)

var user = new {Id=1,UserName="Stu",Sex=1,Age=17}

10.默认参数

定义方法时设置参数默认值,调用方法时指定参数赋值

// 定义方法
public void GetResult(string value = "Default Value"){}

// 使用
GetResult();
posted @ 2019-09-23 14:23  Maple512  阅读(142)  评论(0)    收藏  举报