构造函数是类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。当我们使用 new 关键字创建类的对象时,可以使用实例构造函数来创建和初始化类中的任意成员属性。
静态构造函数用于初始化类中的静态数据或执行仅需执行一次的特定操作。静态构造函数将在创建第一个实例或引用类中的静态成员之前自动调用。
静态构造函数具有以下特性:
私有构造函数是一种特殊的实例构造函数,通常用在只包含静态成员的类中。如果一个类中具有一个或多个私有构造函数而没有公共构造函数的话,那么其他类(除嵌套类外)则无法创建该类的实例。
public class Website
{
private string name;
private string url;
public Website(string n, string u){
this.name = n;
this.url = u;
}
public void Display(){
Console.WriteLine(name +" "+ url);
}
}
public class Test
{
public Test()
{
Console.WriteLine("无参构造函数");
}
// 这里的 this()代表无参构造函数 Test()
// 先执行 Test(),后执行 Test(string text)
public Test(string text) : this()
{
Console.WriteLine(text);
Console.WriteLine("实例构造函数");
}
}
public class Test
{
int Temp0;
int Temp1;
public int this[int index]
{
get
{
return (0 == index) ? Temp0 : Temp1;
}
set
{
if (0==index)
Temp0 = value;
else
Temp1 = value;
}
}
}
class Demo
{
static void Main(string[] args)
{
string str = "C#";
string newstr = str.ExpandString();
Console.WriteLine(newstr);
}
}
public static class Test
{
public static string ExpandString(this string name)
{
return name+" 1.0";
}
}
C# 预处理命令
预处理指令的作用主要是向编译器发出指令,以便在程序编译开始之前对信息进行一些预处理操作。在 C# 中,预处理器指令均以#
开头,并且预处理器指令之前只能出现空格不能出现任何代码。另外,预处理器指令不是语句,因此它们不需要以分号;
结尾。
特性(Attribute)是一种用于在程序运行时传递各种元素(例如类、方法、结构、枚举等)行为信息的声明性代码。使用特性可以将元数据(例如编译器指令、注释、描述、方法和类等信息)添加到程序中。.Net Framework 提供了两种类型的特性,分别是预定义特性和自定义特性。
.Net Framework 中提供了三个预定义的属性:
AttributeUsage:用来描述如何使用自定义特性类,其中定义了可以应用特性的项目类型。
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
Conditional:用来标记一个方法,它的执行依赖于指定的预处理标识符。根据该特性值的不同,在编译时会起到不同的效果,
Obsolete:用来标记不应被使用的程序,您可以使用它来通知编译器放弃某个目标元素。例如当您需要使用一个新方法来替代类中的某个旧方法时,就可以使用该特性将旧方法标记为 obsolete(过时的)并来输出一条消息,来提示我们应该使用新方法代替旧方法。
自定义特性不仅可以用于存储声明性的信息,还可以在运行时被检索。创建并使用自定义特性可以分为四个步骤:
一般用途:
标记代码元素:例如标记测试方法、服务实现等。
配置序列化行为:例如控制 JSON 序列化。
数据验证:例如验证模型数据。
依赖注入配置:例如标记服务实现。
AOP(面向切面编程):例如日志记录、性能监控。
自定义元数据:例如添加作者信息。
索引器(英文名:Indexer)是类中的一个特殊成员,它能够让对象以类似数组的形式来操作,使程序看起来更为直观,更容易编写。索引器与属性类似,在定义索引器时同样会用到 get 和 set 访问器,不同的是,访问属性不需要提供参数而访问索引器则需要提供相应的参数。
索引器类型 this[int index]
{
// get 访问器
get
{
// 返回 index 指定的值
}
// set 访问器
set
{
// 设置 index 指定的值
}
}
委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。委托特别适用于实现事件和回调方法,所有的委托都派生自 System.Delegate 类。在实例化委托时,可以将委托的实例与具有相同返回值类型的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法
委托具有以下特点:
delegate delegate-name()
委托一旦声明,想要使用就必须使用 new 关键字来创建委托的对象,同时将其与特定的方法关联。
委托对象有一个非常有用的属性,那就是可以通过使用+
运算符将多个对象分配给一个委托实例,同时还可以使用-
运算符从委托中移除已分配的对象,当委托被调用时会依次调用列表中的委托。委托的这个属性被称为委托的多播,也可称为组播,利用委托的这个属性,您可以创建一个调用委托时要调用的方法列表。
事件(Event)可以看作是用户的一系列操作,例如点击键盘的某个按键、单击/移动鼠标等,当事件发生时我们可以针对事件做出一系列的响应,例如退出程序、记录日志等等。C# 中线程之间的通信就是使用事件机制实现的。
事件需要在类中声明和触发,并通过委托与事件处理程序关联。事件可以分为发布器和订阅器两个部分,其中发布器是一个包含事件和委托的对象,事件和委托之间的联系也定义在这个类中,发布器类的对象可以触发事件,并使用委托通知其他的对象;订阅器则是一个接收事件并提供事件处理程序的对象,发布器类中的委托调用订阅器类中的方法(事件处理程序)。
有关事件我们需要注意以下几点:
//发布器
public delegate void delegate_name(string status);
public event delegate_name event_name;
//订阅器
event_name += new delegate_name(your_method(""))