随笔分类 - .NET基础
摘要:当对2个数实现加减乘除,其中的一个解决方案是通过委托来实现。如下: class Program { private delegate int CaculateDel(int num1, int num2); static void Main(string[] args) { CaculateDel caculateDel ...
阅读全文
摘要:Convert.ToString能处理字符串为null的情况。 static void Main(string[] args) { string msg = null; Console.WriteLine(Convert.ToString(msg)); Console.ReadKey(); ...
阅读全文
摘要:本篇体验私有构造函数的特点,以及在何种情况下使用私有构造函数。 □ 带私有构造函数的类不能被继承 在Animal类中声明一个私有构造函数,让Dog类来继承Animal类。 public class Animal { private Animal() { Console.WriteLine("i am animal"); ...
阅读全文
摘要:在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release。两者之间如何取舍呢? 假设有这么简单的一段代码,在主程序中调用方法M1,M1方法调用M2方法,M2方法调用M3方法,M3方法中抛出异常。 class Program { static void Main(string[] args) { M1();...
阅读全文
摘要:本篇体验Visual Studio的10个调试技巧,包括: 1、插入断点和断点管理2、查看变量信息3、逐语句F11,逐过程F10,跳出Shift+F114、查看堆栈信息5、设置下一条执行语句6、调试时修改局部变量并继续调试7、线程管理8、为断点设置条件9、使用命令窗口测试方法10、变量的历史记录 有这样的一个Person类: public class Person { ...
阅读全文
摘要:如果想对集合(系列)有本质的了解,链表是一个必须了解的概念。本篇主要包括: ● 链表的由来和定义● 创建一个单向链表● 其它链表 链表的由来和定义 在现实生活中,我们把不同的商品放在一个购物车中。而在面向对象的世界里,有时候,也需要把不同类型的数据放到一起,组成一个集合。集合中的元素并不是彼此孤立的,在C#中,如何表达集合元素间的关系呢? 借助"自引用类"可以确立集合元素间的关系。比如有这样...
阅读全文
摘要:在选择排序中,从第一个元素开始,依次遍历数组中的元素,找出当前遍历元素之后的最小元素,与当前遍历元素交换位置,依此类推,是一种由前往后的排序。而在插入排序中,从第二个元素开始,依次遍历数组中的元素,把当前遍历元素与之前的元素进行比较,并插入到之前的某个位置,是一种由后往前的排序。 自定义一个类,里面维护着一个int[]类型数组,通过构造函数定义数组长度并初始化,并提供了打印和插入排序的相关方法...
阅读全文
摘要:简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上。class是引用类型,创建一个class类型实例被分配在托管堆上。但struct和class的区别远不止这么简单。本篇主要包括: ■ 概括来讲■ 从赋值的角度体验struct和class的不同■ 从参数传值角度体验struct和class的不同■ 从struct类型的struct类型属性和struct引用类型属性体验st...
阅读全文
摘要:我们经常用简单数据类型,比如int作为泛型Dictionary的key,但有时候我们希望自定义数据类型作为Dictionary的key,如何做到? 如果我们想自定义一个struct类型作为key,就必须针对该struct定义一个实现IEqualityComparer接口的比较类,实现该接口的2个方法:Equals()方法和GetHashCode()方法,前者用来比较两个key是否相等,后者用来获...
阅读全文
摘要:.net扩展方法可以扩展很多类型,包括:基本数据类型、接口、类,等等。如果,需要扩展的类型包含私有成员,扩展方法如何运用这些私有成员呢?本篇逐一体验,包括: ■ 扩展基本数据类型■ 扩展接口■ 扩展包含私有字段的类 使用反射获取类的私有字段■ 扩展一个类的私有嵌套类 通过反射 扩展方法有几个必要前提:● 扩展方法所在的类必须是静态类● 扩展方法本身必须是静态方法● 扩展方法参数中,对类型的扩展...
阅读全文
摘要:在项目中,有时候会用到领域枚举和DTO枚举的映射和转换。有一个现实的问题是:如果领域枚举项发生变化,而DTO枚举项没有及时更新,这样会造成映射不上的问题。那么,如何避免此类问题呢? 先看领域枚举和DTO枚举映射完好的情况。 class Program { static void Main(string[] args) { var queryO...
阅读全文
摘要:对于一些"大对象"的创建,我们常常希望延迟加载,即在需要的时候再创建对象实例。现在Lazy很好地支持了这一特点。主要包括: 没有Lazy之前 Lazy实例 延迟加载的本质 没有Lazy之前 在没有Lazy之前,我们通过如下方式实现延迟加载。 public class LazySinleton{ private LazySingleton() {} public sta...
阅读全文
摘要:协变(Convariant)和逆变(Contravariant)的出现,使数组、委托、泛型类型的隐式转换变得可能。 子类转换成基类,称之为协变;基类转换成子类,称之为逆变。.NET4.0以来,支持了泛型接口的协变和逆变。 泛型协变 如果子类泛型隐式转换成基类泛型,使用泛型协变。 有这样的2个基类和派生类。 public class Animal { public virt...
阅读全文
摘要:在" .NET泛型01,为什么需要泛型,泛型基本语法"中,了解了泛型的基本概念,本篇偏重于泛型的使用。主要包括: ■ 泛型方法重载需要注意的问题■ 泛型的类型推断■ 泛型方法也可以有约束■ 泛型接口■ 泛型委托■ 使用EventHandler事件泛型 泛型方法重载需要注意的问题 public class MyArray{ public T myData; public MyArr...
阅读全文
摘要:.NET泛型或许是借鉴于C++泛型模版,借助它可以实现对类型的抽象化、泛型处理,实现了类型和方法之间的解耦。一个最经典的运用是在三层架构中,针对不同的领域模型,在基接口、基类中实现针对各个领域模型的泛型处理。 本篇主要包括:■ 为什么需要泛型 ※ 不用泛型 ※ 使用泛型 ※ 泛型的运行时本质■ 泛型语法■ 典型的泛型类 为什么需要泛型 不用泛型 来看一个比较类型的方法。 public cl...
阅读全文
摘要:在" .NET的堆和栈01,基本概念、值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配。我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收。 在" .NET的堆和栈02,值类型和引用类型参数传递以及内存分配"中,我们了...
阅读全文
摘要:在" .NET的堆和栈01,基本概念、值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配。我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收。 在" .NET的堆和栈02,值类型和引用类型参数传递以及内存分配"中,我们了...
阅读全文
摘要:在" .NET的堆和栈01,基本概念、值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配。我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收。而本篇的重点要放在:值类型和引用类型参数的传递,以及内存分配。 主要包括:■...
阅读全文
摘要:当我们对.NET Framework的一些基本面了解之后,实际上,还是很有必要了解一些更底层的知识。比如.NET Framework是如何进行内存管理的,是如何垃圾回收的......这样,我们才能写出更高性能的程序。 在.NET Framework中,有2个地方帮我们保存管理数据:一个是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Collection, G...
阅读全文
摘要:Jeffrey Zhao在"你的字典里有多少元素?"一文中,提到了他在面试时问过的一个问题:List是怎么存放元素?不幸的是,自己也回答不出来,只知道怎么用,却不知道为啥这样用,很明显的"知其然而不知其所以然"。于是,扒了一段List的一段源码来一窥究竟。 using System;using System.Diagnostic;using System.Collections.ObjectMod...
阅读全文
浙公网安备 33010602011771号