`
Kingson_Wu
  • 浏览: 123646 次
文章分类
社区版块
存档分类
最新评论

关于var关键字及其反编译

 
阅读更多

C#中var关键字

分类:.NETC#2010-06-2611:341157人阅读评论(3)收藏举报

c#编译器objectstring.netide

var关键字是C#3.0开始新增的特性,称为推断类型.
可以赋予局部变量推断类型var而不是显式类型。var关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NETFramework类库中定义的类型或任何表达式。
上面的资料有点抽象不好理解.
示例:
原来我们定义变量,是要这样:
数据类型变量名=;
:
inta=1;
stringb="2";
也就是说,"必须先明确地"指定你的变量是什么数据类型,才能给它赋值.这点很重要,要记住才好比较.
现在在C#3.0,有了变化,就是可以不用像上面那样定义变量了.
:
vara=1;
那这个a,是什么类型呢?和原来的做法不一样了.
奥妙就在这里,IDE或编译器会根据你给a的值:1,"推论,断定"a是一个整数类型.
同理:
varb="2";
因为给b的值是"2"这样一个字符串,所以,b就是string类型...

又如:

VAR3.5新出的一个定义变量的类型
其实也就是弱化类型的定义
VAR可代替任何类型
编译器会根据上下文来判断你到底是想用什么类型的
至于什么情况下用到VAR我想就是你无法确定自己将用的是什么类型
就可以使用VAR类似OBJECT
但是效率比OBJECT高点
使用var定义变量时有以下四个特点:
1.必须在定义时初始化。也就是必须是vars=abcd形式,而不能是如下形式:
vars;
s=abcd;
2.一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3.var要求是局部变量。
4.使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。

浅谈.NET编译时注入(C#-->IL

2011-07-2621:27by破狼,3525阅读,3评论,收藏,编辑

.NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点。本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入等等。

1:我们先来看看最简单的var:

#:

publicvoidTestVar()

{

vari=0;
Console.WriteLine(i);
}

使用Reflector查看生成

IL:

反编译后的C#:

这里VS在编译的时候将var为我们转变为了int类型。

2:Action<int>

C#:

publicvoidTestAction()

{

vari=1;

Func<int,int>f=t=>t+1;

i=10;

f(i);

}

反编译后C#:

编译器为我们在这里生成了代理方法。

总结:

关于lambda表达式的编译规则:

当一个lambdaexpression被赋值给一个delegate类型,例如Action<T>或者Func<T,TResult>等,这个lambdaexpression会被编译器直接编译为
1)lambdaexpression没有使用闭包内的非局部引用也没有使用到this时,编译为一个私有静态方法;
2)lambdaexpression没有使用闭包内的非局部引用,但用到了this时,编译为一个私有成员方法;
3)lambdaexpression中引用到非局部变量,则编译为一个私有的内部类,将引用到的非局部变量提升为内部类的。

3:PostSharp

PostSharp是结合了MSBuildTaskMSILInjection技术,编译时静态注入实现AOP编程。在编译时候改变VS的编译行为。更详细的信息,请访问PostSharp网站

原c#:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceConsoleApplication1

{

classProgram

{

staticvoidMain(string[]args)

{

newProgram().TestPostSharp();

}

[ErrorHandler()]

publicvoidTestPostSharp()

{

thrownewException("Iwillthrowaexception!");

}

}

[Serializable]

publicclassErrorHandlerAttribute:PostSharp.Laos.OnMethodBoundaryAspect

{

publicoverridevoidOnException(PostSharp.Laos.MethodExecutionEventArgseventArgs)

{

//dosomeAOPoperation!

Console.WriteLine(eventArgs.Method+":"+eventArgs.Exception.Message);

eventArgs.FlowBehavior=PostSharp.Laos.FlowBehavior.Continue;

}

}

}

反编译后:

今天就到此为至,只是简单的了解下IL注入实例,在后面会利用MSBuildTask+MonoCecilPostSharp实现一些简单的注入实例.


作者:破狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-博客园--破狼51CTO--破狼

分享到:
评论

相关推荐

    编译原理实验报告(PL/0语言功能扩充)

    在访问数组元素时,下标可以是整型表达式,包括整数、常量、变量及其组合,这需要在词法分析阶段识别新的符号,并在语法分析阶段处理数组的声明和访问。 2. **IF-THEN-ELSE条件语句**: 扩展后的PL/0语言支持了...

    C#中的动态类型(Dynamic)的项目工程

    1. 定义:动态类型在C#中是一个关键字,用于声明变量,这个变量在编译时不进行类型检查,而是在运行时决定其实际类型。 2. 工作原理:动态类型的数据存储在`System.Dynamic.DynamicObject`或`Microsoft.CSharp....

    JDK-14-x64.zip

    本篇将详细讲解64位Windows系统下的JDK14及其附带的XJad反编译工具。 首先,我们来深入理解JDK14。JDK14是Oracle公司发布的Java SE(Standard Edition)开发工具包的第14个主要版本,它在前一版本的基础上引入了...

    Oracle Solaris 8 man pages section 5: Standards, Environments, a

    文档还提到了版权和许可信息,指出Oracle Solaris 8及其文档受版权保护,并且分发时受到特定的使用、复制、分发和反编译限制。它还提到了Sun Microsystems(现在被甲骨文公司收购)与其他第三方供应商的合作,比如...

    时尚简洁的js轮播图特效插件

    3. **let和const**:替代了传统的var关键字,let用于声明块级作用域的变量,const则用于声明常量,不可更改。 4. **类与继承**:如果插件实现了面向对象编程,可能会用到ES6的class关键字来定义类,并使用extends...

    openjdk-11.0.1_windows-x64_bin.zip

    JDK 11还引入了新的语言特性,如局部变量类型推断(var关键字),这使得代码更加简洁且易于理解。 3. **核心类库**: JDK 11.0.1提供了大量的API接口和类,构成了Java编程的基础。这些类库涵盖了I/O、网络、多线程、...

    kotlin笔记1

    - **编译器常量**:使用 `const` 关键字声明的常量,在编译时期就会被优化。 - **延迟初始化**:使用 `lateinit` 或 `lazy` 关键字实现延迟初始化。 #### 十一、接口 Kotlin 的接口具有灵活的设计: - **接口...

    makefile的全面分析

    ### makefile的全面分析 #### 概述与基础概念 `makefile`是Linux环境下用于组织和自动化构建软件项目的脚本文件。...通过深入理解makefile的各个组成部分及其工作原理,开发者可以更加高效地管理和维护大型项目。

    2019面试题整理(76).pdf

    ### 2019 iOS面试知识点汇总 #### 基础知识点 **1. 如何令自己所写的对象具有拷贝功能?** 如果想要使自己编写的类支持拷贝功能,需要遵循`NSCopying`协议,并实现`- (id)... 如何防止反编译?** 虽然完全防止...

    JavaScript语法和对象速查手册-源代码

    2. 闭包:闭包是函数及其相关的变量组合,它可以访问并操作外部作用域的变量,即使在函数执行完毕后,这些变量仍然存在。 三、对象与原型链 1. 对象:JavaScript中的对象是键值对的集合,通过花括号{}创建。属性...

    2小时入门js必学知识

    声明变量时,可以使用`var`、`let`或`const`关键字: - `var`:全局变量,具有变量提升特性,允许重复定义。 - `let`:块级作用域变量,无变量提升,不允许重复定义。 - `const`:声明常量,一旦赋值后不可修改。 ...

    C#学习参考手册

    - **隐式类型**:使用`var`关键字推断类型。 - **示例代码**:展示显式类型和隐式类型的使用场景。 #### 转型和型别转换 - **知识点**:不同类型间的转换机制。 - **细节**: - **隐式转换**:无需额外操作即可...

    SQL数据库语句大全大全(完全整理版) (2).docx

    - 常用函数包括:`AVG()`(计算平均值),`VARP()`(计算总体方差),`SIN()`, `COS()`, `TAN()`, `COT()`(三角函数),`ASIN()`, `ACOS()`, `ATAN()`, `ATAN2()`(反三角函数),`SOUNDEX()`(比较字符串音节...

    跟我一起编写makefile

    #### 第二部分:关于程序的编译和链接 在深入了解 Makefile 之前,我们需要理解程序的编译和链接过程。编译器负责将源代码转换成机器可以理解的指令,而链接器则负责将各个目标文件组合成一个可执行文件。Makefile ...

    javascript源码

    JavaScript与Java名字相似但完全不同,Java是一种静态类型的、编译型的语言,而JavaScript则是动态类型的、解释执行的。 在这个"javascript源码"的压缩包文件中,"Examples"目录很可能包含了各种JavaScript编程实例...

    一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out

    在反编译IL代码时,可以看到对栈和堆的操作更加直观。例如,`ldloc.0`表示加载栈上局部变量0的值,而`ldfld`则表示加载字段值,这通常对应于引用类型对象的成员访问。 总的来说,理解C#中的值类型与引用类型、栈和...

    JavaScript 面试问题与解答 (2023) – 初级水平.docx

    Java编写的程序需经过编译后才能运行,并且可以在任何安装了Java虚拟机(JVM)的设备上运行,体现了“一次编写,到处运行”的理念。 #### 2. JavaScript 数据类型详解 JavaScript提供了多种数据类型,可以分为以下几...

    javascript面试题、练习题

    ES6模块规范则是JavaScript官方的模块系统,它采用静态结构,编译时确定模块的依赖关系,并且支持异步加载,这使得ES6模块可以在浏览器和服务器端同时使用。ES6模块相比于CommonJS的优势在于更好的错误提示、更高的...

    gmake v3.8

    - **MAKEFILE_LIST**:保存当前 makefile 文件及其所包含的所有文件列表。 - **特殊变量** 如 `$@` 表示目标文件名。 - **重建 makefile**:当 makefile 自身发生变化时,可以通过特定规则自动重建。 - **重载 ...

Global site tag (gtag.js) - Google Analytics