三天学完C#--第三天

异常

C#中的异常处理与Java一模一样

using System; 
using System.Threading; 
using UserNamespace; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using UserNamespace.Studnet; 
using System.Collections; 
namespace ConsoleApp1 { 
class Program { 
//自定义异常类,继承自Exception类,写一个自己的类即可
 class ScoreException : Exception {
 //如果希望自定义的异常有描述信息,只需要些一个有参构造即可 
public ScoreException(string message) : base(message) { } } 
static void Main(string[] args) {
 int[] arry = new int[5]; 
/* * 1,一个try可以匹配多个catch来捕获多种异常 
* 2,如果有多个catch
 * 2,1、如果多个catch捕获的异常彼此之间没有继承关系,顺序无所谓 
* 2,2、 如果多个catch捕获的异常彼此之间有继承关系,那么必须把父类异常放在最后 * */ 
try { arry[5] = 10; } catch (Exception e) {
 //catch 用于捕获异常
 //在C# 中所有异常都是exception的子类 Console.WriteLine(e.Message); }
 finally { 
//无论程序有没有异常,finally 中的代码始终会执行 
Console.WriteLine("try -catch 模块结束"); } 
try { ScoreException exception = new ScoreException("自定义异常");
 throw exception; } 
catch(ScoreException scoreException) { 
Console.WriteLine(scoreException.Message); 
} } }}

反射

可以通过类名、成员的名字来进行对象实例化、操作类成员,具体代码如下:

using System;
using System.Threading;
using UserNamespace;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using UserNamespace.Studnet;
using System.Collections;
using System.Reflection;//反射需要用到的命名空间
namespace ConsoleApp1
{
    //反射:可以通过类名、成员的名字来进行对象的实例化、操作类成员
    class Person {

        public int a;
        private int b;
        public static int c;
        private static int d;

        private Person() {

            Console.WriteLine("Person类无参的构造方法被调用");

        }

        private Person(int a,double b,string c)
        {

            Console.WriteLine("Person类无参的构造方法被调用");

        }

        public void showA() { }
        public void showB() { }
        public static void showC() { }
        public static void showD() { }

        public int show(int a,int b) { return a; }

        private double show(int a, double b) { return b; }
    }

   
    class Program
    {
      
        static void Main(string[] args)
        {
            //实例化一个Person对象
            //通过类名来获取一个类型
            //命名空间:如果这个类在一个命名空间中,那么在写类型名的时候需要加上
            //例如:System.Int32
            Type type = Type.GetType("ConsoleApp1.Person");

            //实例化一个对象,默认会使用public权限的无参的构造方法来实例化
            //object obj =  Activator.CreateInstance(type);
            //实例化一个对象,如果为true,表示可以匹配任何权限的无参构造方法
            // object obj = Activator.CreateInstance(type,true);

            //实例化一个对象,是通过public权限的有参的构造方法来实例化
            //object obj=Activator.CreateInstance(type, 1,3.1,"hello");

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


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

            //通过反射访问类中的字段
            //1,访问public权限的,非静态的字段a
            FieldInfo fieldInfo = type.GetField("a");//给 type 对象的 a 字段进行赋值,赋值为 1
            fieldInfo.SetValue(type,1); 
            fieldInfo.SetValue(obj, 1);//给 obj 对象的 a 字段进行赋值,赋值为 1
            object objA = fieldInfo.GetValue(obj);  //获取对象objA的字段 a 的值

            //2, 访问private权限的,非静态的字段b
            FieldInfo fieldInfoB = type.GetField("b",BindingFlags.NonPublic | BindingFlags.Instance );
            fieldInfoB.SetValue(obj,3);
            object objB = fieldInfoB.GetValue(obj);


            //3,访问public权限的,静态的字段c
            FieldInfo fieldInfoC = type.GetField("c",BindingFlags.Public | BindingFlags.Static);
            fieldInfoC.SetValue(null,4);//如果要访问的是一个静态的成员,访问的主体是null
            object objC = fieldInfoC.GetValue(null);
            //4,访问private权限的,静态的字段d
            FieldInfo fieldInfoD = type.GetField("b", BindingFlags.NonPublic | BindingFlags.Static);
            fieldInfoD.SetValue(null,5);
            object objD = fieldInfoD.GetValue(null);


            //通过反射访问类中的方法
            //1,获取没有参数的方法
            MethodInfo method = type.GetMethod("showD",BindingFlags.NonPublic | BindingFlags.Static);

            //方法调用,第一个参数是谁在调用方法,第二个参数是调用的方法的实参列表
            method.Invoke(null,null);

            //2,获取有参数有重载的方法
            //Type数组中传要访问的方法的参数类型列表
            MethodInfo method1 = type.GetMethod("show", BindingFlags.Public | BindingFlags.Instance,null,new Type[] {typeof(int),typeof(Double) },null);
            //第二个参数是实参列表
            //invoke方法的返回值,就是method1方法的返回值
            object objE=method1.Invoke(obj,new object[] { 1,3.13});
            Console.WriteLine(objE);
        }
    }
}

字符串

C#中的字符串处理基本与JAVA一致,具体基本操作代码如下:

using System;
using System.Threading;
using UserNamespace;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using UserNamespace.Studnet;
using System.Collections;
using System.Reflection;//反射需要用到的命名空间
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] stringArr = {'a','b','c' };
            string str = new string(stringArr);
            //和另外一个字符串比较
            //从第0个字符开始一次比较每一个字符,知道某一个字符确定大小
            int result = "hello".CompareTo("hallo");
            Console.WriteLine(result);

            //判断是否包含某个子串
            bool c = "hello world".Contains("11");

            //Endwith:判断是否以指定的字符串结尾
            //startswith:判断是否以指定字符串开头
            bool d = "harry.rmvb".EndsWith("rmvb");
            //在一个字符串中插入一个字符串,得到一个新的字符串
            string newstring = "ello".Insert(0,"h");

            //Remove:删除一部分
            //substring:截取一部分
            string[] newstrArr="xiaoming,xiaohong,lily,lucy".Split(',');
            foreach (string temp in newstrArr) {
                Console.WriteLine(temp);
            } }}

yield

yield return 用于多次返回(一次返回多个值)

而 return 一次只能返回一个值

yield break 多次返回值时退出

多线程

//第一种创建线程的方式  
var task1 = new Task(() =>
            {
                for (int i = 0; i < times; i++) {

                    Console.WriteLine("1 "+ i);
                }
            });
            
 /**
 * 第二种创建线程方式
 */
 using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Timers;

namespace ConsoleApp1
{   

    class Program
    {
        static void Main(string[] args)//主线程
        {
            int times = 5000;
            var task1 = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < times; i++) {

                    Console.WriteLine("1 "+ i);
                }

                return "1";
            });

            Console.WriteLine(task1.Result); 

            var task2 = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < times; i++)
                {
                    Console.WriteLine("2 "+i);
                }
            });

            task1.Start();
            task2.Start();


            task1.Wait();
            task2.Wait();

            Console.Read();  }   }} 
            

异常现在线程中的捕获

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Timers;

namespace ConsoleApp1
{
    

    class Program
    {


        static void Main(string[] args)//主线程
        {
            int times = 5000;

            var task1 = Task.Factory.StartNew(() =>
            {
                throw new ApplicationException("there is an erro");
            });
            
            //使用线程中的内置方法 捕获线程中的异常
            task1.ContinueWith((task)=> { Console.WriteLine(task.Exception); },
                TaskContinuationOptions.OnlyOnFaulted
                );
            //直接在 catch包围 wait,捕获异常
            try {

                task1.Wait();
            } catch(AggregateException aggre) {
                foreach (var tem in aggre.InnerExceptions) {
                    Console.WriteLine(tem.Message);
                }
            }


            Console.Read(); } }   
}

并行处理

比较单线程处理任务与多线程处理任务的效率:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Timers;

namespace ConsoleApp1
{   
    class Program
    {
        static void CalcTime(Action action) {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            action();
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
        }

        static void Do(ref int i) {
            i = (int)Math.Abs(Math.Sin(i)); }

        static void Main(string[] args)//主线程
        {
            var list = new List<int>();
            for (int i=0;i<5000000 ;i++) {
                list.Add(i);
            }
            CalcTime(()=>list.ForEach(i=>Do(ref i)));
            CalcTime(() => Parallel.ForEach(list, i => Do(ref i)));//开启部分线程进行操作
             } }   
}

lock关键字使操作具有原子性,使当前进行任务时不被打断,如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Timers;

namespace ConsoleApp1
{  

    class Program
    {
        static int count = 0;
        private static readonly object Syn = new object();

        static void  Increment() {
            lock (Syn) {
                for (int i = 0; i < 500000; i++)
                {
                    count++;
                }  }      
        }

        static void Decrement()
        {
            lock (Syn)
            {
                for (int i = 0; i < 500000; i++)
                {
                    count--;
                } }}

        static void Main(string[] args)//主线程
        {
            var task1 = new Task(Increment);
            var task2 = new Task(Decrement);
            task1.Start();
            task2.Start();

            task1.Wait();
            task2.Wait();

            Console.WriteLine(count);
            Console.Read();
        } }    
}

相同操作如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;

namespace ConsoleApp1
{   
    class Program
    {
        static int count = 0;
        static void  Increment() {           

                for (int i = 0; i < 500000; i++)
                {
                        Interlocked.Increment(ref count);                    
                }                  
        }

        static void Decrement()
        {          
                for (int i = 0; i < 500000; i++) {
                Interlocked.Decrement(ref count);
            }}

        static void Main(string[] args)//主线程
        {

            var task1 = new Task(Increment);
            var task2 = new Task(Decrement);

            task1.Start();
            task2.Start();

            task1.Wait();
            task2.Wait();

            Console.WriteLine(count);
            Console.Read();
        } }  
}

其实三天并没有学完C#的基础特性,但是因为我只是为了简单的了解unity才学的C#,基本上学到这里去了解unity游戏开发就已经足够了,后面如果需要用到这些知识呢,再继续学习吧。

那就先留个笔记在这里吧:以后需要学习的时候再来学习下:

C#中迭代器模式:

https://www.bilibili.com/video/av2357992?p=13

C#中如何自定义查询运算符:

https://www.bilibili.com/video/av2357992?p=14

C#中的序列化及动态编程

https://www.bilibili.com/video/av2357992?p=16

C#中的常用工具类以及设计模式

https://www.bilibili.com/video/av2357992?p=18

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,737评论 0 10
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,780评论 0 38
  • 2019年10月28日 星期一 晴 【亲子日记1006天】 新的一周开始啦,儿子中午不回家吃饭,今天的午饭又剩...
    窝窝家阅读 135评论 0 1
  • 没有想到一个无意的检查,查出来身体有个小毛病,需要手术。 因为手术医生休假,准备做手术的时候再转入新的科室,暂时住...
    李苏珊阅读 165评论 0 0
  • 非暴力沟通表达感激的方式有三个部分。第一,对方做了什么事情使我们的生活得到改善。第二,我们有哪些得到了满足。第三,...
    虫虫草阅读 11,513评论 0 0