C#基础总结

来源:互联网 发布:类似淘宝的交易平台 编辑:程序博客网 时间:2024/05/22 03:02

MSDN C# 语言规范:
https://msdn.microsoft.com/zh-cn/library/ms228593.aspx



.NetFramework简介

.netframework运行于操作系统之上,提供良好的跨语言特性。
.netframework包含两个内容:公共语言运行时(CLR)和类库集(FCL)
MSIL微软中间语言。当编译.net支持的语言编写的代码的时候,输出的代码为MSIL
CLR又包含:通用语言规范(CLS:保证语言互操作性的一组规则)和公共类型系统(CTS:包含了.net支持的各语言间兼容的数据类型和功能)

--------------------------------------------------------------------------------

C#中的变量和常量
C#中的基本数据类型:
值类型和引用类型
值类型:简单类型、结构类型和枚举类型。
简单类型:整数类型、浮点类型、小数类型(decimal)和布尔类型等
sbyte是有符号的,相当java的byte型,范围-128~127
C#中byte是无符号的,范围0~255

--------------------------------------------------------------------------------

变量命名方法:
帕斯卡命名法和骆驼命名法
帕斯卡命名法:如果有多个单词组成,每个单词首字母大写
骆驼命名法:如果有多个单词组成,第一个单词全部小写,后面的单词大写

--------------------------------------------------------------------------------

C#中的常量:const与readonly两种
const声明的常量:叫静态常量,必须声明时就初始化,且只能用常数值初始化
readonly声明的常量:叫动态常量,可以在声明时不初始化,只能在构造函数中初始化,但必须每个构造函数中都要初始化;而且可以使用变量值初始化

class Test
{
       const  float PI =3.1416f;      //常量命名:全部大写
       readonly float G;
       public Test()
       {
               G = 9.80F;
       }
       public Test(float g) //每个构造函数中都要初始化;而且可以使用变量值初始化
       {
               G = g;
       }
}

--------------------------------------------------------------------------------

C#中的装箱和拆箱
装箱:值类型转换成有引用类型
拆箱:引用类型转换成值类型
值类型:存在栈中
引用类型:在堆中存放对象的地址(即引用),对象本身存放在栈中
拆装箱允许值类型和引用类型相互处理

--------------------------------------------------------------------------------

C#语法

Switch()括号中可以是int ,char和string,switch语句中的case语句冒号后什么都不写,可以不写break,其他情况一定要写break,否则报错

数组:五种声明方式
   int []array;
   array = new int[2];

   //第二种声明方式
   int []array1 = newint[2];

   //第三种声明方式
   int []array2 = {1,2,3};

   //第四种声明方式
   int []array3 = newint[]{1,2,3};

   //第五种声明方式
   int []array4 = newint[3]{1,2,3};

   //数组大小也可以是变量
   int count = 3;
   int []arr = newint[count];




--------------------------------------------------------------------------------

枚举:用有意义的字符去访问数据
public enum Contry:long //指定枚举类型,必须是整型,不写为int型
  {
  Pacific,        //第一个未付值,默认为零
   China=1860,
   Japan,
   US=1901,
   Canada
 
  }

--------------------------------------------------------------------------------

C#中的面向对象
析构函数:函数名与构造函数名一样,~函数名(),不接受参数,由垃圾回收器自动调用(GC.Collect()调用垃圾回收器)
 

virtual关键字:C#中,子类要重写父类的方法,必须把父类的方法标识为virtual(虚拟的),同时重写方法用override修饰
new 关键字:new关键字:在子类中定义的一个和父类方法签名一样,但是个全新的方法。并非重写父类的方法。
base关键字:用base关键字调用父类的方法

访问修饰符:
public 公有的,
internal 在一个项目中的,
protected有父子关系的类,
private仅所属类的成员

注意:如果有一个类既继承类又实现接口,类名要写在接口名前面。



--------------------------------------------------------------------------------

属性,索引器,委托,事件

属性:访问修饰一般为public,首字母大写。属性内有get和set访问器,get内必须要有return,set内有value关键字,代表从外部接受的值。
索引器:索引器的作用:像处理数组一样去处理类的对象。
    public classStudent
     {
         private string []obj=new string[10];

         //this关键字在这里代表每一个类的对象,[]中整数是指通过下标访问
         public string this[intindex]           //此是可以通过索引号去访问每一个类的成员   
         {
              get
              {
                   return obj[index];
              }
              set
              {
                   if(value!=null)
                   obj[index]=value;
              }
         }
        static void Main(string []args)
        {
                 Student stucollection=new Student();
                  stucollection[0]="柯南";
                  stucollection[1]="小五郎";
                  stucollection[5]="怪盗基德";
        }
     }


委托:相当于函数指针,可使程序在运行是再指定具体要运行的方法。
(1) 定义委托:Public delegate int Call()
(2) 实例化委托:Call objcall=new Call(方法名) //使用构造函数的方式
也可以这样初始化:
Public delegate void Call(); //多播委托必须是无返回值
if(objcall != null){
  objcall += 方法名; //不为空说明已经初始化完毕,所以添加,这里说明C#这里重载了+=运算符
}else{
  objcall = 方法名 //为空说明还未初始化,所以直接赋值,这里说明C#这里重载了=运算符
}

(3) 调用委托:objcall(); // 直接调用
objcall.BeginInvoke(。。,callBack,。。。) //异步调用,从线程池里拿个线程执行异步操作,执行完后进行回调函数,所以回调函数是在新线程里执行的,不是在主线程里执行的


事件:事件实际上是一种特殊的委托,委托每次只能指向一个方法,而事件可以指向多个方法
(1)定义一个委托public delegate void delegateMe();
(2)定义一个事件 private event delegate eventMe;
(3)订阅事件   eventMe+=new delegateMe(方法名1());
                      eventMe+=new delegateMe(方法名2());
(4) 引发事件   if(condition)  then  eventMe();



--------------------------------------------------------------------------------


多线程

创建线程实例:
Thread obj=new Thread(new ThreadStart(方法名称))
开始:Start();
休眠:Sleep();
终止:Abort();
挂起:Suspend();
恢复:Resume();
当前线程:Thread.CurrentThread
ThreadPriority枚举值用来指定调度线程的优先级(共5级)

lock关键字
C#中通过lock关键字提供同步
线程同步:确保不同的线程对共享资源进行访问时,每次只有一个线程访问资源。
Lock(this)
{
    For(int i=0;i<10;i++)
    {
         //语句;
    }
}

《C#网络编程(完整书签)》马骏,线程章节:
1.最好不要用Thread的Abort方法,如果要用,结合Join方法使用。
2.线程池-->减少线程的启动时间。
3.线程同步,Lock的对象一定为私有的,不锁定公有对象,否则会使Lock语句无法控制。
4.注意避免死锁问题。

--------------------------------------------------------------------------------

数组集合对象

Array: Array和数组很相似,还可以相互转化和拷贝,很多方法都是是通用,可以用Array的静态方法对数组实现反转,排序,这是数组本身无法做到的

using  system.Array;
Arrayar=Array.CreateInstance(typeof(int),5);  //创建一个Array的实例
ar.SetValue(12,0);                         //赋值

 Array.Reverse(ar);   // 反转
 Array.Sort(ar);       // 排序

ArrayList:最常用的集合之一.集合的好处是在不知道数据大小时,可以实现容量自动增长,而数组做不到.
Add()添加元素
Remove(位置)移除元素

ArrayList al=new ArrayList();
//如果要遍历集合元素,
   //方法一:
   //将集合中的数拷贝到数组中
   object[]temp=al.ToArray();
   foreach(object t intemp)
   {
   Console.WriteLine(t);
   }

   //方法二,使用迭代器
   IEnumeratorie=al.GetEnumerator();
   while(ie.MoveNext())
   {
   Console.WriteLine(ie.Current);
   }

HashTable:以键值对的形式保存值

Hashtable hash=new Hashtable(4);
 hash.Add("中国",1860);         
 hash.Add("德国",1940);

 Console.WriteLine(hash["中国"].ToString());通过key获得value


SortedList :是 Hashtable 和 Array 的混合
能存放键值对,类似Hashtable
能通过自身提供的方法通过索引直接遍历,类似于Array
objsortlist.GetKey(i)  方法获得键
objsortlist.GetByIndex(i)方法获得值

==========================================================
static修饰构造函数和类

Static类是不能实例化的, C#2.0以前为了不让一个类在外部实例化,通常都是创建一个private的构造函数,现在可以通过Static类来达到这样的目的. Static类通常用于那些只包括static 方法或属性的工具类, 这样的类没有必要进行实例化, 所以干脆用static修饰,表示不能实例化

 Static构造函数(Constructor)有如下特征:

1. 用于对静态字段、只读字段等的初始化.       
2. 添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。    
3. 类的静态构造函数在给定应用程序域中至多执行一次,只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
4. 静态构造函数是不可继承的,而且不能被直接调用。      
5. 如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。  任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。 
6. 如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
以下用例子代码进一步说明:
 

/**************************************************
* (1)①②③……为执行顺序
* (2)输出结果:
* static A()
* static B()
* X = 1, Y = 2
***************************************************/
using System;
class A
{
  public static int X;
  static A() //④ 执行完后返回到③
  {
    X = B.Y + 1;
    Console.WriteLine("static A()");
  }
}
class B
{
  public static int Y = A.X + 1; //③ 调用了A的静态成员,
  // 转到A的静态构造函数---->
  static B() //② 如果带有初始值设定项的静态字段,
  // 执行该类的静态构造函数时,
  // 先要按照文本顺序执行那些初始值设定项。
  // 转到初始值设定项---->
  {
    Console.WriteLine("static B()");
  }
  static void Main() //① 程序入口,
  // 如果类中包含用来开始执行的 Main 方法,
  // 该类的静态构造函数将在调用 Main 方法之前执行。
  // 转到B的静态构造函数---->
  {
    Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
    Console.ReadLine();
  }
}

==========================================================

c#中yield的用法详解
一. yield是c#2.0以后为了简化迭代器加入的一个新特性。 yield 关键字只允许出现在在迭代器块中,有两种用法:

  1. yield return 表达式;

  这是一个隐式转换的返回值,将计算 expression 并将结果以值的形式返回给枚举器对象。expression 必须可以隐式转换为 yield 类型的迭代器,且必须为IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。每次调用yield return“后会记录当前迭代器位置,下次迭代从该位置开始,直至迭代结束。

  2.yield break;

  yield 关键字与 break 结合使用,表示迭代结束。

  二. yield 语句只能出现在迭代器块中,该块可用作方法、运算符或访问器的主体。这类方法、运算符或访问器的体受以下约束的控制:

  1. 不允许不安全块。

  2. 方法、运算符或访问器的参数不能是 ref 或 out。

  3. yield 语句不能出现在匿名方法中。

  4. 当yield与expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中

==========================================================

IO:

MSDN .net4.5 文件和流 I/O
https://msdn.microsoft.com/zh-cn/library/k3352a4t%28v=vs.110%29.aspx

==========================================================


.NET ADO
Conection : 对数据源连接
Command :执行数据库命令,增删改查、过程、检索
DataReader :从数据源读数据,连接模式
DataSet :内存中的数据库,非连接模式
DataAdaper :把数据源装到DataSet中去
DataTable :数据实际存在DataTable中,DataSet存储DataTable

0 0
原创粉丝点击