C#知识点全⾯总结
了个U3D实习,把之前的笔记上传上来。
C#学习笔记
基本语法
常⽤数据类型
该初始化还是要初始化。
typeof得到数据类型,这个往往⽤于类
整型:int(Int32) ,uint ,long(int64),ulong,short,ushort
浮点数:float,double,decimal
其他: bool,string,char
常⽤转义序列(同c++):\\ , \n , \" 等等
注意事项:字符串是引⽤类型⽽其他类型都是值类型,可以通过@去包含⼀个完整字符串⽽避免转义
@"c:\"
"c:\\pro\\a.exe"
数据转换
与c++不同:向上转换是允许的,向下转换必须Convert.XXX 显⽰转换
int i=10;
double j=10;
i=(int)j //i=Convert.ToInt32(j);
注意unchecked可检查溢出
复杂数据类型
枚举
enum :{
n1=0;
…
}
enum color:int{
red,blue,yellow
}
枚举当中的数字,字符,以及其对应的值是可以相互转换的
color c=0 //表⽰是red
结构体
运输优先级
类似c++
^异或
~按位取反
default运算符 可以⽤来⽣成类型的默认值 default T 可以调⽤T的默认构造函数返回⼀个对象
类似java中的包,⼀个名称空间中可以有多个名称空间,
不同名称空间之间相互调⽤时要带上名称空间再通过引⽤符号.去使⽤其中内容。
同⼀名称空间(默认所有代码都在全局空间当中)直接通过名称引⽤
using的⽤法
1. 对于链接到项⽬的类库,使⽤using来进⾏导⼊ (using后⾯只能跟类库)
2. 可以对不同名称空间中的相同类进⾏别名定义 eg/ using timers=System.Timers(只能跟类)
3. using static 静态类名 在模块中使⽤静态类⽅法时就⽆需再导⼊静态类名了
4. 类似python当中的with(上下⽂管理器),可以隐式得释放某些资源(即调⽤Dispose函数)
分⽀循环
数组
矩形数组
[] =new [SIZE] 这⾥的SIZE必须是常量
常⽤的初始化技巧
const int size=5;
int[] arrays=new int[size]{1,2,3,4,5};
int[] arrays_2=new int[size];
int[] arrays_3={1,2,3,4,5};
多元矩形数组
[,…] name
常⽤的初始化技巧
int[,] arrays=new int[3,2]{{1,2},{3,4},{5,6}};
//其余两种同上
锯齿形数组
[][] name=new [size][] 永远只初始化第⼀个维度,接下来再⼀次初始化
int[][] a=new int[SIZE][]//如果要初始化接下来每个数组的⾏,则需要每次都new新的⾏
int[][] b={
new int[]{1,2},
new int[]{1,2,3},
....
}
这些个数值型数组如果不初始化值只声明⼤⼩,那么默认为0
锯齿形数组当中存储的是数组,⽽矩形数组当中存储的就是元素,因此foreach的类型会不同
数组常⽤的接⼝
.Length
foreach( name in arrays){…} 注意锯齿形数组和矩形数组遍历不同,使⽤foreach遍历数组中内容时是⽆法对原来的内容进⾏修改的字符串
c#当中的字符串视作为对象,也可以视作为char数组(只读的)引⽤类型
Length
Replace
Split
Trim
Contains str1.Contains(str2)
PadLeft/Right
ToLower/Upper
两个复制函数
stk1.CopyTo(stk2,i) 从第i个元素将stk1复制到stk2中,这种⽅式复制不创建新的对象
stk.Clone()返回⼀个⽤于复制的object对象
str1.CompareTo(str2)
//字符串的格式化处理
//通⽤格式为string.Format("{index:type⼩数点位数}",1,2,...)其后可以接受任意数量参数
string.Format("{0:C2}",1)//表⽰对1这个数组保留两位⼩数点,作货币格式输出
常⽤接⼝
1.控制台输⼊输出
Console.WritenLine($"{变量名称}这之外的是⼀般字符串") //其中也可以进⾏运算类似printf
Console.ReadLine();//与python类似输⼊的数据⼀定是string要进⾏转换
2.数据类型转换
Convert.ToChar(int v)//这个v必须是对应的ascall值
Convert.ToCharArray(string str)
3.Object常⽤⽅法
.ToString()返回类名类似于.GetType()
函数
基础
fun_name( par)
参数列表
可以接受任意参数的参数,需要使⽤关键字params
<type> fun(<type> name,params<ype>[] name)
void show(int bz,params int[] a)
//params的关键字必须放在函数签名的最后
C#当中默认使⽤值参数(数组除外,数组可以视为是使⽤引⽤类型的),值参数也可以赋予默认值
两种引⽤参数关键字ref(必须在函数外初始化),out(必须在函数内初始化并且丢弃原本的值)这两个关键字⽆论在函数定义还是使⽤时都要标明
C#变量作⽤域:取决于其初始化的位置⽽不取决于其声明的位置,C#中的变量在声明的时候就要进⾏初始化操作
C#中的全局数据,设置⼀个静态类,当中给出静态变量即可
重载与结构函数同其他
Main作为⼊⼝其签名为static void Main(string[] args)这个args作为命令⾏参数可以在debug选项中设置
委托
类似函数指针,关键字delegate
delegate type function(type par…) 声明后该委托变成了⼀个函数类型,所有符合该委托签名的函数都可以赋给该委托变量,往往可作函数参数,在向上转型过程中很⽅便使⽤(eg.c++ stl sort)
以排序为例,创建⼀个可以⾃定义关键字⽅法的排序
delegate bool compare(int a,int b);
static void sort(int[] arrays,compare cp)
{
int temp = 0;
int j = 0;
for (int i = 1; i < arrays.Length; i++)
{
if(!cp(arrays[i-1],arrays[i]))
{
temp = arrays[i];
for (j = i; j > 0 && !cp(arrays[j-1],temp); j--)
arrays[j] = arrays[j-1];
arrays[j] = temp;
}
}
}
static bool upper(int a,int b)=>a < b ? true : false;
static bool lower(int a, int b) => a > b ? true : false;
//这是⼀种快捷的函数表述法
delegate还可以⽤来实现匿名⽅法
delegate(type1 a,type2 b){
… 其中可以有返回值(类似js当中的function(){})
}
⾯向对象
基础
C#中的属性与字段
属性不同于字段,属性不提供对数据的直接访问需要依赖⼀定的接⼝,字段是可以直接访问的(如果设置为了public的话)
writeline输出数值变量
权限:public,private,protected,internal(内部成员,表⽰只有该项⽬可以使⽤的成员,可以与protected连⽤,同时也可以修饰类),static
⽅法(成员函数)
对象的⽣命周期
构造函数-使⽤中-析构函数(与C++类似),
调⽤构造函数是先调⽤基类构造函数从上到下依次初始化完成
调⽤析构函数后会依次向上调⽤,直⾄到Object对象的Finalize()函数
public class student{}
student std=new student();//这个括号不能省去
静态类与静态成员
静态成员为该类所有实例共享
静态构造函数(不能有访问限定符与参数)专门⽤于处理类的静态成员并且只调⽤⼀次,往往可以⽤来处理单例模式
如果有需要在⼀个类中只包含静态成员(⽐如Console)可以使⽤静态类,其只能包含静态成员,并且构造函数只能有⼀个静态构造函数,静态类是⽆法实例化的
静态函数中只能调⽤静态函数⽽不能调⽤其他成员函数
类与结构体的区别:声明结构体是值类型的⽽声明对象是引⽤类型的,两者在进⾏复制时会出现问题。引⽤类型在进⾏复制时使⽤的是浅复制,值类型则是深度复制。
深浅复制问题的解决
引⽤⽽导致浅度复制⽽产⽣的问题
public class school
{
public string name;
}
public class student
{
public school sch;
public string name;
public student()
{
sch = new school();
}
}
class Program
{
static void Main(string[] args)
{
student std1 = new student();
std1.name = "hjh";
std1.sch.name = "smu";
Console.WriteLine("修改前" + std1.name + " " + std1.sch.name);
student std2 = std1;
std2.sch.name = "fdu";
Console.WriteLine("修改后" + std1.name + " " + std1.sch.name);//修改std2却修改了std1
}
}
值类型默认深复制,引⽤类型是浅复制(ps 数组)
字段定义
public class name{
public typename name;
}
常⽤的定义字段关键字:const,static(这两个关键字均可将字段定义成只读的,静态字段只能通过类名访问),readonly(使得字段只能在构造函数中初始化赋值)
⽅法定义
常⽤的定义字段关键字:virtual,abstract(纯虚函数),override(如果要重写对象就必须⽤这个关键字),extern,sealed(这个关键字可以跟在override后⾯表⽰不能进⼀步重写)
public abstract class people{
public abstract void show();//在抽象类中只有抽象函数可以只有定义
}
public sealed class student:people
{
public override void show(){}
}
c#中的字段可以在定义时给出初始值
定义属性
相当于给了类内部private的字段提供了⼀个于外界交互的接⼝
权限 type name{
[权限] get{return ⼀个私有字段}
[权限] set{⼀个私有字段=value} value作为⼀个关键字表⽰⽤户给到的值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论