关于var关键字及其反编译
来源:互联网 发布:linux查看snmp 编辑:程序博客网 时间:2024/05/22 13:05
C#中var关键字
分类: .NET C#2010-06-26 11:34 1157人阅读 评论(3) 收藏 举报
c#编译器objectstring.netide
var关键字是C# 3.0开始新增的特性,称为推断类型 .
可以赋予局部变量推断“类型”var 而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类型或任何表达式。
上面的资料有点抽象不好理解.
示例:
原来我们定义变量,是要这样:
数据类型 变量名 = 值;
如:
int a = 1;
string b = "2";
也就是说,"必须先明确地"指定你的变量是什么数据类型,才能给它赋值.这点很重要,要记住才好比较.
现在在C# 3.0里,有了变化,就是可以不用像上面那样定义变量了.
如:
var a =1 ;
那这个a,是什么类型呢?和原来的做法不一样了.
奥妙就在这里,IDE或编译器会根据你给a 的值:1,来"推论,断定"a是一个整数类型.
同理:
var b = "2";
因为给b的值是"2"这样一个字符串,所以,b就是string类型...
又如:
VAR 是3.5新出的一个定义变量的类型
其实也就是弱化类型的定义
VAR可代替任何类型
编译器会根据上下文来判断你到底是想用什么类型的
至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类型
就可以使用VAR 类似 OBJECT
但是效率比OBJECT高点
使用var定义变量时有以下四个特点:
1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:
var s;
s = “abcd”;
2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。
浅谈.NET编译时注入(C#-->IL)
2011-07-26 21:27 by 破狼, 3525 阅读, 3 评论, 收藏, 编辑
.NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点。本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入等等。
1:我们先来看看最简单的var:
C#:
public void TestVar()
{
var i = 0;
Console.WriteLine(i);
}
使用Reflector查看生成
IL:
反编译后的C#:
这里VS在编译的时候将var为我们转变为了int类型。
2:Action<int>:
C#:
public void TestAction()
{
var i = 1;
Func<int,int> f = t => t+1;
i=10;
f(i);
}
反编译后C#:
编译器为我们在这里生成了代理方法。
总结:
关于lambda表达式的编译规则:
当一个lambda expression被赋值给一个delegate类型,例如Action<T>或者Func<T, TResult>等,这个lambda expression会被编译器直接编译为
1) 当lambda expression没有使用闭包内的非局部引用也没有使用到this时,编译为一个私有静态方法;
2) 当lambda expression没有使用闭包内的非局部引用,但用到了this时,编译为一个私有成员方法;
3) 当lambda expression中引用到非局部变量,则编译为一个私有的内部类,将引用到的非局部变量提升为内部类的。
3:PostSharp:
PostSharp是结合了 MSBuild Task 和 MSIL Injection 技术,编译时静态注入实现 AOP 编程。在编译时候改变VS的编译行为。更详细的信息,请访问 PostSharp 网站
原c#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
new Program().TestPostSharp();
}
[ErrorHandler()]
public void TestPostSharp()
{
throw new Exception("I will throw a exception!");
}
}
[Serializable]
public class ErrorHandlerAttribute : PostSharp.Laos.OnMethodBoundaryAspect
{
public override void OnException(PostSharp.Laos.MethodExecutionEventArgs eventArgs)
{
//do some AOP operation!
Console.WriteLine(eventArgs.Method+":" +eventArgs.Exception.Message);
eventArgs.FlowBehavior = PostSharp.Laos.FlowBehavior.Continue;
}
}
}
反编译后:
今天就到此为至,只是简单的了解下IL注入实例,在后面会利用MSBuild Task+Mono Cecil 和PostSharp实现一些简单的注入实例.
作者:破 狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-博客园--破狼和51CTO--破狼。
- 关于var关键字及其反编译
- 关于js中var关键字的作用
- var关键字
- var关键字
- var关键字
- 使用var关键字
- C#中var关键字
- .NET 中的var关键字
- Var关键字的用法
- c#var关键字
- delphi中var关键字
- php 关键字 var
- C# var关键字用法
- C#中var关键字
- C#的var关键字
- C#中var关键字
- C#的var关键字
- javascript中的var关键字
- C++ STL map的使用
- WeakReference(弱引用)
- java:throw,throws,try和catch
- 黑马程序员——————java中的枚举
- Qt界面美化 QSS
- 关于var关键字及其反编译
- Oracle体系结构总览(整理)
- 新浪《天气通HD》 首页的 Demo
- C#读写xml文件
- man 命令的输出转换为.txt 或 .pdf
- 同步方法和异步方法的区别
- JAVA--基础加强_类加载器
- 计算机系统结构习题集1
- 字符串的全排列和组合递归非递归--排列组合扩展问题