【C#】C#高级语法
【C#】C#高级语法
1、特性(Attribute):
用于添加元数据。在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。
预定义特性:AttributeUsage;Conditional;Obsolete
自定义特性:一个新的自定义特性应派生自System.Attribute类。
2、反射(Reflection):
用于在运行时获取类型信息(元数据)。该类位于System.Reflection命名空间中,可访问一个正在运行的程序的元数据。
它允许在运行时查看属性(attribute)信息。
它允许审查集合中的各种类型,以及实例化这些类型。
它允许延迟绑定的方法和属性(property)。
它允许在运行时创建新类型,然后使用这些类型执行一些任务。
3、属性(Property):
属性可以通过访问器(accessors)让类(class)、结构(structure)和接口(interface)的命名(named)成员(成员变量、成员函数)私有域的值可被读写或操作。
访问器(accessor)包含有助于获取(读取或计算)或设置(写入)属性的可执行语句。访问器(accessor)声明可包含一个 get 访问器、一个 set 访问器,或者同时包含二者。
private string code = "N.A";
public string Code //声明类型为string的Code属性
{
get
{
return code;
}
set
{
code = value;
}
}
其他类就可以通过普通变量那样访问上述私有变量的值。这就是访问器的作用。
4、索引器(Indexer):
允许一个对象可以像数组一样被索引。当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。您可以使用数组访问运算符([ ])来访问该类的实例。
访问器可以获取一个类中的私有变量。如果存在变量数组,就需要一个一个的定义访问器。如果使用索引器,就可以一次性定义完成私有变量数组,从而通过index来在其他类中实例化此类访问。
5、委托(Delegate):
类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
6、事件(Event):
基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。
通过事件使用委托:
public delegate void EventUtilEventHandler(object sender, System.EventArgs e);// 步骤1 定义delegate对象
private event EventUtilEventHandler utilEvent;// 步骤2 用event关键字定义事件对象
public class EventClass
{
public void EventUtil_Function(object sender, System.EventArgs e)
{
Console.WriteLine("Hi, This is using event to print !"); // 步骤3 定义事件处理方法,它与delegate对象具有相同的参数和返回值类型
}
}
private EventClass eventClass;
eventClass = new EventClass();
this.utilEvent += new EventUtilEventHandler(eventClass.EventUtil_Function); // 步骤4 用+=操作符将事件添加到队列中
utilEvent(this, e);//步骤5 触发事件
7、集合(Collection):
专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。
集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。
常用的 System.Collection 命名空间的集合类:
动态数组(ArrayList):
哈希表(Hashtable):
排序列表(SortedList):
堆栈(Stack):
队列(Queue):
点阵列(BitArray):
8、泛型(Generic):
类功能相似,只是接收的参数类型不同,这个时候就可以用到泛型。
相比最蠢的方法是copy一个类,重新按照需要的类型定义新类和较好一点的做法是用object做为类的类型,但会存在装箱、拆箱的性能损耗。使用泛型可以很优雅的解决这个问题。
定义:
public class Stack<T>
{
private T[] m_item;
public T Pop(){...}
public void Push(T item){...}
public Stack(int i)
{
this.m_item = new T[i];
}
}
使用:
Stack<int> a = new Stack<int>(100);
Stack<float> a = new Stack<float>(10.2);
9、匿名方法(Anonymous methods) :
传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。
在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。
delegate void NumberChanger(int n);
...
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
10、不安全代码:
关键字unsafe,不安全代码或非托管代码是指使用了指针变量的代码块。需要用unsafe关键字包含,并且编译的时候,需要打开unsafe代码编译开关。
换句话说,如果C#代码使用了指针,就需要用unsafe包含。
11、多线程:
同C/C++多线程概念一样,使用System.Threading.Thread 类。
12、LINQ:
语言集成查询。通过对象的方式对数据库进行描述。能够快速对大部分数据源进行访问和数据整合的一种技术,使用相同的基本查询表达式模式类查询和转换SQL数据库、ADO.NET数据集、XML文档和流已经.NET集合中的数据。
13、Lambda表达式:
是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。