首先讲解一下c#
这里只是粗略的讲解
详细内容请购买相关书籍
或参阅相关文档
c#已经取消了c++中的指针
并且在c++中大量被使用的操作符 (::
>)已经不在出现
c#中指支持一个
c#具有面向对象编程语言的所有特性
如封装
继承
多态等
而且比java更面向对象
每种类型都可以看作一个对象
但c#指允许单继承
即一个类不会有多个基类
另外
c#没有了全局函数
没有了全局变量
也没有了全局常量
一切都必须封装在一个类中
下面举一个控制台应用程序的小例子
using System;
class MikeCat
{
public static void Main()
{
ConsoleWriteLine(迈克老猫c# 入门系列教程--欢迎访问老猫的理想);
}
}
在c#中程序总是从Main()方法开始Main()方法必须且只能包含在一个类中Main()方法返回的类型可以是void(无返回值)或int(返回代表应用程序错误级别的整数)
上面的using System;用于导入名字空间(Namespace)用来表明类的层次关系如果不用using导入名字空间则每次用某一个类时就得在类名前面加上名字空间
c#程序的输入输出通过Console来实现Console是System名字空间下的一个类在屏幕上输出一个字符串用ConsoleWriteLine()接受输入设备的输入用ConsoleReadLine()方法
程序代码
class MikeCat
{
public static void Main()
{
SystemConsoleWriteLine(迈克老猫c# 入门系列教程--欢迎访问老猫的理想\n);
SystemConsoleWriteLine(请输入用户名);
string user=SystemConsoleReadLine();
SystemConsoleWriteLine(欢迎你{}的光临!user);
}
}
WriteLine()方法的参数表中紧随串后的第一个参数将替换{}
如果执行程序时要传递命令行参数给应用程序则Main()方法的格式应为
using System;
public class MikeCat
{
public static void Main(string[] args)
{
ConsoleWriteLine(共有{}个命令行参数argsLength);
for(int i=;i{
ConsoleWriteLine(Arg[{}]=[{}]iargs[i]);
}
}
}
c#中的单行注释用//多行注释用/**/
c#中使用常量
using System
class MikeCat
{
public const double PI=;
public static void Main()
{
ConsoleWriteLine(圆周率PI的值为{}PI);
}
}
结构体类型(struct)是一种复合数据类型用于将某些相关的数据组织到一个新的数据类型中
using System;
struct MikeCat
{
public string Mike;//user
public uint Age;//age
public string Email;//email
}
class mf
{
public static void Main()
{
MikeCat zl;//声明结构体类型变量zl
zlName=迈克老猫;
zlAge=;
zlEmail=;
ConsoleWriteLine(姓名{}年龄{}邮箱{}zlNamezlAgezlEmail);
}
}
c#中枚举类型(enum)是一组逻辑上密不可分的整数值
c#中枚举类型中的每个元素类型均为int byte long short型
且第一个元素值为
其后面的按
递增
在枚举中也可以直接给元素赋值
后面的递增
enum WeekDay:byte
{
Sunday=MondayTuesdayWednesdayThursdayFridaySaturday
继续上回数组是我们经常用到的我来介绍一下数组是具有相同类型的一组数据当访问数组中的数据时可以通过下标来指明c#中数组元素可以为任何数据类型数组下标从开始即第一个元素对应的下标为以后逐个递增数组可以一维也可多维
//包含个元素的一维整数数组;
int[] mf=new int[]; //注意初始化数组的范围或者指定初值;
//包含个元素的一维整数数组初值
int[] mf=new int[]{};
//一维字符串数组如果提供了初始值设定项则还可以省略 new 运算符
string[] mf={cc++c#};
//一维对象数组
Object[] mf = new Object[] { };
//二维整数数组初值mf[]=mf[]=mf[]=mf[]=
int[] mf=new int[]{{}{}};
//*的二维整型数组
int[] mf=new mf[];
下面来看一个一维字符串数组的遍历
using System;
public class MikeCat
{
static void PrintArray(string[] arr)
{
//打印数组元素arrLength 表示数组元素的个数
for(int i=;i {
ConsoleWriteLine(arr[{}]={}iarr[i]);
}
}
public static void Main()
{
string[] arr={cc++c#};
//将数组作为一个参数传递
PrintArray(arr);
}
}
程序结果arr[]=c arr[]=c++ arr[]=c#
下面来看一个行列(*)的整型数组的遍历
using System;
public class MikeCat
{
static void PrintArray(int[] arr)
{
//通过两次FOR循环遍历二维数组
for(int i=;i<;i++)//初始化i作为循环变量i++实现该变量的自增运算
//for循环满足条件后执行完循环体一次后执行i++然后进入下次循环简单的c语法这里做简单介绍照顾初学者(详细可参阅谭浩强先生的c语言程序设计一书)
{
for(int j=;j<;j++)
{
ConsoleWriteLine(arr[{}{}]={}ijarr[ij]);//打印每个二维数组元素
}
}
}
public static void Main()
{
//主函数
//将数组作为一个参数传递
PrintArray(new int[]{{}{}{}{}};
}
}
运行结果arr[]= arr[]= arr[]= arr[]= arr[]= arr[]= arr[]= arr[]=
类是面向对象程序设计的基本构造块详细我们在后面介绍这里我们介绍两个特殊的类即object类和string类
object类
object类是预定义类SystemObject的别名它是所有其他类型的基类c#中所有类型都直接或间接从object类中继承因此一个object类的变量可以赋予任何类型的值
int i=;
object obj;
obj=i;
object obj=a;
string类
string类专门用于对字符串的操作他是预定义类SystemString的别名
string str=mikecat;
可以用+号连接两个字符串
string str=username:+mikecat;
如果访问单个字符则要用下标
char c=str[];
比较两个字符串是否相等可用比较操作符==//有别于basic语法
bool b=(str==str);
c# 中取消了c和c++中使用最灵活也是最难掌握的指针那么在c#中如何提供c/c++中的函数指针的功能?c#提供了委托(delegate)委托是继承自SystemDelegate类的引用类型它相当于函数指针原型与函数指针不同的是委托在c#中是类型安全的委托特别适合于匿名调用要使用委托需经过三个步骤即声明实例化调用
using System;
//声明一个名为mfDelegate的委托该委托有一个string类型的参数
//c#编译器编译时会产生一个新类该类继承自SystemDelegate类
//名为mfDelegate
public delegate void mfDelegate(string name);
public class MikeCat
{
//定义与mfDelegate有相同参数类型的方法Hello()
public static void Hello(string name)
{
ConsoleWriteLine(您好{}!name);
}
//定义与mfDelegate有相同参数类型的方法GoodBye()
public static void GoodBye(string name)
{
ConsoleWriteLine(再见{}!name);
}
public static void Main()
{
//创建一个mfDelegate实例 mf
mfDelegate mf=new mfDelegate(Hello);
//调用mf
mf(mikecat);
mfDelegate mf=new mfDelegate(GoodBye);
mf(mikecat);
//将mf mf组合成一个新的委托mf
mfDelegate mf=mf+mf;
//调用mf
mf(迈克老猫);
//从组合的委托mf中删除mf
mfDelegate mf=mfmf;
mf(mikecat);
}
}
这次我们首先讲解一下类型转换我们在写程序时经常用到类型转换而且特别多的规则我在这里粗略的讲解一下
隐式转换是系统默认的不需要加以声明即可进行的转换
隐式数值转换
隐式数值转换实际上就是从低精度的数值类型转换到高精度的数值类型的转换
byte x=;ushort y=x;y=;float z=y;//均从低精度到高精度反之会产生溢出
隐式数值转换的类型太多我就不多介绍记住上面的原则就可以了详细规则可查看msdn
隐式枚举转换
隐式枚举转换用于把十进制整数转换成任何枚举类型对应的其他整数则不存在这种转换
using System;
enum Color
{
RedGreenBlue
};
class MikeCat
{
static void Main()
{
Color c;//声明Color的变量c;
c=;//将转换为Red;
ConsoleWriteLine(c的值是{}c);//结果c的值是Red;如果将c=改成c=则编译器会给出错误
}
}
隐式引用转换
从任何引用类型到object的转换
从类类型A到类类型B的转换其中类A从类B派生得到
从类类型A到接口类型B的转换其中类A实现了接口B
从接口类型A到接口类型B的转换其中接口A是从接口B派生
从任何数组类型到SystemArray的转换
从任何委托类型到SystemDelegate的转换
从任何数组类型或委托类型到SystemICloneable的转换
从空类型(null)到任何引用类型的转换
显示转换也称为强制转换它需要用户明确地指定转换的类型
char c=(char);//A
int i=(int)