c# 语言基础流水帐
.NET 4.0携手VS2010一同走来,做了几年的.NET开发,自此整理下C#的知识树,用来梳理知识体系和提高薄弱环节.
相对于C和C++:
指针(Pointer)只能被用于不安全模式。大多数对象访问通过安全的引用实现,以避免无效的调用,并且有许多算法用于验证溢出,指针只能用于调用值类型,以及受垃圾收集控制的托管对象。
对象不能被显式释放,代替为当不存在被引用时通过垃圾回收器回收。
只允许单一继承(single inheritance),但是一个类可以实现多个接口(interfaces)。
C#比C++更加类型安全。默认的安全转换是隐含转换,例如由短整型转换为长整型和从派生类转换为基类。而接口同整型,及枚举型同整型不允许隐含转换,非空指针(通过引用相似对象)同用户定义类型的隐含转换必段被显式的确定,不同于C++的复制构造函数。
数组声明语法不同("int[] a = new int[5]" 而不是 "int a[5]")。
枚举位于其所在的命名空间中。
C#中没有模版(Template),但是在C# 2.0中引入了泛型(Generic programming),并且支持一些C++模版不支持的特性。比如泛型参数中的类型约束。另一方面,表达式不能像C++模版中被用于类型参数。
属性支持,使用类似访问成员的方式调用。
完整的反射支持。
分部类
分部类将类型的实现分在多个文件中。 它允许切分非常大的类,并且如果类的一部分是自动生成的方面也很有用处。
泛型
泛型, 或参数化类型, 是被C#支持的.NET 2.0特性。不同于C++模版, .NET 参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行. 它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,NET generics 使用 具化 生成泛型参数, 它允许优化和保存类型信息
静态类
静态类它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。
迭代器
一种新形式的迭代器 它提供了函数式编程中的generator,使用yield return
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
foreach (int i in numbers)
{
if (i % 2 == 0) yield return i;
}
}
属性访问器可以被单独设置访问级别
string status = string.Empty;
public string Status
{
get { return status; }
protected set { status = value; }
}
可空类型
可空类型 (跟个问号, 如 int? i = null;) 允许设置 null 给任何类类型。
??操作符
(??
) 用于如果类不为空值时返回它自身,如果为空值则返回之后的操作
object nullObj = null;
object obj = new Object();
return nullObj ?? obj; // 返回 obj
主要用作将一个可空类型赋值给不可空类型的简便语法
int? i = null; int j = i ?? 0;
匿名方法
委托的协变和逆变
3.0~3.5
初始化器
Customer c = new Customer(); c.Name = "James";
可写作:
Customer c = new Customer { Name="James" };
MyList list = new MyList(); list.Add(1); list.Add(2);
可写作
MyList list = new MyList { 1, 2 };
假设 MyList
实现了 System.Collections.IEnumerable
且有一个Add
方法method
var类型
var x = new Customer { Name="James" };
局部变量 类型推断
var x = new Dictionary<string, List<float>>();
等同于
Dictionary<string, List<float>> x = new Dictionary<string, List<float>>
Lambda表达式
Lambda表达式指:
listOfFoo.Where(
delegate(Foo x) {
return x.Size > 10;
}
)
可写作
listOfFoo.Where(x => x.Size > 10);
编译器翻译Lambda表达式为强类型委托或强类型表达式树.
自动属性
编译器将自动生成私有变量和适当的getter(get访问器)和setter(set访问器),如:
public string Name { get; private set; }
扩展方法
扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中:
public static class IntExtensions
{
public static void PrintPlusOne(this int x)
{
Console.WriteLine(x + 1);
}
}
int foo = 0;
foo.PrintPlusOne();
分部方法在分部类型的一个部分中定义它的签名,并在该类型的另外一个部分中定义它的实现。类设计人员可以使用分部方法提供由开发人员决定是否实现的方法挂钩(类似于事件处理程序)。如果开发人员没有提供实现,则编译器会在编译时移除签名。下列条件适用于分部方法:
分部类型的两个部分中的签名必须匹配。
方法必须返回 void。
不允许使用访问修饰符或属性。分部方法是隐式私有的。
下面的示例演示在分部类的两个部分中定义的分部方法:
namespace PM
{
partial class A
{
partial void OnSomethingHappened(string s);
}
// This part can be in a separate file.
partial class A
{
// Comment out this method and the program
// will still compile.
partial void OnSomethingHappened(String s)
{
Console.WriteLine("Something happened: {0}", s);
}
}
}
补充ING
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。