c# 语法笔记 适用于从C++转过的,用于速查
2012-12-20 19:01
337 查看
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.},回调的内联方式
适用于从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.},回调的内联方式
相关文章推荐
- c# 语法笔记 适用于从C++转过的,用于速查
- c#基础语法速查手册(适用于菜鸟)
- C++语法笔记 – 数组 指针与字符串
- 【面经笔记】C++语法
- C#转学C++ MFC笔记一
- C++ 学习笔记 <1> C++ 语法基础知识
- 不能空着,发篇以前的C++学习笔记,不过现在在学C#
- C#语言不常用语法笔记
- 【学习笔记】C++传递字符串到C#
- c++学习笔记(部分语法及c++11新特性)
- C#基本语法学习笔记
- VS2013MFC对话框工程学习笔记九 - C++语法的的学习
- 学习笔记——c++自定义class用于unordered
- 孙鑫MFC笔记教程(2)--C++经典语法与应用
- 【跟我一起学Visual Studio 2005(1):C#语法篇(上)】笔记
- C++语法笔记(二)
- C++中实现C#属性相似的语法
- (C/C++ 学习笔记)函数指针语法基础
- C#与C++混合编程---C++/CX语法
- C#笔记(2)---基本语法 [流程控制语句]