• 复习.Net高级


    索引器:本质是封装了get,set方法,可以是只读或只写(在get或set前加上private),字符串是只读索引。

    密闭类与静态类:

    第一、密闭类是修饰为sealed的类,sealed不能有子类。String类无法被继承,因为String被声明了sealed。

    第二、声明为static的类,不能实例化,只能定义static成员。通常用它定义扩展方法。

    第三、C#3.0特性:扩展方法。声明静态类,增加一个静态方法,第一个参数是被扩展类型的标记为this,然后在其他类中可以直接调用。

     1 static void Main(string[] args)
     2 {
     3   string str = "Hello World!";
     4   str.ShowMsg(str);  
     5 }
     6 
     7 //扩展方法
     8 
     9 static class MyString
    10 {
    11   public static void ShowMsg(this string a,string msg)
    12   {
    13     Console.WriteLine(msg);
    14   }
    15 }
    给string增加一个ShowMsg()

    深拷贝、浅拷贝:

    深拷贝就是重新new一个对象,然后把之前的那个对象的属性值再重新赋值给这个用户。

     1 static void Main(string[] args)
     2 {
     3   MyCopy copy1 = new MyCopy();
     4   copy1.Name = "蛋蛋" 5   copy1.Age = 18;
     6   MyCopy copy2 = copy1;//浅拷贝
     7   Mycopy copy3 = new MyCopy();
     8   copy3.Name = copy1.Name;
     9   copy3.Age = copy1.Age;//浅拷贝
    10 }
    11 
    12 class MyCopy()
    13 {
    14   public int Name{get;set;}
    15   public int Age{get;set}
    16 }
    深拷贝、浅拷贝

    CTS,CLS,CLR

    CTS(Common Type System)通用数据类型

    CLS(Common Language Specification)通用语法规范

    CLR(Common Language Runtime)公共语言运行时

    关于相等Equals:查看判断两个对象是否是同一个对象要用object.ReferenceEquals();

    字符串暂存池:

    1 string s1 = "rupeng";
    2 string s2 = "rupeng";
    3 stirng s3 = "ru"+"peng";
    4 stirng s4 = new stirng(s1.ToCharArray());
    5 string s5 = new string(new char[]{'r','u','p','e','n','g'});
    判断字符串对象个数

    s1,s2.s3是同一个字符串对象,在内容相同的情况下只有new才能产生一个一个新的字符串对象。

    ref,out

    ref的作用是“方法内部修改外部变量的引用”

    out的作用是“方法内部给外部变量初始化,相当于一个函数多个返回值”

     1 static void Main(string[] args)
     2 {
     3   int i =1;
     4   int j = 2;
     5   int k;
     6   int result = Template(i,j,out k);
     7   Console.WriteLine(result+","+k);
     8   Console.ReadKey();
     9 }
    10 public static int Template(int i,int j,out int k)
    11 {
    12   i=i+j;
    13   j=i-j;
    14   i=i-j;
    15   k=j;
    16   return i;
    17 }
    ref,out

    委托和事件

    委托:委托是一种可以指向方法的数据类型。

    1 delegate void MyDel(int n)//声明委托的方式:delegate 返回值类型 委托类型(参数),注意这里除了delegate,剩下部分和声明一个函数一样,但是MyDel不是函数名,而是委托类型名
    2 MyDel sp = new MyDel(SayHello)//SayHello方法需要和MyDel的参数、返回值一样。简化方法MyDel sp = SayHello;

    .Net中内置了两个泛型委托Func、Action,Func是有返回值的委托,Action是没有返回值的委托。

    Action<string> ac = new Action<string>(Greeting);//没有返回值的内置委托
    ac("蛋蛋");//调用Greeting方法
    
    Func<string,string> fu = new Func<string,string>(GreetingForR);//有返回值的内置委托
    string msg = fu("建国");
    
    static string GreetingForR(string name)
    {
      return name+"你好";
    }
    static void Greeting(string name)
    {
      Console.WriteLine(name+"你好");
    }

    匿名方法

    定义语法:MyDelegate p = delegate(int s){s=10;};

    lambda表达式

     1 Action<int> a1 = delegate(int i){Console.WriteLine(i);};
     2 
     3 Action<int> a2 = (int i) =>{Console.WriteLine(i);}
     4 
     5 Action<int> a3 = (i)=>{Console.WriteLine(i);};
     6 
     7 Action<int> a4 = i=>{Console.WriteLine(i);};//只有一个参数可以省略小括号,多个参数不行
     8 
     9 Func<int,int,string>  f1=delegate(int i,int j){return "结果是"+(i+j);};
    10 
    11 Func<int,int,string> f2=(i,j)=>"结果是"+(i+j);

    事件

    事件语法:event Mydelegate mdl;

     1     delegate void MyDel();
     2     class Program
     3     {
     4 
     5         static void Main(string[] args)
     6         {
     7             person p = new person();
     8             p.QingZhu += ShowMsg;//加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。只能+=、-=!
     9             p.age = 24;
    10             Console.ReadKey();
    11         }
    12         static void ShowMsg()
    13         {
    14             Console.WriteLine("今年是你的本命年!恭喜你");
    15         }
    16     }
    17     class person
    18     {
    19         private int Age;
    20         public int age
    21         {
    22             get
    23             {
    24                 return age;
    25             }
    26             set
    27             {
    28                 if (value % 12 == 0)
    29                 {
    30                     if (QingZhu != null)
    31                     {
    32                         QingZhu();//执行事件
    33                     }
    34                 }
    35             }
    36         }
    37         public event MyDel  QingZhu;
    38     }
    案例:定一个Person类,定一个监听年龄变化的事件,当本命年的时候祝贺一下。触发事件的地方要判断一下是不是事件null

    委托和事件的总结

    委托的作用:占位,在不知道要执行的方法的具体代码时,可以先用一个委托变量来替代方法调用。在实际调用之前,需要为委托赋值,否则为null。

    事件的作用:作用与委托变量一样,只是功能上有更多限制。

    二者关系:事件由一个私有的委托变量和add_***和remove_***方法组成

    反射

    获取类信息对象Type

    从对象获取:Type type = person.getType();

    从类名获取:Type type = typeof(Person);

    从全类名(命名空间+类名)获取:Type type = Type.GetType("命名空间.类名");

    使用情况:如果有一个对象,就用getType()获取,如果没有对象就用typeof;如果要运行通过配置文件拿到的字符串来获得就用Type.GetType("***");

    序列化

    BinaryFormatter类有两个方法:

    void Serialize(Stream stream, object pbj)

    对象obj序列化到Stream中

    object Deserialize(Stream stream)

    将对象从stream中反序列化,返回值为反序列化得到的对象

    对象序列化的一些注意事项

    要序列化的类型必须标记为:[Serializable]

    该类型的父类也必须标记为: [Serializable]

    该类型中的所有成员的类型也必须标记为: [Serializable]

    序列化只会对类中的字段序列化,(只能序列化一些状态信息)

    类结构修改后之前序列化的内容尽量不要用了,否则可能会出错

  • 相关阅读:
    UI设计规范收藏
    糙米 米糠 麸皮
    AMF学习1数据类型
    一犯人在执行死刑前三天供出祖传治癌奇方(转)
    应用程序加密1模拟线上加密商店
    扔猫
    [转]由八字五行旺衰看相貌美丑
    seoo
    十天学会单片机和C语言编程
    潜阳封髓
  • 原文地址:https://www.cnblogs.com/HuShaoyi/p/8436818.html
Copyright © 2020-2023  润新知