第3章 对象和类型
Struct和Class区别
Class:存储在堆(heap)上的引用类型
Struct:存储在栈(stack)上的值类型,不支持继承,本身继承自System.ValueType,用于简单小数据的结构,new struct时不分配堆内存,Struct中不能默认初始化
struct Dimensions
{
public doubleLength=1;//error. Initial values not allowed
}
应该
struct Dimensions
{
public double Length;
}
Dimensions point=new Dimensions();//对于结构可以不用new关键字,Dimensions point;
point.Length=1;
自动实现的属性
如果属性的get和set方法中没有任何逻辑,可以自动实现,但必须有两个访问器
public int Age{get;set;}
public int Age{get;}//错误的表达式
可以设置访问级别
public int Age{get;private set;}
静态构造函数
该构造函数只执行一次,是在创建第一个类实例或任何静态成员被引用时,没有访问修饰符,不带参数,可以用来初始化静态属性
class UserPreference
{
public static readonly Color BackColor;
static UserPreference() {
DateTime now =DateTime.Now;
if (now.DayOfWeek ==DayOfWeek.Saturday
|| now.DayOfWeek == DayOfWeek.Sunday)
{
BackColor = Color.Red;
}
else
BackColor = Color.Green;
}
}
Console.WriteLine(UserPreference.BackColor);
readonly关键字
可以再构造函数中给予赋值,可以是一个实例字段,const只能为静态
匿名类型 var
var captain= new{FirstName="James",MiddleName="T",LastName="Kirk"};
生成一个包含FirstName,MiddleName,LastName属性的对象
扩展方法
源码不能直接修改,需要给其中某Class加方法时
原有Class
public class Money{}//不用管里面有什么
扩展Class
public static class MoneyExtension//必须为static class
{
public static void AddMethod(this Money money)//this关键字,后面跟要扩展的类型,其他参数跟在扩展类型后
{
//do something
}
}
调用扩展的方法
Money money=new Money();
money.AddMethod();