.Net Framework架构如下
VB, VC, C#, Java, JScript...
公共语言规范(common Language Specification)
ASP.net | widons Forms
ADO.Net and XML
基类库(Base Class Library)
公共语言运行时(CLR)
windows COM+ Services
简单地例子---新建空白解决方案,新建C# 控制台
using System; //引用名字空间
//using System.Text;
//using a = System.Threading; //这样可以在下面使用a.什么的类库函数
namespace ConsoleApplication1 // 同一个name下面类名字不可以相同
{
/// <summary>
/// Class1 的摘要说明。 // C# 中的 特有的注释'///'
/// </summary> "///" 的注释,里面很多的tag ,这样可以自动生成说明文档
/// <paramref name="args">test Name</paramref>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args) // 注意这儿的Main 是大写的M, 返回值必须是void的或者int 类型
{
//
// TODO: 在此处添加代码以启动应用程序
//
Console.WriteLine("Hello, Welcome");
Console.ReadLine();
}
}
}
output : Hello, Welcom
看他的生成代码过程
首先把cs文件生成了IL中间语言,所以,vb和c# 的都可以互相调用
在实际运行过程中, CLR有一个编译器叫做JIT,会实时的把IL语言编译成二进制代码,所以运行的时候是边编译边运行,所以第一次可能有点慢
最后在文件夹中的bin/Debug文件夹中找到生成的.exe文件
第一个程序结束
---------------
数据类型:
值类型,运行速度快,效率高
引用类型,都放到堆中,由CLR控制
值类型:
整数类型:
sbyte 有符号的8位整数 -128 ~ 127
byte 无符号 8 0~25
short 有符号16位
ushort 无符号16位
int 有符号32位
unit 无符号32位
long 有符号64位
ulong 无符号64位
布尔类型,和java相同
实数类型:float 精度7位, double 精度为15 到 18位, decimal精度为128位
写的时候 float a = 1.4f;
double a = 1.5;
decimal a = 1.5m;
字符类型
长度为16位, char c = 'a';
char c='/x0032';
/n /r /t /v /a /b
长度为16位
结构类型: 属于值类型,和class不同
Stuct PhoneBook{
public string name;
public uint age;
public struct address"
public string city;
public unit no;
}
}
//用法和Class相同,好处是取得时候很容易,并且可以进行结构的嵌套
//如果简单的话,用它比较快,复杂的话用Class类
枚举类型:
定义的时候是,
enum Week:long // 定义类型,缺省为int
{
Sunday;
Monday; // 缺省值为0
Tuesday = 4;
}
结构是由不同类型的数据组成的一组新的数据类型
枚举类型的变量在某一是看只能够取其中的一个元素的值,例如Week.Sunday;
引用类型:...
类:
object 类;// C# 和java一样,都是单继承,可以继承多个接口,所有的类都默认继承Object
String ToString();
int GetHashTable()
bool Equals()
bool ReferenceEquals()
Type GetType()
object MemberwiseClone()
woid Finalize()
//以上的是object中的方法
String类
看一个例子,如果有 String a = "ab" + "c"; 那么在这个里面有3块内存空间使用,这样使用效率不高
而这个时候,C#中可以使用StringBuider
那么相应的代码改写为 StringBuider a = new StringBuider...;
a.Append("ab");
a.Append("c");
这儿和java中的StringBuffer是相同的。
代表delegate
代表是包含方法引用的类,具有签名特征,只能包含与签名特征一致的方法的引用,没有成员和方法
定义方法:public delegate void TestDelegate (String k);
public void Test (String
TestDelegate aDelegate = new TestDelegate(d.Test);
aDeleget("Test");
数组:
一维数组 int[] a = new int[]{1, 2, 3};
如果不赋值的话,int[] a = new int[3];
二维数组 int[,] a = new int[,]{{1, 2, 3}, {4, 5, 6}}
锯齿数组 int[][] a = new int[3][];//可能比相同的二维数组的执行效率高
a[0] = new int[]{1, 2, 3}
a[1] = new int[]{1, 2, 3, 4}
a[2] = new int[]{1, 2, 3, 4, 5, 6}
boxing and unboxing
任何值类型和引用类型之间进行转换
对任何类型的值来说都可以看作是Object类型
例如:
Object a;
Object b = a;//隐式
或者Object b = (Object)a;//显式,这儿是装箱
unboxing是不同类型的转换
下面的语句是错误的,String a = 15;
而这样写就是正确的,String a = 15 ToString();
变量:
命名规则->以字母开头,由字母,数字和下划线组成,不能与关键字重名(但是可以使用@关键字,例如@using),变量类型为static, instance(随着类的实例结束而结束), array, value, param, reference param, outpu param, local variable
常量:
声明如下:
modifiers (const) type declaractors
modifiers: new, public, protected, internal, private
隐式类型的转换
从第精度的数值类型到高精度的数值类型转换
整形值不能自动转为char类型
隐式枚举转换允许0转换成任何枚举类型,其他整数不可以的
隐式引用转换
从任何引用类型到对象类型
子类到父类
继承类到接口
子接口道父接口
任何数组到System.Array
任何代表类型到System。Delegate。
任何数组或代表到System.ICloneable
从null到任何引用类型
显示类型转换(数值转换,枚举转换,引用转换)
显式枚举转换
从数值类型到枚举类型
从枚举类型到数值类型
从任何枚举类型到任何枚举类型
显示引用转换
从对象到任何引用类型
从基类到子类
类到接口,并且类没有实现接口
接口到接口,并且没有继承关系
System.Array到数组。
System.Delegate到代表类型
System.ICloneable到数组或代表类型
操作符:
在除法运算中,默认的返回值类型与精度最高的操作数类型相同。
两个整数类型的变量相除不能整除,返回不大于相除之值得最大整数。
is:用于动态的检查运行时对象类型是否和给定的类型兼容。
例如,1.0 is float 返回false
as:将一个值显式转换成指定的引用类型。如果失败,as不会产生异常,结果值为null。
例如:String a = (String) 5; // 可能出现异常
String a = 5 as String; // 不会产生异常,最多就是返回null
String a = '5' as String -> a = null
typeof
获得类型,例如,typeof(int)
checked,unchecked
class Test
{
int x = 1000000;
int y = 1000000;
int F()
{
return checked( x * y ); //编译错误,抛出异常,超出了int范围,抛出异常
}
int G()
{
return unchecked( x * y ); //返回值为 -727379968 (自动截掉不符合的那些高位)
}
int H()
{
return x * y; //依赖于编译的默认情况
}
}
class Test
{
const int x = 1000000;
const int y = 1000000;
int F()
{
return checked( x * y ); //编译错误
}
int G()
{
return unchecked( x * y ); //返回 -727379968
}
int H()
{
return x* y; //编译错误,对于常量,和加上checked效果相同
}
}
流程控制
if…else…
switch( expression) // case中和java不同的就是,它也可以比较字符串
{
case xx:
break; // 当然也可以使用goto, return等跳转出去的语句
default: // 必须加上,即使为空
break;
}
while
do…while
for
foreach // 对一个集合进行遍历的
例如,
int[] a=new int[5]{1,2,3,4,5};
foreach( int I in a )
{
Console.WriteLine(“{0}”, I );
}
下面的例子
int[] a=new int[5]{1,2,3,4,5};
int b=0;
foreach( int I in a )
{
b++;
Console.WriteLine("{0}, {1}, {2}", I, b, b+I);
}
他的输出结果就是
1, 1, 2
2, 2, 4
3, 3, 6
4, 4, 8
5, 5, 10
异常处理---这儿和java的查不多的
throw
try-catch
try-finally
try-catch-finally
-------------------------------------------------------------------------------
类
格式为:
modifier Class identifier Class-base
public
protected
internal(本工程内部的)
private
abstract
sealed
--------------
继承
如果继承接口的话,那么后面用":" 后面接的是i开头的接口,当然可以继承多个接口的
className:superClassName, interfaceName1, interfaceName2...
public class Class2
{
public Class2()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Class2(String s)
{
}
}
public class Class3 : Class2
{
public Class3() : base("asp")
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}