一、数据类型
值类型:int char float bool byte double long short uint ulong ushort decimal(128位精确的十进制值)
引用类型:不包含存储在变量中的实际数据 但它们包含对变量的引用 指向的是一个内存位 内置的引用类型:object dynamic string
* object对象类型是C#通用类型系统中所有数据类型的终极基类 可以被分配任何其他类型的值 比如值类型 引用类型 用户自定义类型
* 当一值转为对象类型时 被称为装箱 当一个对象类型转为值类型时 被称为拆箱
* object obj obj = 100
* dynamic类型 可以存储任何类型的值在动态数据类型变量中 这些变量的类型是在运行时发生的
* dynamic <variable_name> = value
* string 允许给变量分配任何字符串值 字符串类型是System.String类的别名 它是从对象类型派生的
* string类型的值可以通过两种形式进行分配 引号和@引号
* String str = "zhangyin@kingsoft.com"
* @"zhangyin@kingsoft.com"
用户自定义类型 class interface delegate
指针类型:指针类型变量存储另一种类型的内存地址 其指针功能与C或者C++一样
二、类型转换
* 隐式转换:以安全的方式进行的转换不会导致数据丢失 从小的整数转为大的整数型
* 显式转换:强制类型转换 会造成数据丢失
* C#提供了内置的类型转换方法
* ToBoolean ToByte ToChar ToDateTime ToDecimal ToDouble ToInt16 ToInt32 ToInt64 ToString ToType
三、变量
* lvalue:表达式可以出现在赋值语句的左边或者右边
* rvalue:表达式可以出现在赋值语句的右边 不可以出现在赋值语句的左边
* 变量是lvalue的 可以出现在赋值语句的左边 数值是rvalue的 不能被赋值 不能出现在赋值语句的左边
四、常量
* 字符串常量 括在双引号里 或者是括在@""里
* 字符串常量包含的的字符与字符常量相似 可以是 普通字符 转移序列 字符
五、结构体
* 结构可带有方法 字段 属性 索引 运算符方法 条件
* 结构可定义构造函数 但不能定义析构函数 不能为结构定义默认构造函数 默认的构造函数是自动定义的 且不能被改变
* 结构不能继承其他的类或结构
* 结构不能作为其他结构或类的基础结构
* 结构可实现一个或多个接口
* 结构成员不能被指定为abstract virtual protected
* 结构可以不适用new操作符实例化
* 如果不使用new 只有在所有的字段都被初始化之后 字段才被赋值 对象才能使用
* 结构体中声明的字段无法赋予初值
简单代码示例如下:
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
public void SetValue(string t, string a,string s,int b)
{
title = t;
author = a;
subject = s;
book_id = b;
}
public void Display()
{
Console.WriteLine("title:{0}", title);
Console.WriteLine("author:{0}", author);
Console.WriteLine("subject:{0}",subject);
Console.WriteLine("book_id:{0}",book_id);
}
};
Main:
Books book1 = new Books();
Books book2 = new Books();
book1.SetValue("Mr White", "NA NA", "twelve", 90120);
book2.SetValue("Little Prince", "MA MA", "twelve", 90122);
book1.Display();
book2.Display();
六、类和结构的对比
* 类是引用类型 结构是值类型
* 类支持继承 结构不支持继承
* 结构不能声明默认的构造函数
* 类的对象是存储在堆空间中,结构存储在栈中 堆空间大 但访问速度慢 栈空间小 访问速度较快
* 当我们描述一个轻量级对象的时候 结构可提高效率 成本更低
* 假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝时 就应该使用类
类和结构体的使用场景
* 1.当堆栈空间很有限 且有大量的逻辑对象时 创建类要比创建结构好一些
* 2.对于点、矩形和颜色这样的轻量级对象 假如要声明一个含有许多个颜色对象的数组 则CLR需要为每个对象分配内存 在这种情况下 使用结构的成本较低
* 3.在表现抽象和多级别的对象层次时 类是最好的选择 因为结构不支持继承