一、封装性
什么是封装
1.可以将某段具有特殊功能的代码提取出来,做成方法。
2.将某些具有特殊格式的数据做成一个类的对象。(比如年龄不可能超过150,也不可能有负数)
//封装方法使年龄在合理的访问内
class Person
{
//因为如果直接访问直接访问这个字段
//那么对这个字段进行的赋值可能是不符合逻辑的
//所以,将这个字段做成私有的不允许外界直接访问(private)
private uint age;
//但是将age私有化后,外界如果还需要使用
//我们给外界提供访问这个age字段的方法
public void SetAge(uint newAge)
{
if (newAge > 150) return;
age = newAge;//将外界传过来的值给age赋值
}
public uint GetAge()
{
return age;
}
}
class Program
{
public static void Main(string[] args)
{
//实例化一个Person对象
Person xiaoming = new Person();
//访问xioaming的age字段
xiaoming.SetAge(10);//设置年龄值
uint age = xiaoming.GetAge();//获取年龄值
}
}
属性
语法:[访问权限修饰符] 要访问的字段类型 属性名(遵循大驼峰命名法,但一般用访问的字段作为属性名){ }
注意:一个属性中,至少要有一个访问器(即:set{})
class Person
{
private uint age;
//通过属性和属性访问器来实现
public uint Age //属性与方法写法上差了一个()
{
//写操作
set {
//在属性访问器中(set{}就叫属性访问器),使用value来表示外界传的值
if (value <= 150) age = value;
}
//读操作
get
{
return age;
}
}
}
class Program
{
public static void Main(string[] args)
{
//实例化一个Person对象
Person xiaoming = new Person();
//使用属性非常简单,且能达到与方法一样的效果
xiaoming.Age = 10;
Console.WriteLine(xiaoming.Age);
}
}
二、readonly只读关键字
1.readonly通常在类中属性前面
2.使用lreadonly的属性,只能在定义时,或者构造函数中初始化,其他地方都不能再修改其值。
readonly与get{}比较:
readonly只能够初始化一次,即在定义或者构造方法初始化时,而get{}虽然也起到的只读的作用,但可以通过set{}进行多次修改。
readonly(只读)与const(常量)比较:
1.const常量必须要有初始值,而readonly可以没有
2.readonly可以在构造方法中进行赋值,而const不行。const一旦确定值就不可以改变了
eg:例如我们这里有一个类
lass TestClass2
{
private int someValue;
public void ChangeValue(int newValue)
{
someValue = newValue;
}
public int ShowValue()
{
return someValue;
}
}
而在另一个类中使用它
class TestClass
{
private readonly TestClass2 tc; // 注意此处tc是readonly的
public TestClass()
{
tc = new TestClass2();
}
public void ChangeTCValue(int value)
{
tc.ChangeValue(value);
}
public void Show()
{
Console.WriteLine("{0}", tc.ShowValue());
}
}
我们看到虽然tc这个字段是readonly的,但是可以使用方法来改变tc中someValue的值。似乎这个“只读”失去了意义,因为可以修改它的值的话还叫什么“只读”呢?
非也!
从上面的代码中我们可以看到,tc的类型是TestClass2,是一个引用类型。而引用类型是必须用new关键字为它分配了一块内存以后它才能在后续代码中工作的。也就是说,tc这个变量仅仅是一块内存地址罢了。这里的“readonly” tc只是无法再重新更改它的引用,但它所引用对象的属性是可以改变的。
那么为什么不用const呢?还是因为tc是引用,是动态分配内存的,不可能在编译阶段就确定它的地址,这点和值类型(包括string)是完全不一样的。
综上所述,可以得出结论:readonly修饰的字段,其初始化仅是固定了其引用(地址不能修改),但它引用的对象的属性是可以更改的。
当然,这里的“地址不能修改”指的是在代码中不能再对readonly变量进行再赋值,实际运行情况中可能会遇到GC或反射改变内存的情况。但是在本文所说的环境下不必考虑。
所以,大胆放心的用readonly吧,这样还可以防止不必要的再赋值,保证了这个对象的安全性。
三、设计模式
用来解决特定问题的解决方案
单例
在一个项目的不同模块中获取对象,那么获取到的是同一个对象。
//单例
class User
{
//第一种单例方式:
//通过私有化构造方法,限制new一个新的对象
//创建私有静态类对象,通过他来创建对象时只执行一次
//提供一个公有的静态的访问方法(CurrentUser())或者是类的属性只读(Current)来获取一个对象
//1.私有化构造方法,目的:防止用户通过new的方式多次实例化对象。</