我想了解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使用是语法糖
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)
for,while,do... while,switch-一个有争议的答案:)
您可以使用基于if和的某些代码替换它goto.
lock(){}可以在try-finally中使用null检查转换为Monitor.Enter()和Monitor.Exit()(如果内部发生异常,请参阅锁定对象是否保持锁定状态?)
对象初始值设定项是非常好的语法糖:
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)