C#:额外知识点
7、Const 与 Readonly 区别: 前者静态,后者动态; 前者值替换,后者可以在初始化时赋值
编译结束之后使用Reflector或者IL工具查看代码,是没有I这个常量的,所有使用I这个常量的地方,都被替换成了值100。
基于以上原因,所有public修饰的变量,都不应该使用const修饰,因为,如果外部类引用了这个变量(常量),编译的时候,编译器会自动将该常量替换为值。后果就是,如果改变了该常量的值,就必须重新编译所有引用该常量的代码。
场景:该常量放在一个dll里,现在值变了,就必须更新所有引用了该dll的文件,而不是替换该dll就可以。
6、写入、输出二进制数据(指定地址 与 内存交互数据)
public void WriteSerialize(object data, int offset, int length)
{
BinaryFormatter formatter = new BinaryFormatter();
byte[] buffer = new byte[length];
MemoryStream serializationStream = new MemoryStream(buffer, , length, true, true);
formatter.Serialize(serializationStream, data);
serializationStream.Flush();
serializationStream.Close();
this.WriteBytes(buffer, offset);
} public void WriteBytes(byte[] data, int offset)
{
for (int i = ; i < data.Length; i++)
{
Marshal.WriteByte(this.mappedView, offset + i, data[i]);
}
} public object ReadDeserialize(int offset, int length)
{
byte[] data = new byte[length];
this.ReadBytes(data, offset);
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream serializationStream = new MemoryStream(data, , length, true, true);
object obj2 = formatter.Deserialize(serializationStream);
serializationStream.Close();
return obj2;
} public void ReadBytes(byte[] data, int offset)
{
for (int i = ; i < data.Length; i++)
{
data[i] = Marshal.ReadByte(this.mappedView, offset + i);
}
}
5、设置、获取域值:
public static void SetDomainValue(string key, object password)
{
AppDomain.CurrentDomain.SetData(key, password);
} public static T GetDomainValue<T>(string key)
{
object value=AppDomain.CurrentDomain.GetData(key) ;
if(value==null)return default(T);
return (T)value;
}
4、依据类型名称创建委托并执行
public delegate object MethodInvoker();
public delegate Object ParamsConstructorDelegate(params object[] parameters);
public static object NewInstance(Type type)
{
return CreateDelegate(type.GetConstructor(Type.EmptyTypes)).Invoke();
}
private static MethodInvoker CreateDelegate(ConstructorInfo target)
{
var dynamic = new DynamicMethod(string.Empty,
typeof (object),
new Type[],
target.DeclaringType);
ILGenerator il = dynamic.GetILGenerator();
il.DeclareLocal(target.DeclaringType);
il.Emit(OpCodes.Newobj, target);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);
return (MethodInvoker) dynamic.CreateDelegate(typeof (MethodInvoker));
}
public static object NewInstance(Type type, params object[] parameters)
{
return BuildParamterConstructorDelegate(type).Invoke(parameters);
}
private static ParamsConstructorDelegate BuildParamterConstructorDelegate(Type type)
{
var mthd = new DynamicMethod(".ctor", type,
new[] {typeof (object[])});
ILGenerator il = mthd.GetILGenerator();
ConstructorInfo ctor = type.GetConstructors()[]; // not very robust, but meh...
ParameterInfo[] ctorParams = ctor.GetParameters();
for (int i = ; i < ctorParams.Length; i++)
{
il.Emit(OpCodes.Ldarg_0);
switch (i)
{
case :
il.Emit(OpCodes.Ldc_I4_0);
break;
case :
il.Emit(OpCodes.Ldc_I4_1);
break;
case :
il.Emit(OpCodes.Ldc_I4_2);
break;
case :
il.Emit(OpCodes.Ldc_I4_3);
break;
case :
il.Emit(OpCodes.Ldc_I4_4);
break;
case :
il.Emit(OpCodes.Ldc_I4_5);
break;
case :
il.Emit(OpCodes.Ldc_I4_6);
break;
case :
il.Emit(OpCodes.Ldc_I4_7);
break;
case :
il.Emit(OpCodes.Ldc_I4_8);
break;
default:
il.Emit(OpCodes.Ldc_I4, i);
break;
}
il.Emit(OpCodes.Ldelem_Ref);
Type paramType = ctorParams[i].ParameterType;
il.Emit(paramType.IsValueType
? OpCodes.Unbox_Any
: OpCodes.Castclass, paramType);
}
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Ret);
return (ParamsConstructorDelegate)
mthd.CreateDelegate(typeof (ParamsConstructorDelegate));
}
依据反射创建实例:
private static void InitUCBookCommonDll()
{
string dllItem = "My.Common";
Assembly assembly = null;
try
{
assembly = Assembly.Load(dllItem);
}
catch (Exception)
{
PrintLog(string.Format("加载程序集-{0}错误!", dllItem));
}
int index = dllItem.IndexOf("My");
if (index != -)
{
string typeName = dllItem.Substring(index) + ".LibLoader";
Type type = assembly.GetType(typeName);
if (type != null)
FastActivator.NewInstance(type);
}
}
3、注册、发送Windows消息:
[DllImport("user32", SetLastError = true)]
public static extern int RegisterWindowMessage(string message);
[DllImport("user32", SetLastError = true)]
private static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
2、通过类型名称、方法名称,执行方法:
public static void MethodInvoker(object obj, string methodName, params object[] args)
{
Type type = obj.GetType();
MethodInfo methodInfo = type.GetMethod(methodName);
methodInfo.Invoke(obj, args);
}
1、通过类型名称,创建实例:
public static object CreateInstance(string typeFullName, params object[] args)
{
Type type = Type.GetType(typeFullName);
return Activator.CreateInstance(type, args);
}
C#:额外知识点的更多相关文章
- MySQL知识树-查询语句
在日常的web应用开发过程中,一般会涉及到数据库方面的操作,其中查询又是占绝大部分的.我们不仅要会写查询,最好能系统的学习下与查询相关的知识点,这篇随笔我们就来一起看看MySQL查询知识相关的树是什么 ...
- MySQL知识树-支持的数据类型
本篇学习笔记的主要内容: 介绍MySQL支持的各种数据类型(常用),并讲解其主要特点. MySQL支持多种数据类型,主要包括数值类型.日期和时间类型.字符串类型. 数值类型 MySQL的数值类型包 ...
- 从源码角度理清memcache缓存服务
memcache作为缓存服务器,用来提高性能,大部分互联网公司都在使用. 前言 文章的阅读的对象是中高级开发人员.系统架构师. 本篇文章,不是侧重对memcache的基础知识的总结,比如se ...
- [读行者][学习LinqExpression和Reflection(Emit)]阅读TypeBuilderSample之ExampleFromTheArticle
前言 关于”读行者“ 俗语有云:"读万卷书,行万里路“.多读一些优秀代码,不仅可以锻炼我们读代码的能力(便于维护或相互交流),还可以吸取很多我们成长所需的知识点.多读,才能开阔我们的眼界,才 ...
- JS面向对象编程之:封装、继承、多态
最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术.为了让我的代码多点艺术,我就重新温故了<javascript高级程序设计>(其中几章),然后又看了<javascrip ...
- MySQL学习分享-->日期时间类型
日期时间类型 ①如果要用来表示年月日时分秒,一般使用datetime类型: ②如果要用来表示年月日,一般使用date类型: ③如果要表示时分秒,一般使用time类型: ④如果只是表示年份,一般使用ye ...
- MySQL学习分享-->查询-->查询的分类
MySQL的查询可以分为交叉联接.内联接.外联接.自然联接.straight_join 下面对于查询的学习,会用到以下四张表: create table t_commodity_type( `id` ...
- MySQL学习分享-->查询-->查询的原理
查询的原理 在一个查询中常包含下述子句: 1.select,2.distinct,3.join,4.on,5.from,6.where,7.having,8.group by,9.order by,1 ...
- 第五节 suid/ sgid /sbit /which /locate / find /stat / ln / uname -a
复习上节课内容(重点记录)1.chown -R 递归修改目录下包含子目录和子目录下的文件的属组2.chmod -R 递归修改目录下包含子目录和子目录下的文件的权限 ================== ...
随机推荐
- TotalCommander 之 配置
一.设置配置界面: 1.进入设置界面 点击菜单栏的配置,然后再点击配置里面的选项,便会出现Total Commander设置的界面. 2.设置字体 刚开始,大家会发现这不是我们熟悉的字体啊 ...
- webrtc初识
最近由于项目的需求,开始接触了webrtc这个东西.没想到这东西的门槛还是蛮高的,接下来分享一下我所踩过的坑,希望对以后初次接触这个东西的人有所帮助. webrtc官网 第一步当然是看官方主页了(ww ...
- .NET Framework基础知识总结
之前给大家总结了java的面试几次技巧总结,同学们看了觉得还是不错,能够得到大家的认可,感觉还是挺不错的.现在又有同学来想小编索要.NET面试的总结了,好吧.谁让小编这么好呢!以下是.NET面试之框架 ...
- 阿里云服务器Linux CentOS安装配置(七)域名解析
阿里云服务器Linux CentOS安装配置(七)域名解析 1.购买域名 登录阿里云,左侧菜单点击[域名],然后[域名注册],完成域名购买.(一般首年45元) 2.添加域名解析 在域名列表里点击你的域 ...
- InnoDB杂记
一.InnoDB写数据流程(猜想) myisam是将索引放入内存缓存(Key Cache,大小有key_buffer_size设置) innodb时间索引和数据文件都放入内存缓存池(Buffer Po ...
- ajax请求的封装
前端的工作,免不了要用到交互,请求后端的数据,可能大多人一直选择用jq封装好的方法直接使用,要知道封装这个事我们自己也可以的,今天给大家介绍一种封装方法,而且连跨域问题都不在话下,有了这个函数,是不是 ...
- Asp.Net Mvc Areas 的用法与好处
前言 在项目中为什么要使用Areas 进行分离 大家都知道,一般的Web应用都有前台(面向用户)和后台(面向管理员)两部分,我们希望以/localhost/Admin 开始的Url 是用户的后台管理地 ...
- cloudera learning6:Hadoop Security
保证Hadoop安全的最有效方法是对cluster进行隔离(isolation,常用方法是把大集群划分若干个小集群). Hadoop安全措施的目的是防止好的人不小心做了坏的事,而非防止坏人坏事. Ke ...
- B2C电子商务系统研发——商品SKU分析和设计(二)
转:http://www.cnblogs.com/winstonyan/archive/2012/01/07/2315886.html 上文谈到5种商品SKU设计模式,本文将做些细化说明. 笔者研究过 ...
- php,session验证码不一致慢半拍
这种问题遇到过一次,后来忘了怎么解决了,所以做下笔记 输出的$_SESSION['code']之所以比图片慢了‘一帧’,这也纯属正常情况因为输出的图片是一个连接一次调用,而echo $_SESSION ...