随笔分类 - .NET基础
摘要:在.NET中,虽然CLR的GC垃圾回收器帮我们自动回收托管堆对象,释放内存,最大程度避免了"内存泄漏"(应用程序所占用的内存没有得到及时释放),但.NET应用程序"内存泄漏"的问题还是会存在,如果不加以注意,"内存泄漏"时有发生。 有关流以及Reader或Writer引起的内存泄漏 比如,把文件读取到流中: public static string ReadFile() { va...
阅读全文
摘要:如何高效地进行数组复制?如果把一个变量值复制给另外一个数组变量,那么2个变量指向托管堆上同一个引用。如果想在托管堆上创建另外的一份数组实例,通常使用Array.Copy方法。class Program{static void Main(string[] args){int[] a = {1, 3, ...
阅读全文
摘要:本篇体验除Queue和Stack之外的其它泛型集合。 SortedList SortedList和List比较相似,不同的地方在于SortedList集合元素是排过序的,往SortedList集合添加元素的时候需要添加键值对数据。在添加集合元素的时候,首先采用"二分查找算法"找到合适的位置,然后元素被放到该位置,该位置后面所有的集合元素整体后退一位。 static v...
阅读全文
摘要:本篇体验使用C#的泛型队列Queue实现生产消费模式。 如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列。 现在,要写一个体现生产消费模式的泛型帮助类,比如叫ProducerConsumer。 该类肯定会维护一个有关生产、物料的Queue类型的字段,还存在一个有关消费、Action类型的字段。 在Producer...
阅读全文
摘要:.Net为我们提供了众多的泛型集合。比如,Stack先进后出,Queue先进先出,List集合元素可排序,支持索引,LinkedList,双向链表的泛型实现,不支持索引;ISet不允许被复制,他有2个实现,一个是HashSet,不维持集合元素的排序,另一个是SortedSet,支持集合元素的排序;IDictionary是一个字典集合的泛型接口,SortedList实现了IDictionary,...
阅读全文
摘要:当有一组数据需要存放,到底是使用T[]呢,还是选择List呢? 先来看数组。 所有的数组类型都隐式地从System.Array这个抽象类派生,而System.Array又派生自System.Object。也就是说数组是引用类型。通过如下方式创建数组: int[] arrInt = new int[10]; 以上,在托管堆上分配了可以容纳10个未装箱int对象所需要的内存块(这个内存...
阅读全文
摘要:通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的。在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中调用Method1方法,try/catch捕获异常→在Method1方法中调用Method2方法,try/catch捕获异常→在Method2方法中故意抛出异常,try/catch捕获异常 ...
阅读全文
摘要:有这样一个有关汽车的类。 public class Car { public int ID { get; set; } public string Make { get; set; } } 现在,在客户端创建一个Car的集合实例,再遍历。 static void Main(string[] args) ...
阅读全文
摘要:关于协变逆变,SolidMango的解释是比较可取的。有了协变,比如,在需要返回IEnumerable类型的时候,可以使用IEnmerable来替代;有了逆变,比如,在需要接收IComparable类型形参方法中,可以使用IComparable类型实参来替代。 协变 先来体会协变。有2个具有继承关系的父类和子类。 public class Animal { ...
阅读全文
摘要:struct对象可能被分配在托管堆上吗? --会的。 比如当对struct装箱的时候,就会被分配在托管堆上。 比如,让一个struct实现一个接口。 public interface IReport { string Name { get; } } public struct Score : IReport { ...
阅读全文
摘要:struct是值类型,隐式继承自System.ValueType,struct实例被分配在堆栈上,由系统内存回收;class是引用类型,class的实例被分配在托管堆上,由GC回收。 struct不可以有无参构造函数(这种说法不准确,ChuckLu 提醒应说成:不能包含显式的无参构造函数。也就是说,struct有默认的无参构造函数,不能显式声明),只能有带参构造函数;class当然可以有无...
阅读全文
摘要:在学习.Net/C#或者任何一门面向对象语言的初期,大家都写过交换两个变量值,通常是通过临时变量来实现。本篇使用多种方式实现两个变量值的交换。 假设int x =1; int y = 2;现在交换两个变量的值。 使用临时变量实现 static void Main(string[] args) { int x = 1; ...
阅读全文
摘要:什么是.NET? 起源:比尔盖茨在2000年的Professional Developers Conference介绍了一个崭新的平台叫作Next Generation Windows Service,也就是后来的.NET。 软件层:.NET可以被看作是介于操作系统和编程语言之间的软件层,它可以支持多种编程语言,包括C#,VB.NET,C++,F#,等等。 用来产生托管代码的框架、平台:传...
阅读全文
摘要:标题可能无法表达我的本意。比如,有这样一个枚举: public enum MyChoice { MyFirstChoice = 0, MySecondChoice =1, MyThirdChoice = 2 } 数据库中,某表某字段保存值为"0,1,2",在显示的时候,我们希望是"第一个选择,第二个选择,第三个选择"...
阅读全文
摘要:Jeffrey Zhao真是神一样的存在,伊太结棍了(上海话),每次看他的博客得使劲使劲使劲地啃。本篇源于Jeffery Zhao的"逆泛型执行器"这篇文章。该文提到了为以下的接口写一个泛型方法: public interface IRecord { string GetString(string field); int GetInt(stri...
阅读全文
摘要:我们经常通过泛型构造函数创建泛型实例,也常调用实例的扩展方法。以下的代码在项目中随处可见: static void Main(string[] args) { var strs = new List {"hello","world"}; var result = strs.Where(s => s.StartsW...
阅读全文
摘要:在前一篇中,了解了Task的基本用法 如果一个方法返回Task,Task,如何获取Task的返回值,获取值的过程会阻塞线程吗? static void Main(string[] args) { var result = DoWorkAsync().Result; Console.WriteLine(result);...
阅读全文
摘要:我们知道,每个应用程序就是一个进程,一个进程有多个线程。Task Parallel Library为我们的异步编程、多线程编程提供了强有力的支持,它允许一个主线程运行的同时,另外的一些线程或Task也同时运行。本篇体验基本用法。 基本用法 Taks的构造函数接收的类型是Action,也就是一个委托。 static void Main(string[] args) ...
阅读全文
摘要:对集合排序,可能最先想到的是使用OrderBy方法。 class Program { static void Main(string[] args) { IEnumerable result = GetStudents().OrderBy(r => r.Score); foreach (var i...
阅读全文
摘要:通常说泛型,比如List是类型安全的,为什么这么说呢? 先来看一个类型不安全的例子。 class Program { static void Main(string[] args) { var tempArr = new ArrayList(); tempArr.Add(1); ...
阅读全文
浙公网安备 33010602011771号