Unity学习笔记:来自于C#自带的System中的知识

60 篇文章 2 订阅
6 篇文章 0 订阅

namespace 定义一个命名空间

命名空间是在类以上,方便分类以及限制类的调用

public公有 private私有 protetced受保护的  能够在本类和子类调用 Internal同一个程序集中调用

二进制计算方法:二转十:最后一位是2的0次方倒数第二位2的一次方
例如:10101=2的4次方+2的2次方+2的0次方;=21;
2的几次方就是1后几个0;

switch和case的用法 : int a = 0 switch(a){case 0 : *****; break;}分支判断

运算符 或且非 && || !  异或 ^^
且:&& 对比同字位上1和0  如果有1位是0,取0值;
或:|| 对比同字位上1和0  如果有1位是1,取1值;
非: ! 将所有位1和0互换;
异或: ^^ 同位不相同为1,相同为0;

左位移<<:全向左移一位,最左补到最右;右位移>>:全向右移一位,最右舍弃;

实例化意义   应用方法前实例化该方法的类;

引用参数时可以直接为需要引用的参数赋值,被赋值的参数必须写到后面(优先给未被赋值的参数赋值),调用参数时可以省略已经赋值的参数。

例: void abc (int a,int b =0){}    abc(k);
方法中执行retrun后方法直接终止;
a++后增加,++a先增加。continue进入下次循环,break终止循环

三元运算符:   int w = a>b? c:d;   对比a和b的大小,如果a大于b,给w赋值为c,如果b大于a,给w赋值为d。
输入最简单的写法:string a = Console.Read();

构造函数:实例化一个类的时候调用一次该方法,构造函数不需要定义类别,直接通过类名改变,构造函数内不能声明变量 
例如:
class AA
{
    public AA()
    {
       实例化一个类的时候调用一次
    }
}
重载函数:同一个类下相同名字但是引用的参数类型不一样或者数量不一样的两个或多个函数叫做重载函数;

递归函数:在一个函数下调用自己,在调用后会优先执行开头的语句,在最后一次调用自己完成后执行之前因为调用自己而未执行的语句;

静态函数:通过类名来进行直接调用,静态函数只能调用自身的局部变量或其他静态函数和变量,只能被静态函数调用;静态变量:通过类名调用的变量,赋值方法和正常变量相同。

const常量,只能在声明时赋值,声明后不能更改,只能通过类名直接调用,不能搭配静态使用。
ReadOnly 只读变量 只能在声明的时候和构造函数中赋值,通过创建对象来调用,不能更改,能搭配静态使用。写法:public readonly int a = 1;

数组定义的方式:例:int [] a = new int [3];整数三个数数组。
另一种写法:int [] a = new int [] {1,2,3,4,5,6} 包含6个值得整数数组
(二维数组中第二个索引的大小可以不同)

a.length   数组的长度。  a.Max   数组的最大值
通过F12来查看代码在引擎中的作用和调用方法的具体语句;

 

IEnumerable<T> 迭代器

通过数组或list.GetEnumerator() 来获取一个集合的迭代器,迭代器保存的内容为集合的内容。


例: int [] aa = new int[]{1,2,3,4,5,6,7,8,9}               IEnumerable<int>  a = aa.GetEnumerator();

a变量为aa集合的迭代器

a.MoveNext(); 将迭代器的当前索引向后移动一位    

a.Current(); 返回迭代器当前索引对应的值    值为泛型T

a.Count(); 返回当前迭代器索引的总个数


PS:刚刚赋值完的a值是不确定的,需要MoveNext后才能Current返回第一个值
PS2: 如果迭代器的索引到了最后一位那么调用MoveNext会将索引锁定在最后一位并返回false,如果不是最后一位返回true
PS3:如果MoveNext最后一次返回false,那么Current返回的值将是不固定的(??您不能设置Current再次为集合的第一个元素必须改为创建新的枚举器实例??)
PS4:存疑:可以通过为Current赋值来指定迭代器索引的位置?
PS5:如果在迭代器生成后改变对应数组的内容,迭代器会失效
 

 

struct 值类型的类(也叫结构体),和class的区别是构造函数必须有参数,类声明的变量必须在构造函数中赋值;
struct 保存值的类型 在实例化和定义自身的时候可以创建多个值而不是地址;(struct不涉及到地址和指针)

堆和栈的区别:
堆得空间很大而且排列比较无序,运算速度较慢,存储的是new实例化出现的类对象。
栈的存储空间很小,排列比较有顺序,运算速度较快,通常存储类型的变量分为两个,一个是值类型,一个是引用类型,存储的是引用类型地址。

值类型和引用类型的区别:
值类型保存的是值,引用类型保存的是访问到堆类型的了地址

string字符串类型是引用类型,但是使用方法适用于值类型。

string在赋值时会优先搜索堆内存中是非已经创建了需要的值,如果有的话会直接应用已经实例化好的值,不会再次创建相同的值;

string通过实例化char数组字符赋值时会创建两个对象(无视堆内拥有的string字符)

例:string a = new string (new char[] {'a'"});

StringBuilder类可以代替stirng使用,对于经常更变的字符串要使用StringBuilder
StringBuilder abc = new StringBuilder();

StringBuilder类定义的变量名abc.Append('a');为StringBuilder添加一个字符‘a’

StringBuilder类定义的变量名abc.Clear;清空StringBuilder中的所有字符

StringBuilder类定义的变量名abc.Insert(10,'a');在StringBuilder的第十个元素添加一个a,后面的全部元素向后位移1;

StringBuilder类定义的变量名abc.Remove(10,2)移除第9个往后的两个元素(第九个和第十个),后面的元素向前补。

StringBuilder类定义的变量名abc.Replace ('a','b')搜索abc中所有的元素并且把第一个搜索到的a替换成b,可以添加两个参数指定搜索范围(从第几个到第几个)。

Console.WriteLine(abc.ToString());输出StringBuilder类的abc的所有字符组成的字符串,可以引用两个参数输出从第几个字符到第几个字符组成的字符串。

StringBuilder可以像数组一样通过asd[10]使用第9个元素。

string可以应用以上方法,但是需要创建一个新的string来保留通过方法得到的新的字符串。

string类 abc.Split(“,”)将一个字符串分割成字符串数组,通过参数分割,可输入多个参数,可以输入int整数参数来限制获取的字符的数量。

string可以直接输出,也可以在后面添加索引(中括号和数字)来调用出第几个字符    例:string a = "你好我是渣渣辉"  a[6] = '渣';

params 数组前的前置符,加入后可以直接给数组赋值,数组自动把值补充到数组后。

int Parse(string类 a)将a里的字符串转化成整数   .Tostring()转化成string

枚举类型 enum (属于类  例如class)  枚举类型中只能声明变量,并用逗号分割。 public enum aa{a,b,c,d}   在枚举类型里定义四个值,不需要赋值,自带初始值。(也可以赋值)后面的值会是前一个值+1

this代指当前对象,相当于new实例化自己后的对象,this.a就是调用自己类中包含的的变量a

get,set:为单个变量规定只读和可写属性。例
private int a = 1;
public int b
{
    get
    {
         return a;
    }
    set
    {
         a = value;
    }
}
set和get属性可以只设置单个属性,get控制传出,set控制被写入。只设置单个属性时另一个无法进行。可以再set和get中添加逻辑代码,在传出值时会先执行get中的逻辑,在传入值会先执行set中的逻辑,传出和写入的的值可以根据逻辑被修改。(理解为方法)

泛型:class AA<T>  {T t ;}  在调用通过泛型创建的变量时要优先为其规定类型。
AA <int> a = new AA<int>();   a.t=10;

字典写法例:
Dictionary<string,int> asd = new Dictionary <strin,int>();
asd.Add("qwe",1234);

字典通过方法添加和保存键名和键值来通过键名获取键值。

asd[键名]  能返回键值

asd.key可以输出保存的键名,asd.Value可以输出保存的键值;(在foreach中使用)

var变量类型,(只能在函数内声明局部变量)可以保存所有值类型的变量,通过里面的第一个值来决定具体类型
var a = 123; var a = 123.456; var a = 123.4f;

通过foreach来遍历整个数组
foreach(var i in asd)   //asd为需要遍历的数组的名字,不需要在后面添加索引。
{
Console.WriteLine(i);
}

输出数组中每一个数
通过的迭代器遍历数组

Dictionary<string, int> asd = dsa.GetEnumerator();
while (asd.MoveNext()) //MoveNext()是向下读值,直到读到空值为止返回false
{
Console.WriteLine("Key"+asd.Current.Key+""+asd.Current.Value)   //Current当前值
}
}

asd.Remove("aaa");移除键名和对应的键值。

asd.ContainsKey("aaa");搜索键值为aaa的键名。(常用语if中搜索到返回ture,没有返回false)

asd.Clear();清空字典。

d=asd["aaaaaa"]从asd字典中找到aaaaaa键名并把其中保存的键值赋值给d;

List(暂为目录)泛型数组,可以随意变化数组长度,并通过调用方法来添加或删除值。

List<int>list = new List<int>();   list.Add(123);

list .Count 获得list目录的长度。

封装:保护自己写下的类.方法.或者变量,使其在外部只能被调用无法被修改

继承:class A   class B:A   父类实例化可以直接被子类赋值(隐式转换),反向不能。(被实例化的子类)(被赋值的父类单纯应用子类中的重写方法,如果子类中无重写方法,则相当于实例化自身)

sealed密封类,加在class前代表该类无法作为父类被继承。

base:调用父类的方法,b=base.a;就是讲父类的a赋值给b。base.asd();就是执行父类中的asd方法。

public B():base (1):在子类的构造函数之后加base可以实例化子类时同时调用父类的构造函数。(如果不加base会默认调用无参数的父类构造函数。)

virtual虚函数  虚函数作为父类时子函数可以通过override对父类的方法进行重写(new为隐藏父类方法),在实例化父类时直接将子类对其赋值并调用被重写的函数的时候会执行被子类重写的函数(直接实例化父类函数时调用不收重写影响)。

抽象类abstract:无法被实例化的类型,单纯作为父类使用,通过写在class前面。(除不能实例化外无区别)抽象类定义的静态变量和常量依旧可以通过类名进行调用

抽象方法:public abstract void a ();只能在函数类中进行定义,属于语句无法在抽象方法中定义逻辑。抽象方法所在的抽象类作为父类被继承时,子类必须必须对父类中定义的抽象方法进行重写。

接口:interface
例:public interface AA {void a(); void b();}
接口不能定义变量,能创建好方法但是不能在里面编写逻辑,不能被new实例化,接口作为父类被子类继承时,子类必须拥有与父类接口定义的空方法名字完全相同的带或不带逻辑的函数。
子类可以同时继承父类和接口,B接口可以继承A接口,然后继承A接口的子类需要同时编写A接口和B接口的空方法;
子类复写接口的方法后,创建一个接口类型的变量将实例化的子类赋值给该变量,就能直接通过接口执行被子类重写的方法。
写法:public class 子类 : 父类,接口,接口 {}

多态:相同的操作对不同的对象产生的不同的效果叫做多态。  例:实现多个继承同一接口的拥有同一方法名但方法逻辑不相同的子类。

隐式向上转换C#可以自动将类型由下向上转换(子类转化父类,int转化float)
显式转换 (int)10.6f 无法转化会报错
强制转换  A as B A转换为B  于显式转换的区别是无法转换会赋予A空值;

Object 是所有类型的基类,所有类型都能转换为Object类型(大多应用于变量)(过程属于装箱拆箱)

应用ArrayList前需要先引用数据库using System.Collections

ArrayList属于Objuct类型的List(目录),可以保存任何类型的变量。(哪怕是同一个数组内)

ArrayList能保存种类多但是涉及到装箱拆箱加大计算机负担,List只能保存一种类型但是运算速度快。

Random.Next(0,100)随机获得一个0到99的值;

from where selectde 的用法

       int[] result = ( from val in array      where val >= 5 && val <100      select val).ToArray();

从数组中筛选符合条件的值并将其组成一个新的数组


DateTime.Now();获取当前系统时间;

    Timer t = new Timer(10000);   //实例化Timer类,设置间隔时间为10000毫秒; 
    t.Elapsed += theout; //到达时间的时候执行事件;   (可省略)
    t.AutoReset = true;   //设置是执行一次(false)还是一直执行(true);   
    t.Enabled = true;     //是否用Elapsed执行theout事件;
    
    public static void theout(object source,ElapsedEventArgs e)//object传进来Timer类型的变量,ElapsedEventArgs是当前系统时间。
     {
        MessageBox.Show("OK!");   
     }

委托:(可以在类外定义)
delegate定义一个委托。(访问修饰符,在public之后)例:public delegate void A();  public A b;
b用来保存一个没有返回值没有参数的方法,b保存了方法的地址,可以修改能被保存的类型,用来限制被b保存的方法的类型和参数。
委托的用法:在编码过程中需要暂时未完成的方法或他人写的方法时,可以定义一个委托代替需要的方法,利用委托代替空缺部分完成逻辑,在某种情况下会根据情况执行不同逻辑的时候,可以通过调用委托来实现不更改旧代码替换功能的效果。

事件:event 例:pulic delegate void A() public event A b; b += asd;  //asd为被实例化的方法
与委托类似,相当于委托的集合。(把事件中的方法删除用-=  比如b-=asd)

ps:委托也能使用+=,-=,=的方式对内容进行赋值或增减,一个委托包含多个方法时调用会执行所有方法

int? a = 100; a = null  在变量类型之后添加问号,就可以给变量附空值(只有这一种功能)

操作符的修改:
public static int operator +(AA a , int b)//只适用于应用到自身类的运算
{return a.变量+b; }//重写操作符,return处理结果 两个参数是运算符左右的值,其中必须有一个是本身的类

public static implicit operator int(AA a )  {return 1;}  把被实例化的AA显示转换为int时得到1;

函数在定义形参数组时

ref  加在形参的前面  代表传入实参的时候传入的是实参的地址,执行完更改形参的操作后实参的值会跟着一起改变

out  加在形参前  效果同ref类似,但是在函数内必须对out关键字声明的形参进行重写。并且实参传入时可以是空值。

params  加在数组形参前,实参在传入的时候不必传入数组,而是可以直接传入多个与数组类型相同的值,传入的值自动添加到数组里。

Stack 栈 泛型数组,如同List不同的是添加删除元素应用的是进站和出站的操作,最后添加的元素能够较先移除或读取出来。

Queue a <T>队列 泛型数组
a.Enqueue(i) 添加一个i在队列末尾。
a.Dequeue(i) 读取队列最开头的值并在读取后将其销毁。

Hashtable 哈西表 效果与字典完全相同
哈希表存值慢,取值快。字典存值快,取值慢。
原因:
哈希表存储的是Object类型的变量,设计到装箱操作,速度慢,取值应用神秘力量(不可知)读取速度较快,容量利用充分。字典利用泛型,存值较快,取值较慢。
哈希表适用于多线程,效率更高。
原因:
多线程情况下哈希表可以通过Dictionary进行封装,得到一个全新的哈希表,在多线程中不必进行 锁 降低运算效率。

时间复杂度:T(n)=O(f(n))判断你的代码会执行多少次(循环),一个for语句为n次,循环嵌套为n^2,二分为log2n,三分为log3n,循环后进行二分为n*log2n   循环嵌套后进行二分为n^2*log2n  以此类推。然后去掉系数和+号后的可计算次数。代替T(n)=O(f(n))中的n值。
空间复杂度:在时间复杂度的基础上计算每次循环声明了多少引用类型的变量。

扩展方法:必须为静态类和静态方法,类名无所谓,方法名为想要添加的方法名,要点为参数一是(this 添加的类名)然后这个方法就会被添加到参数类中,如果想要方带有参数则第一个参数从第二个参数开始。

 

关于线程:

using Systeam.Threading; 线程需要的包
多线程:
多线程的优点:能提高CPU的利用率,当一个线程处于等待状态的时候,CPU会执行领一个线程,提高CPU的利用率。
多线程的缺点:线程开的越多,内存占用就会越大。协调和管理代码难度会加大,需要CPU和进程时间会增多。,线程之间对资源的共享可能会出现不可预知的问题。

进程和线程的区别:一个应用程序只会运行一个进程,但是会创建多个线程,线程可以共用进程的资源。关闭了进程,也就释放了所有线程。

AA a = new AA();
Thread asd = new Thread(a.a);  创建一个新的线程,线程包括的是AA里的a方法;
asd.Start(10);  运行创建好的线程;(可以把10传入函数的objuct参数)
asd.IsBackground  线程是否为前台线程 返回bool值.
asd.Name  返回线程名字
asd.ThreadState  语句存在于的线程的运行状态
asd.Sleap(1000);在运行过程中等待1秒;
asd.Abort();结束当前线程

锁:

锁的概念:为了防止线程与线程之间共享资源的时候同时对一份共享资源读取或写入的操作。

lock(this){***********;}   锁住当前对象的贡献资源,大括号内为被锁住的语句.

lock(objuct) 不同线程的锁必须锁的参数相同,才能有互斥运行的效果。

锁的效果相当于lock在运行逻辑过程中封锁传入的参数,执行完后解锁传入的参数。当lock方法被传入的参数被锁,就会等待参数被解锁的时候才会运行锁内的逻辑,在运行完逻辑后再解锁传入的参数。

死锁:其中一个锁永远无法完成逻辑或锁被嵌套使用,导致后执行的锁中的逻辑永远无法执行。

线程池:
用法:线程池内的线程在执行完毕后并不会销毁而是暂时挂起,可以在线程池中重复执行多次同个线程节省资源开销。
ThreadPool.QueueUserWorkItem((被实例化的)函数名,参数);
为线程池里添加线程并执行,执行后将该线程挂起。
通过带入不同的参数给同一个方法就能用线程池达到不同的效果。
ThreadPool.SetMaxThreads (10,10)线程池最多能够同时运行5个线程,其他的线程会等待。(越小越能节省资源的开销)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值