C#基础知识
【C#基础知识】
1.class类
定义:类是实现面向对象的基石
[附加声明] [修饰符] class 类名称 [:【基类 】[ , 接口序列] ] //interface可以继承多个用逗号隔开
{ //基类与类的关系是“父子关系”
[ 字段声明 ]
[ 构造函数 ]
[ 方法 ]
[ 事件 ]
}
2.构造函数---<#代表可选>
定义:一个类中最少有一个构造函数(没有系统会自动提供);不包含返回值;总是与类同名;
用于对象初始化;默认是public ,假如用 private修饰将不能初始化,一般用于静态类。
[ 修饰符] 类名称 ( #[类型] 变量名 ) { } // public Myclass ( string name ){ } 默认是不带参数,自己重写的时候可以添加。
Myclass mc = new Myclass() // 要调用类中的成员,new的就是构造函数。
3.数据类型
3.1 整型,浮点型,布尔型,字符类型,字符串类型
dynamic s = ?Type(编译时识别类型)
3.2常量与变量
【常量】const : 声明时赋值、赋值后不可变
readonly : ”只读常量“ 程序运行期间只能初始化一次 。加static 修饰等同与const
public readonly int a = 3;
public readonly int b ; public Main(){ b = “aaa” ; } //初始化赋值,初始化后不可变
【变量】public static int x //静态变量
int y //实例变量
void Func( int[ ] arr , int a, ref int b, out int c ){ } //数组元素、参数值,引用参数、输出参数
【匿名类型的变量】
Class MyClass {
public string name { get; set; } public int age{ get; set; }
}
MyClass mc = new MyClass(); //其他类调用赋值
mc.name="壮士" ; mc.age=18;
使用匿名类型来实现只要一句: var mc = new { name="张三",age=18 }; //编译器判断赋值的类型
3.3数组
//一维数组,C#提供快速排序静态方法。升序 Array.Sort(book); Array.Reverse(book);
string[ ] book= { "C#","Java","C++","PHP" }; //查找 book.contains("C#");
Int [ ,] stud= new Int [2,3] { {1,2,3},{4,5,6} } //二维数组
3.4泛型集合
//双向链接列表可以在集合的两头添加数据,或者在指定位置的后面添加
LinkedList<T> ll= new LinkedList<T>( book ) //有方法: AddFrist、AddLast、AddAfter
LinkedListNode<T> current = ll.Find("b") //找到指定的链表节点
ll.AddAfater(current," 在b后面添加")
知识扩展: 方法---<ref 传递引用 与 out 传递值>
[修饰符] [附加声明] [返回类型] [方法名称] ( # [类型] 变量名) { }
//[附加声明] 可以是--> 基类: virtual 扩展类:override ; static 静态类
方法中的参数传递
<a>. 参数类型 参数名 // public void GetAge( int a ){ a++; } a分配了内存空间,值的变动只在分配中变动。
<b>. ref 参数类型 参数名 // public void GetAge( ref int a) {a++}// ref a是引用类型地址,所有没有分配内存。
// public void GetAge( out int a,out int b) {a=10 ; b=100} //return 只能返回一个结果,用out可以返回多个结果 引用参数是用来输出的,且调用该参数不用初始化。
<c>. out 参数类型 参数名
例1:Myclass类中有 GetAge方法
int old= 10;
mc .GetAge(old)//调用方法 ref old out old
console.WriteLine(old)//<a>普通参数传递,调用后还是10; <b>把引用地址传入,调用后自然是11
例2:Myclass类中有 GetAge方法
int old,young; //参数不用初始化
mc .GetAge(out old ,out young) //调用方法 ref old out old
console.WriteLine(old+"与"+young) //<c>返回方法固定的值 10 ,100
4.static静态修饰符
1.可以修饰类、字段、属性、方法
2.标记为static的对象就不要实例话,直接调用。//className.fun()
3.定义的静态类不可以被new,劝包括静态成员,不能被继承,只能是静态构造函数。
5.[委托5步曲]
两种用途: 其一CallBack回调机制,其二是事件处理
1步.定义方法:
public static string Func(string name)
{
return "我是方法"+name
}
2步: 准备委托类型
delegate <返回类型> 方法名(<函数参数>)
例 :public delegate void method( int number);//没有返回值
public delegate string MyDelegate();//string返回类型
委托也相当与一个类,把方法做为参数传给方法
3步:定义委托变量
MyDelegate myDele;
4步:授权方法[定义好的方法],想要那个方法给那个方法;
模型:<委托类型> <实例化名称> =<注册函数>
简化:myDele=Func;
5步:调用方法;
myDele("名字"); //传name参数进去
5.1【委托种类】:[不带参数委托],[带参数委托],[多播委托]
自定义的委托都继承自基类System.Delegate,在这个类中,定义了大部分委托的特性。
多播委托:在1步时:定义一个类里面装多个放,然后迭代每一个方法,以最后一个方法输出。
在4步时一次授权:
myDele=Func ;myDele += Fun1;myDele += Fun2;..........
链式委托也被称为“多播委托”,其本质是一个由多个委托组成的链表。回顾上面1.2中的类结构,System.MulticastDelegate类便是为链式委托而设计的。当两个及以上的委托被链接到一个委托链时,调用头部的委托将导致该链上的所有委托方法都被执行。
链上委托方法执行循序可以改变吗?GetInvocationList()方法
// 申明委托并绑定第一个方法 TestMulticastDelegate tmd = new TestMulticastDelegate(PrintMessage1); // 绑定第二个方法 tmd += new TestMulticastDelegate(PrintMessage2); // 绑定第三个方法 tmd += new TestMulticastDelegate(PrintMessage3); // 获取所有委托方法Delegate[] dels = tmd.GetInvocationList();
多播委托带有返回值时,只得到了最后一个方法的返回值。
解决方法还是用上面的GetInvocationList()方法,读取出来进行遍历
GetStringDelegate myDelegate1 = GetDateTimeString; myDelegate1 += GetTypeNameString; myDelegate1 += GetSelfDefinedString; foreach (var del in myDelegate1.GetInvocationList()) { Console.WriteLine(del.DynamicInvoke()); }
【字符集处理】
windows下支持:ANSI(中国GBK) ,unicode,unincode big endin ,utf-8
使用:编码解析(gb2312)十进制
Encoding.default//默认编码就是ANSI
两个方法:Encoding.GetEncoding();//返回Encoding对象
Encoding.GetEncodings(); //返回EncodingInfo[] 对象
【FileStream 文件流】 将文件以字节的方式进行读取
构造方法: new FileStream( filePath ,FileMode. 属性,FileAccess.属性 );
【string类型转Byte[]字节】
string str="大王加我来巡山!";
Byte[] byteArrary= System.Encoding.Text.Default.GetBytes(str);
//default可以设置其他编码规则
string strEncod= System.Encoding.Text.Default.GetString(byteArrary);
6.【泛型】
优势1:性能 //arryList()集合添加 int 1=44 进行装箱给值的时候 int a=(int)list[0] 进行拆箱,性能低。
优势2:类型安全 //list<int> 只能添加int类型 list<MyClass> 只能添加MyClass类
6.1【泛型约束】
public class List<T> { } // T作为泛型类的名称
public class BaseDal<T> where T:class { .................................}

浙公网安备 33010602011771号