引用类型
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。其实引用类型就是c++中的别名。
对象类型(Object):对象(Object)类型 是
C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object是
System.Object类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
object obj;
obj = 100; // 这是装箱
int a =(int) obj;//这是拆箱
动态(Dynamic)类型:您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:
dynamic <variable_name> = value;
例如:
dynamic d = 20;
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
字符串(String)类型:允许您给变量分配任何字符串值。字符串(String)类型是
System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和
@引号。
例如:
String str = "runoob.com";
一个 @引号字符串:
@"runoob.com";
C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符()当作普通字符对待,比如:
string str = @"C:Windows";
等价于:
string str = "C:\Windows";
@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
string str = @"<script type=""text/javascript"">
<!--
-->
</script>";
用户自定义引用类型有:class、interface或 delegate。我们将在以后的章节中讨论这些类型。
3):指针类型
指针类型变量存储另一种类型的内存地址。C#中的指针与 C
或 C++
中的指针有相同的功能。
声明指针类型的语法:
type* identifier;
例如:
char* cptr;
int* iptr;
(2)c#类型转换
类型转换方法:
ToBoolean如果可能的话,把类型转换为布尔型。
ToByte把类型转换为字节类型。
ToChar如果可能的话,把类型转换为单个 Unicode字符类型。
ToDateTime把类型(整数或字符串类型)转换为日期-时间结构。
ToDecimal把浮点型或整数类型转换为十进制类型。
ToDouble把类型转换为双精度浮点型。
ToInt16把类型转换为 16 位整数类型。
ToInt32把类型转换为 32 位整数类型。
ToInt64把类型转换为 64 位整数类型。
ToSbyte把类型转换为有符号字节类型。
ToSingle把类型转换为小浮点数类型。
ToString把类型转换为字符串类型。
ToType把类型转换为指定类型。
ToUInt16把类型转换为 16 位无符号整数类型。
ToUInt32把类型转换为 32 位无符号整数类型。
ToUInt64把类型转换为 64 位无符号整数类型。
eg:
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
usingSystem.Threading.Tasks;
namespace One
{
classProgram
{
staticvoid Main(string[] args)
{
int i = 1;
Console.WriteLine(i.ToString());//显示转换
int num;
//函数 Convert.ToInt32() 把用户输入的数据转换为 int 数据类型,因为 Console.ReadLine() 只接受字符串格式的数据。
num = Convert.ToInt32(Console.ReadLine());//等价于:int.Parse(Console.ReadLine());
long b = i;//隐式转换
Console.WriteLine(b);
Console.WriteLine("你输入的值为(显示转换):{0},隐式转换:{1}", num,b);
//Console.WriteLine("hello{0}!","world");
//Console.WriteLine("int{0},decimal {1}",sizeof(int),sizeof(decimal));
Console.ReadKey();
}
}
}
(3)c#运算符
Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;
运算符
(4)判断循环
1)判断:
值得一提的是?:运算符。条件运算符 ? :,可以用来替代 if...else 语句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。
2)循环:
在循环的时候,也有while循环,for/foreach循环,do…while循环,嵌套循环,循环控制语句:break;continue语句;
(5)c#可空类型(Nullable)
早循环C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。
例如,Nullable<Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值。类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null。
在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义。
声明一个 nullable 类型(可空类型)的语法如下:
< data_type> ? <variable_name>= null;
Null合并运算:
Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 Null。Null 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。
如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。下面的实例演示了这点:
eg:
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34;
Console.WriteLine("num3 的值: {0}", num3);
num3 = num2 ?? 5.34;
Console.WriteLine("num3 的值: {0}", num3);
Console.ReadLine();
3,数组(Array)
数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。在声明数组(datatype[] arrayName),初始化,数组,赋值和遍历操作都是和java差不多的。
(1)多维数组
在定义和使用多维数组的时候,和其他语言有点不同在此,展示下c#的定义,访问方式。
eg:
//定义一个string的二维数组
string [,] names =new string[2,3] {
{1,2,3},
{4,5,6}
};
//访问第二行的第三个数据
Console.WriteLine(names[1,2]);//6
//定义一个Int的三维数组
int [,,] m;
(2)交错数组
交错数组就是数组的数组。在此申明一下他和多维数组的区别个人理解,在进行多维数组的定义的时候,举例说明吧,二维数组,二行三列(int a [,] = new int[2,3];)如果定义定义二维的交错数组,int [][] a = new int [5][]; a[0]=new int [3];a[1]=new int[5];看出来区别了吧,在定义二维数组的时候,他的行一定,而且列也是固定的,但是使用交错数组就不一样了,行一定,但是列是可变的。
其在定义的方式也有所不同,用的时候,注意下。
(3)传递数组给函数
通过指定不带索引的数组名来给函数传递一个指向数组的指针。
eg:
using System;
namespace ArrayApplication
{
class MyArray
{
double getAverage(int[] arr, int size)
{
int i;
double avg;
int sum = 0;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
avg = (double)sum / size;
return avg;
}
static void Main(string[] args)
{
MyArray app = new MyArray();
/* 一个带有 5 个元素的 int 数组 */
int [] balance = new int[]{1000, 2, 3, 17, 50};
double avg;
/* 传递数组的指针作为参数 */
avg = app.getAverage(balance, 5 ) ;
/* 输出返回值 */
Console.WriteLine( "平均值是: {0} ", avg );
Console.ReadKey();
}
}
}
(4)参数数组
用于传递未知数量的参数给函数。有时,当声明一个方法时,您不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。在这里c#提供了arams 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以只传递一组数组。params 的使用格式为:
public 返回类型方法名称( params 类型名称[] 数组名称 )
eg:
using System;
namespace ArrayApplication
{
class ParamArray
{
public int AddElements(params int[] arr)
{
int sum = 0;
foreach (int i in arr)
{
sum += i;
}
return sum;
}
}
class TestClass
{
static void Main(string[] args)
{
ParamArray app = new ParamArray();
int sum = app.AddElements(512, 720, 250, 567, 889);
Console.WriteLine("总和是: {0}", sum);
Console.ReadKey();
}
}
}
(5)Array类
Array 类是 C#中所有数组的基类,它是在 System命名空间中定义。Array类提供了各种用于数组的属性和方法。
方法
eg:
// 逆转数组
Array.Reverse(temp);
Console.Write("逆转数组: ");
// 排序数组
Array.Sort(list);
4,c#结构
结构可带有方法、字段、索引、属性、运算符方法和事件。 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。 与类不同,结构不能继承其他的结构或类。 结构不能作为其他结构或类的基础结构。 结构可实现一个或多个接口。 结构成员不能指定为 abstract、virtual 或 protected。
当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
eg:
using System;
struct Books
{
private string title;
private string author;
public void getValues(string t, string a)
{
title = t;
author = a;
}
public void display()
{
Console.WriteLine("Title : {0}", title);
Console.WriteLine("Author : {0}", author);
}
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1 = new Books(); /* 声明 Book1,类型为 Book */
Books Book2 = new Books(); /* 声明 Book2,类型为 Book */
/* book 1 详述 */
Book1.getValues("C Programming", "Nuha Ali");
/* book 2 详述 */
Book2.getValues("Telecom Billing","Zara Ali");
/* 打印 Book1 信息 */
Book1.display();
/* 打印 Book2 信息 */
Book2.display();
Console.ReadKey();
}
}
5,c#枚举
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。C# 枚举是值数据类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
声明 enum 变量
声明枚举的一般语法:
enum <enum_name>
{
enumeration list
};
其中,
enum_name 指定枚举的类型名称。 enumeration list 是一个用逗号分隔的标识符列表。eg:
using System;
namespace EnumApplication
{
class EnumProgram
{
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
static void Main(string[] args)
{
int WeekdayStart = (int)Days.Mon;
int WeekdayEnd = (int)Days.Fri;
Console.WriteLine("Monday: {0}", WeekdayStart);
Console.WriteLine("Friday: {0}", WeekdayEnd);
Console.ReadKey();
}
}
}