随笔分类 -  .net常识

.Net常识 值类型和引用类型
摘要:值类型和引用类型是.net里面的一个基本概念在面试的时候也经常遇到关于这个概念有很多误解,经常听到下面的说法1.两者的区别是值类型分配在堆栈上,引用类型分配在堆上 这句话不对,至少不准确2.值类型性能更好, 这句话要考虑情况先补充一些背景资料常见的值类型有:大部分原生类型,例如int float long 各种自己定义的结构体等等常见的引用类型有:string 各种Class 数组(包括int[]这种的)堆栈:在这里指的是执行堆栈堆:在这里指的是托管堆,就是LOH+G0+G1+G2让我们先来看看第一点:两者的区别是值类型分配在堆栈上,引用类型分配在堆上1.假设在一个方法里面有一个语句是 v.. 阅读全文

posted @ 2012-05-04 10:19 听说读写 阅读(1947) 评论(5) 推荐(1) 编辑

一些.Net面试题 (BS 方向)
摘要:解决方案和思路类: 设计和策略: 1.有一个网站的中购买功能, 假设现在有很多用户(假设10000人)在抢购一个物品,该物品的库存只有10个,请问怎么设计一个系统支持这样的场景 2.一个用户中心,保存用户名密码和其他基本资料, 你会怎样设计?(尽可能好,考虑安全,性能,扩展,高可用等等..) 3.前端(HTML HTTP等..)优化策略 4.应用服务器(主要是Asp.net)性能优化策略 5.互联网应用程序常见的安全风险和解决策略 6.设计模式(一般问最简单的单件模式在C#中的实现) 7.如何保证你的软件/产品的质量 问题排查: 1.有一台生产环境的Web服务器出现... 阅读全文

posted @ 2012-03-10 22:11 听说读写 阅读(26050) 评论(21) 推荐(14) 编辑

关于 HashCode做key的可能性
摘要:最近在设计一个分布式的key-value系统的时候中,出于性能和存储空间的考虑,准备把string类型的key替换为它的HashCode值.GetHashCode这个方法可能很多人都有所了解,不熟悉的可以看看这里:http://msdn.microsoft.com/zh-cn/library/system.object.gethashcode.aspx以下信息只限于String.GetHashCode,其他的例如Object.GetHashCode根据其他对象的实现不同而不同:1.对于不同的对象类型,或者同类型的不同值,返回值是可能重复的2.String.GetHashCode的实现是平台相关 阅读全文

posted @ 2011-12-06 11:17 听说读写 阅读(3415) 评论(1) 推荐(0) 编辑

.Net Famework 和 Library的源码下载
摘要:对以下项目源码有兴趣的朋友可以点击这里进去下载源码http://referencesource.microsoft.com/netframework.aspx.net 4.0Asp.net MVC 1.0 2.0WCFWF在Visual Studio中调试.net代码请看这里:http://blogs.microsoft.co.il/blogs/arik/archive/2010/07/12/step-into-net-framework-4-0-source-code.aspx.net 2.0 代码可以这边下载http://netmassdownloader.codeplex.com/ 阅读全文

posted @ 2011-12-05 15:56 听说读写 阅读(711) 评论(0) 推荐(0) 编辑

将switch case转为条件驱动
摘要:switch case是一种.net里面常用的条件分支语句,挺好用的;不过有些缺点:1.在有包含大量条件和执行语句的时候代码结构会很乱。2.不太符合面对对象的设计原则。3.对于查询条件是否满足一定范围这样的逻辑不太好用。将其转为条件驱动的实现,(本例使用Dictionary+Delegate的方式)View Code class SwitchTest { /// <summary> /// 常规写法 /// </summary> /// <param name="type"></param> public st... 阅读全文

posted @ 2011-12-04 16:53 听说读写 阅读(3058) 评论(2) 推荐(3) 编辑

【不小心就会犯错】 .NET的ConcurrentDictionary,线程安全集合类
摘要:ConcurrentDictionary 是.NET 4.0里面新增的号称线程安全的集合类。那么自然,我们会预期ConcurrentDictionary 中的代码是线程安全的(至少几个关键方法是线程安全的).举个例子,使用者可能会预期GetOrAdd中的方法当Key不存在的时候只执行一次Add的委托,第二次调用GetOrAdd就应该直接取回刚才生成的值了.参考一下以下代码: public static void Test() { var concurentDictionary = new ConcurrentDictionary<int, i... 阅读全文

posted @ 2011-11-21 11:51 听说读写 阅读(22255) 评论(14) 推荐(6) 编辑

【设计原则和建议】 构造和析构对象
摘要:良好的构造和析构对象,控制对象生命周期可以较大的提高程序的性能,降低GC的压力,减少BUG几率。本文还是比较简单的,主要还是经验的总结,很多东西也许各位已经知道,也许不知道。希望大家一起讨论。1.如果可能,避免静态构造函数 (也成为类型构造函数)性能原因 (不过因为一个类的静态构造函数只会执行一次,这不是一个大问题)静态构造函数不应该抛出异常2.如果可以,构造函数应该尽可能轻量级职责上说,构造函数只应该构造出一个对象,而不是执行一大堆初始化等的操作如果有很重量级的代码,用静态方法Create出来 例如WebRequest.Create3.一个常识,调用构造函数时,会先调用父类的构造函数4.一个 阅读全文

posted @ 2011-11-17 12:47 听说读写 阅读(1846) 评论(2) 推荐(1) 编辑

【设计原则和建议】 lock
摘要:lock是.net中最常用的锁了解lock机制,引用类型,值类型,字符串和应用程序域的朋友可能对以下的内容都很熟悉了1.先来看看推荐的lock代码 class LockDemo { private static object asyncLock = new object();//使用static object作为互斥资源 public static void Test() { lock (asyncLock)//保证该方法是线程安全的 { // 程序代码 ... 阅读全文

posted @ 2011-10-20 23:38 听说读写 阅读(2221) 评论(14) 推荐(3) 编辑

【设计原则和建议】 字段
摘要:希望和大家分享和讨论字段的设计思想和原则,共同进步。1.不要依赖字段的初始化顺序 class FieldDemo { private int id = 1;//通过某中方法获取Id的值 private ClassF f1 = new ClassF(1);//不要在这里依赖其他成员和执行顺序 public FieldDemo() { //在构造函数里面设置依赖关系和执行顺序 id = 1; f1 = new ClassF(id); } } ... 阅读全文

posted @ 2011-10-16 11:31 听说读写 阅读(1482) 评论(4) 推荐(1) 编辑

【设计原则和建议】 属性
摘要:基本1.在.NET中属性的本质实现是方法虽然本质是方法,不过当作互斥变量来使用还是挺方便的,(如Hashtable.SyncRoot)2.属性应该表现出相对静态的特征在没有其他代码干扰的时候,访问一个属性无论多少次 应该返回同样的结果 (DateTime.Now就是一个错误的设计)3.属性get方法一般不抛出异常现在很多地方使用到了延迟加载的设计,所以某些时候还是会抛出异常的4.谨慎使用集合类型的属性如直接返回List<T> 此类的元素可能,可能导致内部成员在外部被修改尽量把集合类型的属性设计为只读的(没有set)遍历集合类型的属性可能导致性能问题 public static L. 阅读全文

posted @ 2011-10-15 12:59 听说读写 阅读(1264) 评论(0) 推荐(3) 编辑

【设计原则和建议】 方法返回值
摘要:基本规则1.不要忽略返回值;如果不想处理返回值,就选择没有返回值的方法(如果有的话)2.公开给第三方的方法返回值类型在满足功能的情况下,尽量选择父类和接口,而不是具体类型 (面向对象的封装性)这点可能有很大的争议,我区分为对外的和对内的方法 (对内请看No.3)返回子类,意味要把子类的细节也暴露出去使用接口返回具体类型,就不用暴露细节了 public class ClassP //请忽略嵌套类的设计问题 { protected internal class User : IUser//我不想暴露User类的细节给外部 注:也可能是private等的访问性 ... 阅读全文

posted @ 2011-10-14 19:53 听说读写 阅读(3078) 评论(6) 推荐(1) 编辑

如何扩展Visual Studio 的编译时功能
摘要:很多时候会想在vs编译的时候自定义一些事情或者动作,例如: 拷贝生成的文件到特定的目录。 部署程序到测试目录或者环境,例如注册到windows服务,更新GAC等。 根据编译环境生成特定的配置文件(例如web.config) PS: 身在一个复杂环境, 这是我最想要的功能。 自动执行外部exe。 同步DLL和其他资源文件。1.最简单的自然是用Visual Studio自带的编译事件,这东西使用方便,又是Visual Studio自带的功能,就是功能弱了一点(好吧 其实是很弱)将项目生成的DLL文件拷贝到特定目录,(如果你想拷贝一整个文件夹 用xcopy; 当然,熟悉命令行的人可以弄出更... 阅读全文

posted @ 2011-10-07 11:06 听说读写 阅读(4293) 评论(7) 推荐(4) 编辑

WCF 常见逻辑和代码 2.参数检查 BeforeCall And AfterCall
摘要:这段代码可以直接在wcf4.0中跑...需要的人就拷贝走吧...我经常也会忘记代码..做个备份虽然.net已经内置了一些类型用于检查输入参数 例如DataLengthAttribute不过毕竟功能有限,实现自己的参数检查会更强大点.有些东西是内置无法实现的, 例如在输入的时候检查权限,Request还有记录运行时间等以下是C#代码(这里只是一种实现, IParameterInspector 还可以被应用到其他的地方 例如面对EndPoint和Attribute)View Code public class ValidationBehaviorSection : BehaviorExte... 阅读全文

posted @ 2011-10-07 10:33 听说读写 阅读(635) 评论(0) 推荐(0) 编辑

WCF 常见逻辑和代码 1.错误处理和配置
摘要:这些东西都很多人写过了.....放在这里只是做一个备份,要用的时候找的到 - -#需要的人直接拷贝代码就可以运行了注意只能运行在WCF 4.0中...因为为了少些点.....以下是c#代码用于定义错误处理View Code public class ErrorHandler : IErrorHandler {#if DEBUG public static ConcurrentDictionary<DateTime, Exception> ExceptionList = new ConcurrentDictionary<DateTime, Exception>();#.. 阅读全文

posted @ 2011-10-07 10:23 听说读写 阅读(521) 评论(0) 推荐(0) 编辑

从一次意外的堆栈溢出异常说开来 (一)
摘要:今天有一个朋友告诉我他的程序发生了StackOverFlowException可是查来查去不知道为什么,就一段递归代码几个人阅读过似乎都没有问题以下是简化版的代码 (真实的代码复杂很多,不过大意如下) static void Test(int i) { if (i > 20000)//或者其他退出条件 { return; } Test(i + 1); } static void Main() { ... 阅读全文

posted @ 2011-09-23 22:13 听说读写 阅读(687) 评论(3) 推荐(0) 编辑

NewSlot and ReuseSlot
摘要:namespace CSharpTester{ class Program { static void Main(string[] args) { var methodA = typeof(A).GetMethod("Test"); PrintAttributes(typeof(System.Reflection.MethodAttributes), (int)methodA.Attributes); var methodB = typeof(B).GetMethod("Test"); ... 阅读全文

posted @ 2011-09-20 21:55 听说读写 阅读(674) 评论(0) 推荐(0) 编辑

.net 常识 impersonate user 模拟用户
摘要:在.net中 程序运行的时候的权限一般等于运行这个程序的帐号的权限例如asp.net一般是 network serviceconsole一般是当前用户计划任务中也可以指定用什么帐号运行当前的程序asp.net中也可以在web.config中指定用什么帐号运行当前程序本文介绍了如果在你知道用户名,或者是用户名和密码的情况下 使用特定的帐号密码执行特定的代码,这样你在运行时就可以切换当前程序的帐号和权限以完成特定的目标 1.远程操作不同的机器需要不同的权限 (如果没有AD的话) 2.将程序切换到其他AD去 3.利用已知的帐号和密码,在运行时提高权限实现方式1,只知道帐号不知道密码,(这种执行方式是 阅读全文

posted @ 2011-04-05 16:16 听说读写 阅读(1052) 评论(0) 推荐(0) 编辑

.net 常识 在线程级别保存数据
摘要:上一篇文章介绍了在调用堆栈级别的保存和读取数据在大部分时候 我们使用的是同步方法在调用堆栈和线程级别没有差别, 1对1的有的时候我们想吧数据保存在线程里面就可以使用以下的代码: string THREAD_DATASLOT = "data name"; LocalDataStoreSlot namedDataSlot = Thread.GetNamedDataSlot(THREAD_DATASLOT); if (namedDataSlot == null) { Thread.AllocateNamedDataSlot(THREAD_DATASLOT); namedData 阅读全文

posted @ 2011-04-04 11:32 听说读写 阅读(925) 评论(1) 推荐(1) 编辑

.net 常识 CallContext
摘要:关于HttpContext.Current可能挺多人都有疑问的他究竟是怎么实现的呢为什么每个不同的请求去访问一个静态成员Current 能得到不同的结果呢?很明显的这个静态对象和当前调用的Context有关其内部实现类似于 CallContext.SetData() 和CallContext.GetData()通过SetData保存的数据 是和当前方法的调用堆栈有关的,例如你在方法A中间SetData然后方法A中Call了方法B 那么B中可以用GetData()获得数据,反过来也是ok的只要在这个方法堆栈上 都可以互相使用这些Data例如以下代码 public static WcfTransa 阅读全文

posted @ 2011-04-01 11:45 听说读写 阅读(3364) 评论(1) 推荐(2) 编辑

Common Log File System in windows 2008 性能测试
摘要:CLFS 是windows 服务器系统内置支持的日志系统可以直接使用System.IO.Logging 命名空间下面的相关类来操作写入速度测试环境:windows2008R2 sp1 (不要在xp上测试..这东西不支持的)没有raid8g 内存CPU: E5440写入1百万条日志每条512KB 预计日志大小至少512M最终耗时22秒...平均每秒4万多条测试代码很烂....如下所示string fullPath = @"c:\log\1.log"; int extentSize = 20 * 1024 * 1024; int logCount = 1 * 1000 * 10 阅读全文

posted @ 2011-03-31 17:48 听说读写 阅读(842) 评论(0) 推荐(0) 编辑

导航