c# 语法笔记 适用于从C++转过的,用于速查

来源:互联网 发布:c语言求和函数 编辑:程序博客网 时间:2024/05/29 07:13
 c# 语法笔记
适用于从C++转过的,用于速查

来自xsoap 肥皂的专栏

一 基本语法

1  定义字符串用@前缀,可以不用转移符
2  switch支持字符串
3 checked unchecked 可以溢出检查上下文
int    oneInt  = 10;
byte oneByte8 = checked((byte)oneInt);

默认是unchecked的
4 数组定义
const int arraySize = 5;
int [] myIntArray = new int[arraySize] {5,9,10,2,99}
多维数组 用逗号区分多维
double[,] hillHeight = new double [3,4];
double[,] hillHeight = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};

数组的数组 每个数组数目可不同,锯齿数组
int [][] jaggedIntArray;

每个数组是个对象,可以打.号调用调用函数
int [] intArray = new int[10];
int len = intArray.Length;

二 函数定义

1 参数数组 关键字 params
 能定义(只能)一个参数数组,并且在参数最后

可以传任意数目相同参数,变参
static int SumVals(params int[] vals)
{
     int sum = 0;
     foreach(int val in vals)
     {
          sum += val;
     }
     
     return sum;
}


static void Main(string[] args)
{
     int sum = SumVals(1,5,3,4);
     Console.WriteLine("Summed values = {0}",sum);
     Console.Readkey();
}

2 引用参数 用关键字ref 传值 
   static void ShowDouble(ref int val)
3 输出参数 用关键字out
   作用和ref一样,但有两个重要区别
    把未赋值的变量用作ref 参数是非法的,但可以把未赋值的变量用作out参数
    在函数中使用out参数时,out参数必须看作是还未赋值的

三 委托
    委托定义和C++ 函数指针定义一模一样。
    delegate double ProcessData(double p1,double p2);

四 调试
    向Output窗口打消息
    Debug.WriteLine() 仅Debug下
    Trace.WriteLine()  Release 也有
五 类
1  结构是值类型,对象是引用类型
struct myStruct{}
myStruct structA = new myStruct();
myStruct structB = structA;//是把值复制了

2 sealed 关键字 制定类不能继承,只能实例化
3 接口的定义用关键字interface 
4 定义的类默认最根部继承自 object ,不用显示写代码继承
5 比较类型 ,GetType 函数、  typeof 关键字
   if (myObj.GetType() == typeof(MyComplexClass))

6 构造函数 ,调用基类构造函数用 base 关键字,调用类本身其他构造函数用this

7 定义成员变量 
  访问级别  internal
  关键字 readonly = c++ 里的const 只能在构造函数的过程中赋值,或直接赋值
class MyClass
{
     public readonly int MyInt = 17;
}

  关键字 const  = c++ 里的 (static const) 默认是静态的
8 定义函数
   重写基基类主法要加关键字 override

9 定义属性

get set 可以单独控制访问权限
set 中用value关键字来标识传过来的值
class MyClass
{
     private int MyInt = 17;
     
     public int MyintProp
     {
          get
          {
               return myInt;
          }
          protected set
          {
               myInt = value
          } 
}

10 类函数覆盖
    如果父类是虚函数,子类同名函数用override ,如不是虚函数 用关键字 new
    

11 关键字 partial 部分类定义
类可以定义在多个文件中

public partial class MyClass : IMyInteface1
{}

public partial class MyClass : IMyinteface2
{}


public partial class MyClass : IMyInteface1,IMyinteface2
{}

是等价的

partial 也可部分方法定义,一部分定义,一部分实现

12 类成员变量可以直接赋值?

13 支持运算符重载 
     函数定义为static 
     public static AddClass1 Operator + (AddClass1 op1,AddClass1 op2);

六 浅复制和深复制
     简单地按照成员复制对象可以通过调用派生于System.Object 的 MemberwiseClone()方法来完成。
     该方法提供的复制功能称为浅度复制

      实现ICloneable接口 ,实现Clone()方法 实现深复制

七 集合类
1 定义的简单数组 都是System.Array 类型的,可以调用其 .GetLength等方法
int [] myIntArray = new int[arraySize] 

2 继承CollectionBase 可以实现一个自定义集合类
重载 索引符

public Animal this[int animalIndex]
{
     get
     {
          return (Animal)List(animalIndex);
     }
     set;
}

3 迭代器
     1) 如果要迭代一个类 ,重载方法GetEnumerator() 返回类型是IEnumerator
     public class Primes
     {
          public IEnumerator GetEnumerator();
     }

     Primes pm = new Primes();
     foreach(long i int pm) //可以对这个对象pm用foreach语法

     2) 如果要迭代一个类成员,例如一个方法,则使方法返回一个IEnumerable
     public static IEnumerable SimpleList()
     {
          yield return "string1";
          yield return "string2";
     }

     foreach(string item in SimpleList()); //注意这里的  in SimpleList() 语法,可以in一个函数调用

 在迭代器中,使用yield 关键字选择要在foreach循环中使用的值 。
 应该可以理解为,当执行到 yield return value;时,迭代函数中断执行,当foreach循环获取下一个元素时,迭代函数
从上次断点恢复执行
4 比较接口 
     类实现IComparable ,实现 CompareTo,可以在集合中用Sort比较 .
     IComparer 可以比较两个类,类似C++里的 (函数类)的用法
     Comparer是默认实现,可以比较基本类型或实现了IComparable的对象
八 boxing  unboxing
     把值类型的数据封装成 System.Object,用来例如:可以存储到ArrayList里
     MyStruct valTypel = new MyStruct();
     object refType = valTypel; //注意这里把valTypel复制了一份  ,也就是说refTypel指向的是另一个副本,也好理解
     不然局部变值变量,valTypel 超出作用域释放掉,refTypel也就无效了。
九 检查继承关系,是否可以类型转换使用 is 关键字 
     if(Chicken is Animal)

    as 关键字用于 类型转化检查 类似C++里的 dynamic_cast ,不能转换就返回空值 null
     Cow myCow = MyAnimal as Cow;
 
十 泛型
     1 可空类型,看的头晕  int?   ?? ,后面再补充这部分笔记吧
     2 支持模板 


     3 Dictionary<K,V> 定义字典map
        KeyValuePair<K,V> 创建键值对
     4 定义模板  类型 T  ,T可能是值类型(struct)或 引用类型,对T进行初始化时用default关键字,会自动赋值。
 T payload = default(T) ;
     5 使用where约束 T的类型 class MyClass<T1,T2> where T1: Animals where T2: xxx
     6 协变与抗变
        协变 泛型类 具有 模板参数的继承属性,可以类型向上转换  。用out 关键字
         需要 IEnumerable<Animal> 用 IEnumerable<Cow> 就可以代替
        抗变是继承属性的向下转换 用in 关键字
         需要 IComparer<Cow> 用 IComparer<Animal> 就可以代替
十一 C#的改进 (先简单看一下有什么东东,后续补上)
         1  类初始化器,集合初始化
         2  类型推理 匿名类型
         3  可选参数,类似Object-C的多参数
         4  扩展方法,和Object-C的 范畴 类似
         5  (o)=>{  o.},回调的内联方式










    

原创粉丝点击