C#基础

* 基础

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;}
}
View Code

  - 自动属性: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 }
View Code

   实例讲解: 

    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);
            }
        }    
int.parse()和 tryParse()用法

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()); 
View Code

 

posted on 2018-07-17 14:02  莫伊筱筱  阅读(229)  评论(0编辑  收藏  举报