随笔分类 - 编写C#157建议
摘要:static void Main(string[] args) { int[] nums = new int[] { 1, 2, 3, 4 }; int total = 0; Parallel.For<int>(0, nums.Length, () => { return 1; }, (i, loo
阅读全文
摘要:在使用LINQ查询时,可以按顺序输出查询结果。同时,LINQ也拓展了并行计算 --> PLINQ。 static void Main(string[] args) { List<int> intList = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
阅读全文
摘要:协变:让返回值类型返回比声明的类型派生程度更大的类型,就是“协变”。 class Program { static void Main(string[] args) { ISalary<Programmer> s = new BaseSalaryCounter<Programmer>(); Prin
阅读全文
摘要:1.委托是方法指针; 2.委托是一个类,当对其进行实例化的时候,要将引用方法作为它的构造方法的参数。 添加event关键字保护委托:在外的赋值都会报错。 class FileUploader { public delegate void FileUploadHandler(int progress)
阅读全文
摘要:闭包对象:如果匿名方法引用了某个局部变量,编译器就会自动将该引用提升到该闭包对象当中。 class Program { static void Main(string[] args) { List<Action> listAction = new List<Action>(); for (int i
阅读全文
摘要:Action:无返回值,可以包含16种参数; Func:有返回值,也可以包含16种参数,一共17种; Predicate:表示定义一组条件并判断参数是否符合条件。 class Program { delegate int AddHandler(int i, int j); delegate void
阅读全文
摘要:1.指定参数是值类型(除Nullable)外,可有如下形式: public void Method<T> (T t) where T: struct{} 2.指定参数是引用类型,可有如下形式: public void Methodl<T>(T t) where T: class{} //这个是直接c
阅读全文
摘要:总是优先考虑使用泛型: 避免在泛型类型中声明静态成员 static void Main(string[] args) { MyList mylist01 = new MyList(); MyList mylist02 = new MyList(); Console.WriteLine(MyList.
阅读全文
摘要:在LINQ查询中,避免不必要的迭代 MyList: class MyList : IEnumerable<Person> { List<Person> listPerson = new List<Person>() { new Person(){Name = "Mike",Age = 23}, ne
阅读全文
摘要:本地数据源用IEnumerable<T>; 远程数据源用IQueryable<T>;
阅读全文
摘要:在157前面出现实现迭代器的操作接口,但是扩展性太低,如果存在新的排序要求,必须实现新的比较器。 对代码的侵入性太高,为类型继承了接口,增加了新的方法。 List<Salary> companySalary = new List<Salary>() { new Salary(){Name = "Mi
阅读全文
摘要:在延迟求值的情况下,只是定义了一个查询,而且不是立刻执行。 List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var temp1 = from c in list where c > 5 select c; var
阅读全文
摘要:List<Person> personList01 = new List<Person>() { new Person(){Name = "1",CompanyID = 1}, new Person(){Name = "2",CompanyID = 1 }, new Person(){Name =
阅读全文
摘要:匿名类型的特性: 1.既支持简单类型也支持复杂类型。简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项; 2.匿名类型的属性是只读的,没有属性设置器,它一旦被初始化就不可更改; 3.如果两个匿名类型的属性值相同,那么就认为两个匿名类型相等; 4.匿名类型可以在循环中用作初始化器;
阅读全文
摘要:在对集合进行线程间的操作时要分外小心,集合属性开放可写操作。由于集合是引用类型,在两个线程中改变同一个集合,可能会导致另一个线程访问时出错。 class Student { public string Name { get; set; } public int Age { get; set; } }
阅读全文
摘要:不要为迭代器设置可读属性:其一:违背了设计原则的开闭原则,被设置到集合中的迭代器可能会导致集合的行为发生异常或者变动; 其二:LINQ可以不创建任何新的类型就能满足任何迭代需求。
阅读全文
摘要:实现自定义集合接口,需要继承ICollection和IEnumerable接口。 如果继承List则会丧失接口的使用。List并没有提供可供子类使用的protected成员。 在实现List接口的时候,new Add方法此时并没有覆盖掉List中的Add方法。 新建三个类 class Employe
阅读全文
摘要:确保集合的线程安全。在开启多线程操作集合的时候,很容易对集合进行增删改查,这样子,集合的访问情况就会变化。 AutoResetEvent:reset()方法.将线程设置为非终止状态,导致线程阻止;set()方法.将线程设置为终止状态,允许一个或多个等待线程继续。两者设置成功均返回true,不成功返回
阅读全文
摘要:集合总体上分为线性集合和非线性集合。线性集合具有直接前驱和直接后驱;而非线性集合可能有多个后驱或者前驱。 线性集合按存储方式又分为:直接存储和顺序存储。 直接存储:该类型的集合数据元素可以直接通过下标来访问(Array,string,struct);优点:向数据结构中添加元素很高效,直接放在数据末尾
阅读全文
摘要:在C#中的ICloneable中给出的Clone方法只是一个模棱两可的方法,并不足以实现深拷贝和浅拷贝。 深拷贝: using(Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter
阅读全文