中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET Framework基礎知識(四)

發布時間:2020-06-18 21:32:44 來源:網絡 閱讀:497 作者:大懶丫頭 欄目:編程語言

1、反射:是編程的讀取與類型相關聯的元數據的行為。通過讀取元數據,可以了解它是什么類型以及類型的成員。比如類中的屬性,方法,事件等。所屬命名空間System.Reflection。
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Day1401
{
    class Program
    {
        static void Main(string[] args)
        {
        }
        public Program()
        {
            Console.WriteLine("無參構造函數!");
        }
        public Program(int i)
        {
            Console.WriteLine("有參構造函數!"+i);
        }
        public void method()
        {
            Console.WriteLine("方法!");
        }
        string str="bbb";
        public string Str
        {
            get
            {
                return str;
            }
            set
            {
                str = value;
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace Day1402
{
    class Program
    {
        static void Main(string[] args)
        {
            //反射方法、無參構造函數
            Assembly con1 = Assembly.LoadFrom(@"E:\我的項目\Day1401\Day1401\bin\Debug\Day1401.exe");
            object obj = con1.CreateInstance("Day1401.Program");
            MethodInfo mi = obj.GetType().GetMethod("method");
            mi.Invoke(obj, null);

            //反射字段
            FieldInfo fi = obj.GetType().GetField("str", BindingFlags.NonPublic | BindingFlags.Instance);
            Console.WriteLine(fi.GetValue(obj));

            //反射屬性
            PropertyInfo pi = obj.GetType().GetProperty("Str");
            pi.SetValue(obj, "aaa", null);
            Console.WriteLine(pi.GetValue(obj, null));

           
            //反射有參構造函數
            Type[] t1 = new Type[] { typeof(int)};
            ConstructorInfo ci= obj.GetType().GetConstructor(t1);
            object[] o = new object[] { 66};
            ci.Invoke(o);

            //反射成員類型
            Type type = typeof(Program);
            MemberInfo[] MI = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
            foreach (MemberInfo memb in MI)
            {
                Console.WriteLine("名稱:{0},類型{1}", memb.Name, memb.MemberType.ToString());
            }
        }
    }
}
2、屬性Attribute:這里的屬性并非類的成員,它提供功能強大的方法以將聲明信息與C#代碼(類型、方法、屬性)相關聯。屬性與程序實體關聯后,即可在運行時使用名為“反射”的技術查詢屬性。
屬性出現的形式有兩種:一種是在公共語言運行庫中定義的屬性,另一種是可以創建的用于向代碼中添加附加信息的自定義屬性。
屬性的特點:1)屬性可向程序中添加元數據  2)程序可以使用反射檢查自己的元數據  3)通常使用屬性與com交互。
3、自定義屬性
語法:[attributeClass(定位參數|,...命名參數|,...)]
定位參數和相應特征類的實例構造器緊密相關——構造器提供了什么樣的參數構造方式,位置參數就對應什么樣的形式。位置參數不可省略,但如果特征類提供了無參數的構造器,那就另當別論。
命名參數對應著特征類的實例公有域或實例屬性,但它在實例化的時候并非必須,可以省略。
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Day1404
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (object o in typeof(Zhu).GetCustomAttributes(true))
            {
                ShiziAttribute shizi = o as ShiziAttribute;
                Console.WriteLine(shizi.Name);
            }
        }
    }
    [AttributeUsage(AttributeTargets.Class,AllowMultiple=true,Inherited=true)]
    class ShiziAttribute : Attribute
    {
        string name;
        double size;
        public string Name
        {
            get
            {
                return name;
            }
        }
        public double Size
        {
            get
            {
                return size;
            }
            set
            {
                size = value;
            }
        }
        public ShiziAttribute(string name)
        {
            this.name = name;
        }
    }
    [Shizi("老二",Size=0.9)]
    [Shizi("老大",Size=1.0)]
    class Zhu
    { }
}
4、序列化:是將對象狀態轉換為可保存或傳輸的形式的過程。序列化的補集是反序列化,后者將流轉換為對象。這兩個過程一起保證數據易于存儲和傳輸。
5、.NET Framework 提供了兩個序列化技術:
(1)二進制序列化保持類型保真,這對于多次調用應用程序時保持對象狀態非常有用。例如,通過將對象序列化到剪貼板,可在不同的應用程序之間共享對象。您可以將對象序列化到流、磁盤、內存和網絡等。遠程處理使用序列化,“按值”在計算機或應用程序域之間傳遞對象。
(2)XML 序列化只序列化公共屬性和字段,并且不保持類型保真。當您希望提供或使用數據而不限制使用該數據的應用程序時,這一點非常有用。由于 XML 是開放式的標準,因此它對于通過 Web 共享數據來說是一個理想選擇。SOAP 同樣是開放式的標準,這使它也成為一個理想選擇。
6、二進制序列化:可以將序列化定義為一個將對象狀態存儲到存儲介質的過程。在這個過程中對象的公共字段和私有字段以及類的名稱,將轉換成字節流,而字節流接著將寫入數據流。
7、二進制序列化需要的命名空間
  using System.Runtime.Serialization;
  using System.Runtime.Serialization.Formatters.Binary;
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace Day1407
{
    [Serializable]
    public class Person
    {
        List<Person> list = new List<Person>();
        public List<Person> List
        {
            get{return list;}
            set { list = value; }
        }
        public int age;
        public string name;
        public bool Sex
        {
            get;
            set;
        }
    }
  
    class Program
    {
        static void Main(string[] args)
        {
            Person perp = new Person();
            Person per1 = new Person();
            per1.age = 18;
            per1.name = "XiaoHui";
            per1.Sex = false;
            perp.List.Add(per1);
            Person per2 = new Person();
            per2.age = 20;
            per2.name = "ChenHui";
            per2.Sex = true;
            perp.List.Add(per2);
            IFormatter formatter = new BinaryFormatter();

            //序列化
            Stream stream = new FileStream("F:/Myfile.bin", FileMode.Create, FileAccess.Write);
            formatter.Serialize(stream,perp);
            stream.Close();

            //反序列化
            Stream stream1 = new FileStream("F:/MyFile.bin", FileMode.Open, FileAccess.Read);
            Person per = formatter.Deserialize(stream1) as Person;
            foreach (Person p in per.List)
            {
                Console.WriteLine(p.name+"  "+p.age+"  "+p.Sex);
            }
           
            stream1.Close();
        }
    }
}
8、選擇序列化:可以在要序列化的類前面加[Serializable]
例:[Serializable]
    public class Person
    {       
       [NonSerialized]
        public  int age;
        public bool Sex
        {  get;  set;  }
    }
 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鸡东县| 郎溪县| 汾阳市| 陆川县| 都兰县| 贞丰县| 星子县| 连南| 新宁县| 平顺县| 祁东县| 石河子市| 龙南县| 雷山县| 米脂县| 永清县| 阿鲁科尔沁旗| 拉萨市| 伊金霍洛旗| 襄城县| 道孚县| 雷州市| 雷波县| 松潘县| 嘉鱼县| 衡阳市| 密山市| 财经| 井研县| 厦门市| 江达县| 肇州县| 南部县| 牡丹江市| 平罗县| 赣榆县| 城步| 陵水| 汉阴县| 阳高县| 柘荣县|