作为一个编程界的小白,记录一下一些C# 的用法。没事研究一下微软的文档,还是挺有意思的。
1. 使用 “yield return 返回值” 或者 yield break; 来代替迭代器?
using System;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
foreach (var item in (new MyClass()))
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
public class MyClass : IEnumerable
{
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
yield break;
}
}
}
其实还可以这么写:
static System.Collections.Generic.IEnumerable<int> Range(int start, int end)
{
for (int i = start; i < end; i++)
{
yield return i;
}
yield break;
}
static void YieldStatement(string[] args)
{
foreach (int i in Range(-10,10))
{
Console.WriteLine(i);
}
}
2. unchecked 和 checked 可用于检测算术溢出
using System;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
int num = int.MaxValue;
Console.WriteLine(num);
unchecked
{
Console.WriteLine(num + 1);
}
checked
{
Console.WriteLine(num + 1);
}
Console.ReadKey();
}
}
}
因为变量类型储存大小问题,如果你想避免算术溢出,可以用checked做检测,这样会直接抛出异常。
3. 用 " goto " 去往你想去的任何地方
public static void GoToStatement(string[] args)
{
int i = 0;
goto check;
loop:
Console.WriteLine(args[i++]);
check:
if (i < args.Length)
goto loop;
}
用 “goto” 实现了一个循环,但是微软其实不建议大家这样做,破坏了程序的结构和流程。容易翻车
4. “
lock
” 多线程肯定不陌生
public class SimpleSinger
{
private static SimpleSinger Simple { get; set; }
private static readonly object Sync = new object();
private SimpleSinger() { }
public static SimpleSinger Instance()
{
if (Simple == null)
{
lock (Sync)
{
if (Simple == null)
{
Simple = new SimpleSinger();
}
}
}
return Simple;
}
}
肯定用单例模式+lock方法最直接简单的了
5. “using” 的用法,这个你一定不陌生
using System;
using static System.Console;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("A");
Console.WriteLine("B");
WriteLine("C");
Console.ReadKey();
}
}
}
C# 6.0 以后可以使用 “using static ” 来引用静态类,比如这样 “using static System.Console;”