c#学习笔记005days

005days

  1. 反射
  2. 异常处理
  3. 正则表达式
  4. 字符串类

反射

using System;
using System.Reflection; //反射需要用到的命名空间
//反射:可以直接通过类名、成员的名字来进行对象的实例化、操作对象
class Person
{
    public int a;
    private int b;
    public static int c;
    private static int d;

    public Person()
    {
        Console.WriteLine("Person类无参的构造方法被调用");
    }
    private Person(int a,double b )
    {
        Console.WriteLine("有参构造函数被调用了");
    }
    public void ShowA() { }
   private void ShowB() { }
    public static void ShowV() { }
    private static void ShowD() { }
    public int show(int a,double b)
    {
        return a;
    }
   private int show(double a, int b)
    {
        return b;
    }

}
class Program
{
    public static void Main(string[] args)
    {//实例化一个person对象
        //通过类名来获取一个类型
        //命名空间:如果这个类在一个命名空间中,那么写类型名的时候需要加上命名空间;
        //例如:System.Int32
        Type t = Type.GetType("Person");
        //实例化一个对象
        // object obj = Activator.CreateInstance(t);//访问不到私有的构造方法,默认会使用public无参的构造方法来实例化
        //实例化一个对象,如果为true,表示可以匹配任何权限的无参构造方法
        // object obj = Activator.CreateInstance(t, true);

        //实例化一个对象,是通过public权限的有参构造来实例化的1
        // object obj = Activator.CreateInstance(t, 1, 3.1);
        //实例化一个对象,通过非public权限的有参构造方法
        object obj = Activator.CreateInstance(t, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { 1, 3.1 }, null);

        /*
         BindingFlags:要访问的方法或字段的权限描述,必须要同时具备两个描述
         1.要访问的权限描述
         2.要访问的成员归属
         */

        //通过反射访问字段
        //1.访问public权限的,非静态的字段a
        FieldInfo a = t.GetField("a");
        a.SetValue(obj, 1);//给obj对象的a字段进行赋值,赋值为1
        Object aa = a.GetValue(obj);//获取对象obj的字段a的值
                                    //2.访问private权限的,非静态的字段a
        FieldInfo b = t.GetField("b", BindingFlags.NonPublic | BindingFlags.Instance);
        b.SetValue(obj, 2);
        object bb = b.GetValue(obj);

        //3.访问public权限的,静态的字段a
        FieldInfo c = t.GetField("c", BindingFlags.Public | BindingFlags.Static);
        c.SetValue(null, 2);//如果要访问的是一个静态的成员,访问的主体是null
        object cc = c.GetValue(null);
        //4.访问private权限的,静态的字段a

        FieldInfo d = t.GetField("d", BindingFlags.NonPublic | BindingFlags.Static);
        d.SetValue(null, 2);
        object dd =d.GetValue(null);


        //通过反射访问类中的方法
        //1.获取没有参数的方法
        MethodInfo method0= t.GetMethod("ShowD", BindingFlags.NonPublic | BindingFlags.Static);
        //方法调用,第一个参数是谁在调用方法,第二个参数:调用的方法的实参列表
        method0.Invoke(null, null);
        //2.获取有参数有重载的方法
        //Type数组中传要访问的访问的参数类型列表
        MethodInfo method1 = t.GetMethod("show", BindingFlags.Public | BindingFlags.Instance, null, new Type[] {typeof(int), typeof(double) }, null);

        //第二参数是实参列表
        //invoke方法的返回值,就是method1方法的返回值
        object result = method1.Invoke(obj, new object[] { 1, 3.13 });
        Console.WriteLine(result);
    }
}

异常处理

using System;
//异常:程序在运行过程中产生的种种的不正常的现象
//异常处理、
/*
try{
 * //可能会异常的代码
 * }
 * catch(异常类型 e){
 * //这里捕获try中可能出现的异常
 * }
 * finally{
 * //无论程序中有木有异常,这里面的代码始终会执行
 * }
 *

 *1.一个try可以匹配多个catch来捕获多种异常
 * 2.如果有多个catch
 *         2.1如果多个catch捕获的异常没有继承关系,顺序无所谓
 *         2.2如果多个catch捕获的异常彼此之间有继承关系,那么必须把父类异常放在最后  
 * 
 */
namespace 异常处理
{
    class Program
    {
        static void Main(string[] args)
        {//在c#中,所有的异常都是Exception的子类
            try
            {
                int[] ary = new int[3];
                ary[4] = 0;
            }
            //来捕捉IndexOutOfRangeException这个异常
            catch (IndexOutOfRangeException)
            {
                Console.WriteLine("发生了数组越界的异常");
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("除0异常");
            }
            catch (Exception)
            {
                Console.WriteLine("所有的异常");
            }
            Console.WriteLine("程序结束");
            try
            {
                person.ScoreException();
            }
            catch (ScoreException exception) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine(exception);
            }
        }
    }
    //自定义异常:继承自Exception类,写一个自己的类即可
    class ScoreException : Exception {
        //如果希望自定义的异常有描述信息,只需要一个有参构造
        public ScoreException(string message) : base(message) { }
    }
    class person
    {//设计一个会产生异常的方法
        public static void ScoreException()
        {
            // 实例化一个异常对象
            ScoreException exception = new ScoreException("这个是自定义的异常");
            //抛出异常
            throw exception;
        }

    }
}

正则表达式

using System;
using System.Text.RegularExpressions;
//正则表达式:用来判断某一个字符串是否匹配一定的格式
//没有代码提示,就是一个字符串
//using System.Text.RegularExpressions;
namespace housebook6
{
    class Program
    {
        static void Main(string[] args)
        {//^:匹配一个字符串的开头
         //$:匹配一个字符串的结尾
         //[]:匹配一个字符,这一位字符可以是这个中括号中的任何一个
         //[1-9]:这一位字符可取的范围”[1,9]
         //[a-zA-Z1-9]:这一个字符可取的范围[a,z],[A-Z],[1-9]
         //[^1-9]:表示可以写[1-9]之外的所有字符
         //实例化一个正则表达式对象


            //+:前面的一位字符连续出现了1次或者多次
            //*:前面的字符联系出现了0次或者多次
            //?:表示前面的一位字符联系出现0次或者1次
            //{m}:前面的一位字符连续出现m次
            //{m,}:前面的一位字符至少出现m次
            //{m,n}:前面的一位字符出现[m,n]次
            //\d:[0-9]
            //\D:[^0-9]
            //别忘记\在字符串里面是转义字符
            //.:通配符,可以匹配任意字符
            Regex r = new Regex("^hello world$");
            Regex r1 = new Regex("^[abcdefg]ello world$");
            Regex r2 = new Regex("^[1-9]ello world$");
            bool result = r.IsMatch("hello world");
            bool result1 = r1.IsMatch("hello world");
            bool result2 = r2.IsMatch("0ello world");
            Console.WriteLine(result);
            Console.WriteLine(result1);
            Console.WriteLine(result2);
            //批量替换
            string names = "laowang      xiaomin  uncle wang";
            string pattern = " {2,}";
            Console.WriteLine(Regex.Replace(names,pattern,", "));
            Console.WriteLine( CheckPhone("18888888888"));


        }
        public static string CheckPhone(string phone) {
            //18888888888=>188****8888
            //分组:可以将一个字符串分成几部分
            //():用来表示一个分组
            string pattern1 = @"^(1[34578]\d)(\d{4})(\d{4})$";
            Match match = Regex.Match(phone, pattern1);

            GroupCollection groups = match.Groups;
            string group1 = groups[1].Value;
            string group2 = groups[2].Value;
            string group3 = groups[3].Value;
            return group1 + "****" + group3;
        }
    }
}

字符串类

using System;

namespace 字符串类
{
    class Program
    {
        static void Main(string[] args)
        {//字符串类
            char[] s = { 'h', 'e', 'l', 'l', 'o' };
         //字符串实例化
            string str = new string(s);//hello
                                       //和另外一个字符串比较
                                       //从低0个字符开始依次比较每一个字符,直到某一个字符可以确定大小
            int result = "hello".CompareTo("hellloo");
            Console.WriteLine(result);

            //判断是否包含某个子串
            bool c = "hello world".Contains("llo");
            //Endswith:判断是否以指定的字符串结尾
            //StartsWith:判断是否以指定的字符串开头
            bool d = "harry".EndsWith("ry");
            Console.WriteLine(d);
            //在一个字符串中插入一个字符,得到一个新的字符串
            string result1 = "ello".Insert(0, "h");
            Console.WriteLine(result1);
            //Remove:删除一部分
            //SubString:截取一部分


            string[] result2 = "xiaoming,laowang,xiaonghong".Split(',');

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值