目录介绍它是如何工作NBSP?;var和细节自动实现的属性 = - =活动限制有关Articlesnbsp;
参考文献
源代码Demonbsp;{A}
introductionnbsp;
在C#中,有许多功能,如来声明变量VAR,自动实现属性和多,这使得程序员的生活更轻松。另一方面,这种抽象创建有点混乱,如它是如何工作,如何网络implementednbsp;,那些东西innbsp的幕后。在这篇文章中,我会尝试找出这些东西,例如一些,VAR,Auto-Implementednbsp的,性能和= - =语法在Events.nbsp使用;它是如何工作?
在下面的讨论中,我们将看到如何VAR,自动实现的属性和=和 - =活动工作var和细节在C#中,这是可能的几种方法,隐式类型声明,使用var关键字声明的变量是其中之一。例如,它可以使用var totalSalary = 0,而不是INT totalSalary = 0;正如的MSDN 建议var是强类型的,但编译器决定的类型。探索多一点,我创建了一个小班,
上面的类是不是做多,而初始化类型的书,其中包含名为ExplorerVar方法的一个实例。此方法具有变量使用var声明。在设计时或编码或同时在IDE中写代码,鼠标悬停上面的关键字var,那么编译器将确定变量myBook类型。请看看下面的图片,namespace TestHarness
{
public class VarExplorer
{
public Book ExploreVar()
{
var myBook = new Book() { Name = "What is out there?" };
myBook.Name = "What is out there?";
return myBook;
}
}
public class Book
{
public string Name { get; set; }
}
}
{S0的}
图:VAR在设计时所以很显然,编译器在设计时确定的类型。另一个问题是在运行时发生了什么?要进行测试,我编译TestHarness项目,抢进净反射程序的bin文件夹中的TestHarness.exe,帮助NET Reflector中的代码,我发现ExploreVar方法如下,NBSP。;{C}上面的代码中清楚地表明,编译器取代适当的类型var关键字,同时建设项目为EXE。从上面的讨论,很清楚如何在C#中的VAR工作。自动实现的属性在C#中类的声明是很容易的,我们使用以下语法声明一个类,
它是非常简单的,但它是从C#3.0更容易。我们可以声明如下Book类,{体C3}现在的问题是用来声明一个类,语法之间的区别是什么。在现实中有没有除了编译器为我们做的所有工作。有点阶级背景,以不同的方式封装的概念已实施。 Book类首先声明,封装,通过引进这实际上相当于get和set方法的属性。所以这是不可能的,除非有一个公共的属性或get / set方法直接访问类的私有成员。现在的宣言书的第二个语法,编译器正在做这一切都代表一个程序员封装。当编译本书的第二版。使用NET Reflector中,编译器本身生成get和set方法和Name属性声明一个变量名public class Book
{
private string name;
public string Name
{
get {
return name;
}
set {
name = value;
}
}
}
有两个新的东西,这是添加和删除,需要探索,现在加挡,并添加和删除的作品,一行代码给我们所有的线索,这是,{C10的}如果我们多一点挖Combine方法,我们会发现类似下面的东西,{C11的}代码块是从Delegate类和方法被称为Combine方法MulticastDelegate类定义也CombineImpl。MulticastDelegate拥有两个变量{C12的}public class LogIt
{
// Nested Types
public delegate void LogHandler(string message);
// Fields
private LogHandler Log;
// Events
public event LogHandler Log
{
add
{
LogHandler handler2;
LogHandler log = this.Log;
do
{
handler2 = log;
LogHandler handler3 = (LogHandler) Delegate.Combine(handler2, value);
log = Interlocked.CompareExchange<loghandler>(ref this.Log, handler3, handler2);
}
while (log != handler2);
}
remove
{
LogHandler handler2;
LogHandler log = this.Log;
do
{
handler2 = log;
LogHandler handler3 = (LogHandler) Delegate.Remove(handler2, value);
log = Interlocked.CompareExchange<loghandler>(ref this.Log, handler3, handler2);
}
while (log != handler2);
}
}
// Methods
public Delegate[] GetList()
{
return this.Log.GetInvocationList();
}
}
</loghandler></loghandler>
这_invocationList持有=语法指定使用的所有方法签名的主要对象。从下面的图片我们可以看到如何_ invocationList用来存储所有的方法签名的方法指针(IntPtr的)
{S2的}图:_innvocationList
{S3的的MulticastDelegate classnbsp;}穆罕默德一个拉赫曼