* 基础
1、const和readonly的区别
- const 静态成员,编译时确定值。只能在声明的同时初始化,是编译时的常数,默认是静态的。 const int a = b+ 1; (错),因为b是一个变量;
- readonly 实例成员,运行时确认值。把一个字段设置为常量,可以进行计算,是运行时常数,可以在构造函数或声明时进行初始化,所有不同的对象可能有不同的值。
相同点:
1. 一旦初始化就都不可以再赋值;
不同点:
1. const 在声明时初始化; readonly在声明时或构造函数中初始化;
2. const 隐含static,不可再写static const; readonly则不默认static,如需要可以写static readonly;
3. const 编译期的常量; readonly运行时动态解析常量;
2、属性和字段
- 基本属性: 可以是静态属性归类所有,非静态属性归对象所有
class Test { private int number; //int表示该属性所封装的数据类型 //数据类型必须与相应的字段(number)相同 public int Num { get{return number;} set{number=value;} } // 相当于自动属性 public string Name{set;get;} }
- 自动属性:1、在编译时,编译器为类型自动生成了私有返回字段和适当的get/set实现逻辑;
2、自动属性必须同时具有get/set功能;
3、由于返回的私有字段是在编译时创建的,不能直接使用new关键字分配引用类型,必须在类的构造函数内部执行,以确保对象安全诞生。
1 class Spawn 2 { 3 //隐藏的int字段默认值为0 4 public int numbers{get;set;} 5 //隐藏的Enemy返回字段为null 6 public Enemy MyEnemy{get;set;} 7 8 //必须用构造函数重写分配给隐藏返回字段的默认值 9 public Spawn() 10 { 11 MyEnemy = new Enemy(); 12 numbers = 1; 13 } 14 15 public Spawn(Enemy enemy, int num) 16 { 17 MyEnemy = enemy; 18 numbers = num; 19 } 20 }
实例讲解:
public string Name{set;get;} : 实例化时,系统会先分配一个叫name的private私有的内存空间,之后的读与写操作都是通过public的Name来关联name,达到封装目的,通过get/set控制读写
public string name; 实例化时,系统直接对name属性分配内存,对name的操作也是直接操作内存中name属性的所在块。
总结:
属性对外暴露数据,数据存储在字段里的,可以动态计算;对内保护字段不受“非法值”污染;
一般情况,用于表示实体(对象或类型)的状态,属性大多数是字段的包装器;
使用属性暴露数据,字段永远是private或protected类型;
3、数值转换
static void Parse(int counter) { int res = 0; for (int i = 0; i < counter; i++) { try { //不满足要求,parse会抛出异常 res = int.Parse(val); } catch { res = 0; } } } static void TryParse(int counter) { int res = 0; for (int i = 0; i < counter; i++) { //不会抛出异常,会返回false,同时传入的值设为0 int.TryParse(val, out res); } }
4、Assembly
//当前项目所有的程序集: Assembly[] assmblyList = System.AppDomain.CurrentDomain.GetAssemblies(); /**首先使用Load()方法,LoadForm()与LoadFile()的区别: * LoadFile()只加入相应的dll文件,不会加载依赖项,比如adb.dll中引用了def.dll,则 def.dll不会被载入; LoadForm()会加载所有的文件 */ Assembly.Load("string或者AssemblyName为参数"); Assembly.LoadFrom("C:/ABC/Test.dll"); Assembly.LoadFile("");
5、char[] byte[]
//byte[] <==> string string str = "是a"; //使用Unicode编码将字符串变为字节序列 byte[] b = Encoding.Unicode.GetBytes(str); string s1 = Encoding.Unicode.GetString(b); //char[] <==> byte[],字符→字节【编码】,反过来解码,【byte 0 ~ 255】 byte[] b1 = new byte[5] { 0x01, 0x02, 0x03, 0x04, 0x05 }; //将字节数组解码为字符数组 char[] c = Encoding.ASCII.GetChars(b1); //将字符数组编码为字节数组,当char值大于256时就会转换错误 byte[] b2 = Encoding.Default.GetBytes(c); //string <==> char[] string s2 = "adbjk23"; char[] c2 = s2.ToCharArray(); string s3 = new string(c2);
6、扩展属性
6.1 在本来中扩展
[BsonIgnore] public Dictionary<GpsProperty, string> Property { get; set; } /// <summary> /// 获取或者设置扩展属性值 /// </summary> /// <param name="property"></param> /// <returns></returns> public string this[GpsProperty property] { get { string val; Property.TryGetValue(property, out val); return val; } set { Property[property] = value; } } //使用 WeightValue = item.Property.ContainsKey(GpsProperty.ZtWeightValue) ? Convert.ToInt32(item.Property[GpsProperty.ZtWeightValue]) : 1,
6.2 在另外类中扩展
注意:必须是静态类,静态方法;调用时当实例方法调用。
1 static class StringExtension 2 { 3 public static string DoubleString(this string str) //表示把这个方法添加到string类中 4 { 5 return str + str; 6 } 7 } string str = "ABCD"; Console.Write(str.DoubleString());