C#到C#,方便的语言功能

Max*_*oro 11 .net c#

我想了解C#的所有便利功能,以及它们如何映射到C#.

例如,自动属性:

public string Foo { get; set; }
Run Code Online (Sandbox Code Playgroud)

...映射到这样的东西:

string <Foo>k__BackingField;

[CompilerGenerated]
public string Foo {
   get { return this.<Foo>k__BackingField; } 
   set { this.<Foo>k__BackingField = value; } 
}
Run Code Online (Sandbox Code Playgroud)

Foreach循环:

foreach(char c in "Hello") {
   Console.WriteLine(c);
}
Run Code Online (Sandbox Code Playgroud)

......映射到这样的东西(我想):

CharEnumerator en;

try {

   en = "Hello".GetEnumerator();

   while (en.MoveNext()) {
      char c = en.Current;

      Console.WriteLine(c);
   }

} finally {

   IDisposable disp = en as IDisposable;

   if (disp != null)
      disp.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

foreach在处理非托管资源时,处理枚举器非常有用,例如循环文件中的行或数据库中的记录.

我认为对这些高级功能的良好理解可以帮助我们编写更好的代码.C#的其他便利功能有哪些?它们如何映射到C#?

Mar*_*ell 11

如果你想谈谈保存的代码量,最大的储户(IMO)是:

迭代器块

例:

public static IEnumerable<int> Get() {yield return 1; yield return 2;}
Run Code Online (Sandbox Code Playgroud)

保存:

  • 写一个IEnumerable<T>实现
  • 写一个IEnumerator<T>实现
  • 处理普查员的状态; 你看到它有多可怕吗?认真.

捕获变量(anon methods/lambdas)

例:

var list2 = list1.FindAll(x => (x.Value % 10) == find);
Run Code Online (Sandbox Code Playgroud)

保存:

  • 写一个班来保持国家
    • 在复杂的情况下,嵌套状态
  • 初始化状态包装器
  • 在该类上编写方法

表达式lambda编译器

示例(来自上方):

Expression<Func<Foo,bool>> pred = x => (x.Value % 10) == find;
Run Code Online (Sandbox Code Playgroud)

保存:

  • 是的 - 很多树代码; 非常非常复杂; 在上面我可以看到(排名不分先后)Expression.Parameter,Expression.Property,Expression.Field,Expression.Constant,Expression.Equal,Expression.Modulo,Expression.Lambda...结合;-p


Arv*_*rve 8

使用是语法糖

using(x) 
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

地图到

try {
    // Code
}
finally
{
    if(x != null)
        ((IDisposable)x).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

LINQ中的东西是语法糖

from x in l where y select z;
Run Code Online (Sandbox Code Playgroud)

翻译成

l.Where(x => y).Select(x => z);
Run Code Online (Sandbox Code Playgroud)


Nol*_*rin 6

LINQ作为一个整体(特别是使用LINQ查询语法)本质上是一个主要的C#/ .NET便利功能,它在很多时候取代了for循环/迭代器/复杂查询逻辑.


Igo*_*orK 5

  1. for,while,do... while,switch-一个有争议的答案:)

    您可以使用基于if和的某些代码替换它goto.

  2. lock(){}可以在try-finally中使用null检查转换为Monitor.Enter()和Monitor.Exit()(如果内部发生异常,请参阅锁定对象是否保持锁定状态?)


Kri*_*use 3

对象初始值设定项是非常好的语法糖:

 public class Book
{
 public string Author { get; set; }
 public string Title { get; set; }
}

Book book = new Book() {Author = "John Smith", Title = "C# Syntax"};
Run Code Online (Sandbox Code Playgroud)

上面是另一种写法:

Book book = new Book();
book.Author = "John Smith";
book.Title = "C# Syntax";
Run Code Online (Sandbox Code Playgroud)

隐式类型:

var book = new Book() {Author = "John Smith", Title = "C# Syntax"};
Run Code Online (Sandbox Code Playgroud)