C#高效编程话题集2(每期10话题)

简介:

1:确保集合的线程安全

如果使用.net4.0,有新的线程安全集合类
新的 System.Collections.Concurrent 命名空间引入了多个新的线程安全集合类,可在需要时随时提供对项的无锁访问,并在锁适用时提供细粒度锁定。 在多线程方案中使用这些类应获得优于集合类型(例如, ArrayList 和 List <(Of <(T >)>))的性能。

除了System.Collections.Concurrent空间下集合外,非泛型集合使用
lock(非泛型集合对象.SyncRoot)进行锁定达到集合线程安全目的
泛型集合使用
static object sycObj = new object(); //是否static看具体应用
lock (sycObj)
{
     //操作集合。
}

2:循环中先求长度还是使用list.Count,哪个效率高

第一类:

int len = list.Count; 

for(int i; i<len; i++)

{

     迭代

}

第二类:

for(int i; i<list.Count; i++)

{

     迭代

}

答案是一样高。

第一种方法完全没有必要,很多人可能以为那样会为代码带来效率,而实际上是不会给效率带来任何提升。
因为事实上,索引器内部,为了安全期间,还是会去求整个list的count的。将两者代码贴出来可能会更好的理解这一点:
public T this[int index]
{
    get
    {
       if (index >= this._size)
      {
          ThrowHelper.ThrowArgumentOutOfRangeException();
      }
      return this._items[index];
    }
    set
    {
        if (index >= this._size)
        {
            ThrowHelper.ThrowArgumentOutOfRangeException();
        }
        this._items[index] = value;
        this._version++;
    }
}


public int Count
{
    get
    {
        return this._size;
    }
}

3:善用延迟求值

以List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};为例,说明linq查询中的延迟求值和主动求值。

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 temp2 = (from c in list where c > 5 select c).ToList<int>();
list[0] = 11;
Console.Write("temp1: ");
foreach (var item in temp1)
{
    Console.Write(item.ToString() + " ");
}
Console.Write("\ntemp2: ");
foreach (var item in temp2)
{
    Console.Write(item.ToString() + " ");
}

4:谨慎泛型类型中的静态成员

static void Main(string[] args)
{
     MyList<int> list1 = new MyList<int>();
     MyList<int> list2 = new MyList<int>();
     MyList<string> list3 = new MyList<string>();
     Console.WriteLine(MyList<int>.Count);
     Console.WriteLine(MyList<string>.Count);
}
class MyList<T>
{
     public static int Count { get; set; }
     public MyList()
     {
         Count++;
     }

}

代码输出是莫子?

只要知道 MyList<int> 和 MyList<string> 是两个不同的类型,这题就不难理解了。.NET 中类型参数不同的封闭泛型类型是不同的类型。

5:小心闭包中的陷阱

for (int i = 0; i < 10; i++)
{
     Action t = () =>
    {
        Console.WriteLine("t1:" + i.ToString());
    };
    t.BeginInvoke(null, null);
}

以上代码的输出为?

当闭包中引用了外部的局部变量或者方法参数的时候,C#会把该变量编译成一个类的实例字段,顶楼的代码编译后实际上等效于:
TempClass tp = new TempClass();
for (tp.i = 0; tp.i < 10; tp.i++)
{
Action t = tp.TempMethod;
t.BeginInvoke(null, null);
}
TempClass是C#编译器自动生成的类,其定义大概是这样:
class TempClass
{
public int i;
public void TempMethod()
{
Console.Writeline("t1:" + i.ToString());
}
}
因为只循环10次,几乎一瞬间就完了,因此第一个异步委托还没开始执行 tp.i 就等于10了

6:event关键字的作用

既然使用委托也能实现回调,为什么又需要event关键字。答曰:event 最大的作用就是防止在类的外部触发类的事件。

7:区分IEnumerable<T>和IQueryable<T>

本地数据源用IEnumerable<T>,远程数据源用IQueryable<T>。
针对LinqLINQ TO to OBJECTS,使用Enumerable中的扩展方法对本地集合进行排序、查询等操作,查询参数接受的是Func< >。Func< >叫做谓语表达式,相当于一个委托。针对LinqLINQ TO to SQL则使用Querable中的扩展方法,它接受的参数是Expression< >。Expression< >用于包装Func< >。LinqLINQ TO to SQL引擎最终会将表达式树转化成为相应的SQL语句,然后在数据库中执行。

  

8:选择正确的集合

查看此文吧:http://www.cnblogs.com/luminji/archive/2011/03/24/1993393.html

9:泛型参数的约束是不是应该叫约定更好

在泛型的使用过程中,常常使用到的一个功能就是为泛型参数设定约束。约束听上去像是限制了泛型参数的使用范围,而实际上,约束本身确实拓展了泛型参数的使用。

一个没有约束的泛型参数,只能具有object的行为和属性,而一个指定约束为Student的泛型参数,却可以使用类型Student的所有公开属性和方法。

所以,俺觉得约束这个词翻译的实在不好,叫约定多好。

10:减少使用自定义委托

FCL中的3个(或者说3系列)委托已经满足了大部分自定义委托的需求,所以基本上不再需要自定义委托了。

它们是:

Action表示接受0个或多个输入参数,执行一段代码,但是没有任何返回值;

Func表示接受0个或多个输入参数,执行一段代码,同时有返回值;

Predicate表示定义一组条件并判断参数是否符合条件;


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/03/25/1994097.html,如需转载请自行联系原作者


相关文章
|
8月前
|
设计模式 运维 索引
【2023总结】谈谈文章背后的故事与思考
【2023总结】谈谈文章背后的故事与思考
|
2月前
从代码中感悟人生:一段编程旅程的启示
在编码的世界里,每一行代码都像是生命中的一次选择,每一个函数都承载着特定的使命。本文以编程的视角,探讨技术成长与人生哲理之间的奇妙联系。从最初的迷茫到逐渐找到方向,再到不断学习和提升,这段旅程充满了挑战与收获。正如甘地所言:“你必须成为你希望在世界上看到的改变。”通过编程,我们不仅塑造了软件,也塑造了自己。
探索编程之道:从代码到哲学的启示之旅
【9月更文挑战第35天】在编程的世界里,每一行代码都蕴含着深刻的意义。本文通过深入浅出的方式,带领读者从基础的编程概念出发,逐步探索编程背后的哲理。我们将一起发现,编程不仅仅是技术操作,它更像是一场思维和逻辑的训练,一次对世界本质的洞察。文章将通过具体示例,展示如何将编程技能与日常生活相结合,以及如何通过编程来提升个人的思维能力和解决问题的能力。让我们开始这段充满启发的旅程吧!
|
8月前
|
算法 程序员
探寻技术之美:代码世界的奇妙旅程
在数字化时代,技术已经渗透到生活的方方面面,而作为程序员,我深深感受到了代码世界的奇妙之处。本文将带领读者一起探寻技术之美,感悟代码背后的精妙之处。
|
5月前
|
搜索推荐 程序员
探索代码之美:一段编程旅程的启发与感悟
【8月更文挑战第30天】编程,这个听起来有些高冷的技能,实际上就像绘画或音乐一样,是一种创造性的表达。它不仅仅是冷冰冰的代码和逻辑,更是情感和智慧的结晶。本文将通过一次个人的编程经历,探讨如何通过代码来解决问题、创造美,以及这一过程中的思考与成长,从而揭示编程背后的艺术性和哲学意义。
|
5月前
|
程序员
技术感悟:编程之道的艺术与实践
【8月更文挑战第12天】本文旨在探讨编程不仅仅是一种技术活动,更是一种艺术和实践的过程。通过个人的技术成长历程,我们将深入理解如何将编程技能与创新思维相结合,以及如何在不断变化的技术环境中保持学习和进步。文章不包含代码示例,而是侧重于理论的阐述和个人经验的分享,以期为读者提供一种全新的视角来看待编程和技术发展。
|
Java 程序员
话题讨论 | 程序员表白,不光需要“技术”,更需要勇气!
回忆起我们的点点滴滴,我们也有美好回忆。程序员应该如何表白呢 ?很大一部分是不够自信,怕穷,怕拒绝,其实更多的你可能需要的是一份勇气,爱,要大声说出来!恰逢官方正文,在此总结一下我们的点点滴滴,平凡而又伟大。
231 0
|
编译器 C语言 C++
高效学习C++基础部分&话题挑战赛
高效学习C++基础部分&话题挑战赛
151 0
高效学习C++基础部分&话题挑战赛
|
安全
今日话题
留言区等你的答案哦~
997 0
今日话题
|
程序员
【话题】选择是否真的比努力更重要?
在话题“2018的有哪些风口值得期待”中有一个问题是“2.作为程序员如何应对技术快速升级?是否有经验分享”,有小伙伴的回答是“先判断,再学习。因为有时选择比努力重要,所以要先判断。”这引发了我的思考: 我们是:先判断,再学习;or 先学习,再判断?是在判断中学习 or 在学习中判断? 插曲:机器视觉记得一段介绍机器视觉的内容曾经说过: 几岁的小孩子可以轻易的识别猫、狗等等,他们是怎么识别的呢?其实人每眨一次眼睛就等于拍下了一张照片,存在大脑里。
1043 0

热门文章

最新文章