C#学习笔记_2

从大的方面来分,C#语言的数据类型可以分为三种:值类型,引用类型,指针类型,指针类型仅用于非安全代码中。本节重点讨论引用类型。 

1.引用类型分类

C#语言中引用类型可以分为以下几种:

􀁺 类:C#语言中预定义了一些类:对象类(object 类)、数组类、字符串类等。当然,程序员可以定义其它类。

􀁺 接口。

􀁺 代表。 C#语言引用类型变量无论如何定义,总是引用类型变量,不会变为值类型变量。C#语言引用类型对象一般用运算符new 建立,用引用类型变量引用该对象。下节仅介绍对象类型(object 类型)、字符串类型、数组。

2. 对象类(object类)
C#中的所有类型(包括数值类型)都直接或间接地以object类为基类。对象类(object类)是所有其它类的基类。任何一个类定义,如果不指定基类,默认object为基类。继承和基类的概念见以后章节。C#语言规定,基类的引用变量可以引用派生类的对象(注意,派生类的引用变量不可以引用基类的对象),因此,对一个object的变量可以赋予任何类型的值:
int x =25;
object obj1;
obj1=x;
object obj2= 'A';

object 关键字是在命名空间System 中定义的,是类System.Object 的别名。

3.数组类

在进行批量处理数据的时候,要用到数组。数组是一组类型相同的有序数据。数组按照数组名、数据元素的类型和维数来进行描述。C#语言中数组是类System.Array类对象,比如声明一个整型数数组:int[] arr=new int[5];实际上生成了一个数组类对象,arr是这个对象的引用(地址)。在C#中数组可以是一维的也可以是多维的,同样也支持数组的数组,即数组的元素还是数组。一维数组最为普遍,用的也最多。我们先看一个一维数组的例子:

using System;
class Test
{ static void Main()
{ int[] arr=new int[3];  //用new运算符建立一个3个元素的一维数组
for(int i=0;i<arr.Length;i++)  //arr.Length是数组类变量,表示数组元素个数
arr[i]=i*i;  //数组元素赋初值,arr[i]表示第i个元素的值
for (int i=0;i<arr.Length;i++)  //数组第一个元素的下标为0
Console.WriteLine("arr[{0}]={1}",i,arr[i]);
}
}

这个程序创建了一个int类型3个元素的一维数组,初始化后逐项输出。其中arr.Length表示数组元素的个数。注意数组定义不能写为C语言格式:int arr[]。程序的输出为:
arr[0] = 0
arr[1] = 1
arr[2] = 4
上面的例子中使用的是一维数组,下面介绍多维数组:
string[] a1;//一维string数组类引用变量a1
string[,] a2;//二维string数组类引用变量a2
a2=new string[2,3];
a2[1,2]="abc";
string[,,] a3;//三维string数组类引用变量a3
string[][] j2;//数组的数组,即数组的元素还是数组
string[][][][] j3;
在数组声明的时候,可以对数组元素进行赋值。看下面的例子:
int[] a1=new int[]{1,2,3};//一维数组,有3个元素。
int[] a2=new int[3]{1,2,3};//此格式也正确
int[] a3={1,2,3};//相当于int[] a3=new int[]{1,2,3};
int[,] a4=new int[,]{{1,2,3},{4,5,6}};//二维数组,a4[1,1]=5
int[][] j2=new int[3][];//定义数组j2,有三个元素,每个元素都是一个数组
j2[0]=new int[]{1,2,3};//定义第一个元素,是一个数组
j2[1]=new int[]{1, 2, 3, 4, 5, 6};//每个元素的数组可以不等长
j2[2]=new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};

 

4.字符串类String

 C#还定义了一个基本的类string,专门用于对字符串的操作。这个类也是在名字空间System 中定义的,是类System.String 的别名。字符串应用非常广泛,在string 类的定义中封装了许多方法,下面的一些语句展示了string 类的一些典型用法:
􀁺 字符串定义
string s;//定义一个字符串引用类型变量s
s="Zhang";//字符串引用类型变量s 指向字符串"Zhang"
string FirstName="Ming";
string LastName="Zhang";
string Name=FirstName+" "+LastName;//运算符+已被重载
string SameName=Name;
char[] s2={'计','算','机','科','学'};
string s3=new String(s2);
􀁺 字符串搜索
string s="ABC科学";
int i=s.IndexOf("科");
搜索"科"在字符串中的位置,因第一个字符索引为0,所以"A"索引为0,"科"索引为3,因此这里i=3,如没有此字符串i=-1。注意C#中,ASCII和汉字都用2字节表示。
􀁺 字符串比较函数
string s1="abc";
string s2="abc";
int n=string.Compare(s1,s2);//n=0
n=0表示两个字符串相同,n小于零,s1<s2,n大于零,s1>s2。此方法区分大小写。也
可用如下办法比较字符串:
string s1="abc";
string s="abc";
string s2="不相同";
if(s==s1)//还可用!=。虽然String是引用类型,但这里比较两个字符串的值
s2="相同";
􀁺 判断是否为空字符串
string s="";
string s1="不空";
if(s.Length==0)
s1="空";
􀁺 得到子字符串或字符
string s="取子字符串";
string sb=s.Substring(2,2);//从索引为2开始取2个字符,Sb="字符",s内容不变
char sb1=s[0];//sb1='取'
Console.WriteLine(sb1);//显示:取
􀁺 字符串删除函数
string s="取子字符串";
string sb=s.Remove(0,2);//从索引为0开始删除2个字符,Sb="字符串",s内容不变

􀁺 插入字符串
string s="计算机科学";
string s1=s.Insert(3,"软件");//s1="计算机软件科学",s内容不变
􀁺 字符串替换函数
string s="计算机科学";
string s1=s.Replace("计算机","软件");//s1="软件科学",s内容不变
􀁺 把String 转换为字符数组
string S="计算机科学";
char[] s2=S.ToCharArray(0,S.Length);//属性Length为字符类对象的长度
􀁺 其它数据类型转换为字符串
int i=9;
string s8=i.ToString();//s8="9"
float n=1.9f;
string s9=n.ToString();//s8="1.9"
其它数据类型都可用此方法转换为字符类对象
􀁺 大小写转换
string s="AaBbCc";
string s1=s.ToLower();//把字符转换为小写,s 内容不变
string s2=s.ToUpper();//把字符转换为大写,s 内容不变
􀁺 删除所有的空格
string s="A bc ";
s.Trim();//删除所有的空格
string 类其它方法的使用请用帮助系统查看,方法是打开Visual Studio.Net 的代码编
辑器,键入string,将光标移到键入的字符串string 上,然后按F1 键。

5.类型转换

在编写C#语言程序中,经常会碰到类型转换问题。例如整型数和浮点数相加,C#会进行隐式转换。详细记住那些类型数据可以转换为其它类型数据,是不可能的,也是不必要的。程序员应记住类型转换的一些基本原则,编译器在转换发生问题时,会给出提示。C#语言中类型转换分为:隐式转换、显示转换、加框(boxing)和消框(unboxing)等三种。
一.隐式转换
隐式转换就是系统默认的、不需要加以声明就可以进行的转换。例如从int类型转换到
long类型就是一种隐式转换。在隐式转换过程中,转换一般不会失败,转换过程中也不会导
致信息丢失。例如:
int i=10;
long l=i;

如在string、int、bool之间进行转换,在C#中,每一个类都有一个 void ToString() 方法,所以转换成string就很简单。但从字符串转成其它类型呢?C#提供了Convert和类型.Parse两个函数据进行之间的转换。
如:
string s = "12345";
int a = (int)s;  //不能这样转换的
以上无法运行。只能这样:
string s = "12345";
int a = int.Parse(s);
int b = Convert.ToInt16(s);
那么,类型.Parse与Convert有什么区别呢?他们的区别在于Parse的参数只能是字符串类型(string),只能把字符串类型转成其它类型,而Convert可以某一对象的值转换成很多类型。
如:
bool Bl =  = true;
int a = Convert.ToInt16(Bl); //只能这样转换,否则通不过。
二.显示转换
显式类型转换,又叫强制类型转换。与隐式转换正好相反,显式转换需要明确地指定转换类型,显示转换可能导致信息丢失。下面的例子把长整形变量显式转换为整型:
long l=5000;
int i=(int)l;//如果超过int取值范围,将产生异常
三.加框(boxing)和消框(unboxing)
加框(boxing)和消框(unboxing)是C#语言类型系统提出的核心概念,加框是值类型转换为object(对象)类型,消框是object(对象)类型转换为值类型。有了加框和消框的概念,对任何类型的变量来说最终我们都可以看作是object类型。

A.加框操作
把一个值类型变量加框也就是创建一个object对象,并将这个值类型变量的值复制给这个object对象。例如:
int i=10;
object obj=i;//隐式加框操作,obj为创建的object对象的引用。
我们也可以用显式的方法来进行加框操作,例如:
int i =10;
object obj=object(i);//显式加框操作
值类型的值加框后,值类型变量的值不变,仅将这个值类型变量的值复制给这个object对象。我们看一下下面的程序:
using System
class Test
{ public static void Main()
{ int n=200;
object o=n;
o=201;//不能改变n
Console.WriteLine("{0},{1}",n,o);
}
}
输出结果为:200,201。这就证明了值类型变量n和object类对象o都独立存在着。
B. 消框操作
和加框操作正好相反,消框操作是指将一个对象类型显式地转换成一个值类型。消框的过程分为两步:首先检查这个object对象,看它是否为给定的值类型的加框值,如是,把这个对象的值拷贝给值类型的变量。我们举个例子来看看一个对象消框的过程:
int i=10;
object obj=i;
int j=(int)obj;//消框操作
可以看出消框过程正好是加框过程的逆过程,必须注意加框操作和消框操作必须遵循类型兼容的原则。
3. 加框和消框的使用
定义如下函数:
void Display(Object o)//注意,o为Object类型
{ int x=(int)o;//消框
System.Console.WriteLine("{0},{1}",x,o);
}
调用此函数:int y=20;Display(y);在此利用了加框概念,虚参被实参替换:Object o=y,
也就是说,函数的参数是Object类型,可以将任意类型实参传递给函数。

posted @ 2016-07-07 12:37  遇见美好  阅读(255)  评论(0编辑  收藏  举报