警花档案3演员表:新手必看的C#编程技巧!

来源:百度文库 编辑:中财网 时间:2024/05/07 04:23:44
1.如果可能尽量使用接口来编程

    .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类。然而,在这种情况下如果你用.NET支持的接口而不是它的类来编程时,代码会变得更加稳定、可用性会更高。请分析下面的代码:
    private void LoadList (object [] items, ListBox l)
    {
     for (int i = 0; i < items.Length;i++)
      l.Items.Add (items[i].ToString ());
    }这个函数从一个可为任何对象的数组中加载ListBox,这段代码被限定为只能使用数组。假想过些时候你发现那些对象存在数据库中,或别的集合中。那么你 需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段程序,你就不用修改那段程序了,对于任何实现ICollection接口 的类型它都能很好的工作:

    private void LoadList (ICollection items,ListBox l)
    {
      foreach (object o in items)
      l.Items.Add (o.ToString ());
    }

    ICollection被数组和所有System.Collection中的集合实现。此外,多维数组也支持ICollection接口。如果那还不够的话,数据库.NET类同样支持ICollection接口。用接口写的这个函数不用需改就可以才许多中情况下使用。


    2. 使用属性代替原始数据

    因为属性已经成为语言本身的元素,所以声明数据元素时它的作用域等级没有必要大于private。因为代码本身会把属性看成数据元素,你并没有失去使用 简单数据类型的便利性 。相反它会使你的代码更加灵活功能更加强大。属性使你的数据元素封装性更好。属性可以让你使用lazy evaluation来返回数据。lazy evaluation的意思是当用户请求时才计算它的值,而不是一直保留着它。

    最后,属性可以是virtual也可以是abstract。你也可以在接口中定义属性。http://www.cokar.com

    这里还有维护方面的因素应当注意:尽管操作两者的方法是一样的,但是你把一个数据元素变成属性,那么原先客户端的程序便不能访问服务端的新版本程序了。实际上对于在Web service中你想实现序列化的值你可以把它们变成属性来使用:

     private int TheMonth = 0;

    [XmlAttribute ("Month")]
    public int Month
    {
     get {
      return TheMonth;
     }
     set {
      TheMonth = value;
     }
}



    简单通过属性就可以使你的所有数据元素私有化。


    3. 在Producer/Consumer 的Idiom中使用Delegate

    当你生成一个实现producer idiom类的时候,使用deletate来通知consumer。这种方法相对于用接口更加灵活。Delegate是多点传送的,所以不用加额外的代码你就何以支持多用户。相对于用接口这样做可使类之间的耦合性降低。

    下面的类处理键盘输入并把它传给所有的registered listeners:

   public class KeyboardProcessor
    {
    private OnGetLine theFunc = null;

    public OnGetLine OnGetLineCallback {
     get {
      return theFunc;
     }
     set {
      theFunc = value;
     }
    }

    public void Run (){
    // Read input.
    // If there is any listeners, publish:
    string s;
    do {
     s = Console.ReadLine ();
     if (s.Length == 0)
      break;
     if (theFunc != null){
      System.Delegate [] funcs =theFunc.GetInvocationList();
      foreach (OnGetLine f in funcs) {
       try {
        f (s);
       } catch (Exception e) {
        Console.WriteLine
        ("Caught Exception: {0}", e.Message);
       }
      }
     }
    } while (true);
    }


  任何数目的listeners都可注册到producer,它们所要做的只是提供一个特定的函数:deletate。

  4. 注意初始化顺序

  C#中对于一些变量声明加入了initializer的概念。它们在构造函数之前被执行,实际上变量在基类的构造函数执行前之前被初始化。

  所以,在初始化变量的时候不要用基类中的数据,因为它们还没有被构造。

     (C#尽量使用接口来编程 :http://www.cnblogs.com/huangcong/archive/2010/03/26/1697071.html)    http://wenku.baidu.com/view/ea8d8806eff9aef8941e06bf.html 面试题和部分技巧
网站设计常用技巧 ,防复制和另存 String 和 StringBuilder 的区别? 答案: (1)System.String 类是一种传统的修改字符串的方式,它确实可 以完成把一个字符串添加到另一个字符串上的工作没错。但是 在.NET 框架下,这个操作实在是划不来。因为系统先是把两个字 符串写入内存,接着删除原来的 String 对象,然后创建一个 String 对象,并读取内存中的数据赋给该对象。这一来二去的, 耗了不少时间,产生两个垃圾。 (2)而使用 System.Text 命名空间下面的 StringBuilder 类就不是 这样了,它提供的 Append 方法,能够在已有对象的原地进行字符 串的修改,简单而且直接。如果想要编写将连续操作依次连接起 来的单个语句,这将很方便。 如果要操作一个不断增长的字符串,请你不要再用 String 类 了。当然,一般情况下你是觉察不出这二者效率的差异的,但如果 你要对某个字符串进行大量的添加操作, 那么用 StringBuilder 类 所耗费的时间和 String 类简直不是一个数量级的。 11. 能用 foreach 遍历访问的对象需要实现 _______接口或声明 _________方法的类型。 答:IEnumerable 、 GetEnumerator。 12. GC 是什么? 为什么要有 GC? 答:GC 是垃圾收集器。程序员不用担心内存管理,因为垃圾收 集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之 一: System.gc() Runtime.getRuntime().gc() 13. String s = new String("xyz");创建了几个 String Object? 答:两个对象,一个是“xyx”, 一个是指向“xyx”的引用对象 s。 14. .abstract class 和 interface 有什么区别? 答: 声明方法的存在而不去实现它的类被叫做抽象类 (abstract class) ,它用于要创建一个体现某些基本行为的类,并为 该类声明方法,但不能在该类中实现该类的情况。不能创建 abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类, 并让它指向具体子类的一个实例。 不能有抽象构造函数或抽象静态 方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现, 否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其 行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是 抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方 法都是抽象的,没有一个有程序体。接口只可以定义 static final 成 员变量。接口的实现与子类相似,除了该实现类不能从接口定义中 继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有 这种接口的方法。然后,它可以在实现了该接口的类的任何对象上 调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量 的类型。通常的动态联编将生效。引用可以转换到接口类型或从接 口类型转换,instanceof 运算符可以用来决定某对象的类是否实现 了接口。 15. sleep() 和 wait() 有什么区别? 答:sleep()方法是使线程停止一段时间的方法。在 sleep 时间间隔 期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它 线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的 线程具有 更高的优先级 (b)正在运行的线程因为其它原因而阻塞。wait()是线程交互时,如 果线程对一个同步对象 x 发出一个 wait()调用, 该线程会暂停执行, 被调对象进入等待状态,直到被唤醒或等待时间到。 16.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么 错? 答:short s1 = 1; s1 = s1 + 1;有错,s1 是 short 型,s1+1 是 int 型, 不能显式转化为 short 型。 可修改为 s1 =(short)(s1 + 1) ; short s1 = 1; s1 += 1 正确。 17.如何处理几十万条并发数据? 答:用存储过程或事务。取得最大标识的时候同时更新..注意主键 不是自增量方式这种方法并发的时候是不会有重复主键的..取得 最大标识要有一个存储过程来获取. 18.Session 有什么重大 BUG,微软提出了什么方法加以解决? 答:是 iis 中由于有进程回收机制,系统繁忙的话 Session 会丢失, 可以用 Sate server 或 SQL Server 数据库的方式存储 Session 不过 这种方式比较慢,而且无法捕获 Session 的 END 事件。 19.进程和线程的区别? 答: 进程是系统进行资源分配和调度的单位; 线程是 CPU 调度和 分派的单位,一个进程可以有多个线程,这些线程共享这个进程 的资源 20.堆和栈的区别? 答: 栈:由编译器自动分配、释放。在函数体中定义的变量通 常在栈上。 堆:一般由程序员分配释放。用 new、malloc 等分配内存 函数分配得到的就是在堆上。 21.ASP。NET 与 ASP 相比,主要有哪些进步? 答:asp 解释形,aspx 编译型,性能提高,有利于保护源码。 22.产生一个 int 数组,长度为 100,并向其中随机插入 1-100,并且 不能重复。 int[] intArr=new int[100]; ArrayList myList=new ArrayList();//动态数组(数组列表) Random rnd=new Random(); while(myList.Count<100) { int num=rnd.Next(1,101); If(!myList.Contains(num)) { myList.Add(num); } } for(int i=0;i<100;i++) { intArr[i]=(int)myList[i]; } 23.列举 ASP.NET 页面之间传递值的几种方式。 答. 1.使用 QueryString, 如....?id=1; response. Redirect().... 2.使用 Session 变量 3.使用 Server.Transfer 24.如果在一个 B/S 结构的系统中需要传递变量值,但是又不能使用 Session、Cookie、Application,您有几种方法进行处理? 答 :this.Server.Transfer 25. 描述一下 C#中索引器的实现过程, 是否只能根据数字进行索引? 答:不是。可以用任意类型。 26.求以下表达式的值,写出您想到的一种或几种实现方 法: 1-2+3-4+……+m int Num = Convert.ToInt32(Console.ReadLine()); 答: int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) {Sum += i ;} Else {Sum = Sum - i;} } Console.WriteLine(Sum.ToString());