c# this關鍵字用法程式碼詳解
阿新 • • 發佈:2020-02-15
用法1 為原始型別擴充套件方法
先說一下,this 後面跟的型別,就是要拓展方法的型別。注意要寫在靜態類中的靜態方法,不然有些情況下訪問
/// <summary> /// 擴充套件類 用於為原始類擴充套件方法 /// </summary> public static class AM_Extends { /// <summary> /// 為string類擴充套件了一個child方法,實現某功能 /// </summary> /// <param name="str"></param> /// <param name="new_str"></param> public static void Child( this string str,string new_str) { object obj = str; str=new_str; } } 定義擴充套件方法
private void Form1_Load(object sender,EventArgs e) { string st1 = "123"; string st2 = ""; string st3 = ""; st3 = st2.Child(st1);//st3的值為“123” } 呼叫例項
用法2 this代表當前類的例項物件
用法3 用this串聯建構函式
public class Test { public Test() { Console.WriteLine("無參建構函式"); } // this()對應無參構造方法Test() // 先執行Test(),後執行Test(string text) public Test(string text) : this() { Console.WriteLine(text); Console.WriteLine("有參建構函式"); } }
用法4 索引器(基於索引器封裝EPList,用於優化大資料下頻發的Linq查詢引發的程式效能問題,通過索引從list集合中查詢資料)
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace MyDemo.Web { /// <summary> /// EPList 支援為List建立索引 /// </summary> /// <typeparam name="T">型別</typeparam> public class EPList<T> { #region 成員變數 /// <summary> /// 索引 /// </summary> private List<string[]> m_Index = new List<string[]>(); /// <summary> /// 快取資料 /// </summary> private Dictionary<string,List<T>> m_CachedData = new Dictionary<string,List<T>>(); /// <summary> /// List資料來源 /// </summary> private List<T> m_ListData = new List<T>(); /// <summary> /// 通過索引值取資料 /// </summary> /// <param name="indexFields">索引欄位</param> /// <param name="fieldValues">欄位值</param> /// <returns></returns> public List<T> this[string[] indexFields] { get { string key = string.Join(",",indexFields); if (m_CachedData.ContainsKey(key)) return m_CachedData[key]; return new List<T>(); } } #endregion #region 公共方法 /// <summary> /// 建立索引 /// </summary> /// <param name="indexFields">索引欄位</param> public void CreateIndex(string[] indexFields) { if (m_Index.Contains(indexFields)) return; m_Index.Add(indexFields); } /// <summary> /// 新增 /// </summary> /// <param name="record">記錄</param> public void Add(T record) { m_ListData.Add(record); m_Index.ForEach(indexFields => { string key = getKey(record,indexFields); if (m_CachedData.ContainsKey(key)) { m_CachedData[key].Add(record); } else { List<T> list = new List<T> { record }; m_CachedData.Add(key,list); } }); } #endregion #region 私有方法 /// <summary> /// 獲取值 /// </summary> /// <param name="record">記錄</param> /// <param name="fieldName">欄位名</param> /// <returns></returns> private object getValue(T record,string fieldName) { Type type = typeof(T); PropertyInfo propertyInfo = type.GetProperty(fieldName); return propertyInfo.GetValue(record,null); } /// <summary> /// 獲取Key /// </summary> /// <param name="record">記錄</param> /// <param name="indexFields">索引欄位</param> private string getKey(T record,string[] indexFields) { List<string> values = new List<string>(); foreach (var field in indexFields) { string value = Convert.ToString(getValue(record,field)); values.Add(field + ":" + value); } return string.Join(",values); } /// <summary> /// 獲取Key /// </summary> /// <param name="indexFields">索引欄位</param> /// <param name="fieldValues">欄位值</param> /// <returns></returns> private string getKey(string[] indexFields,object[] fieldValues) { if (indexFields.Length != fieldValues.Length) return string.Empty; for (int i = 0; i < indexFields.Length; i++) { fieldValues[i] = indexFields[i] + ":" + fieldValues[i]; } string key = string.Join(",fieldValues); return key; } #endregion } } 建立EPList
給EPList建立索引,並新增資料
private EPList<SysDepartInfo> GetEPListData() { EPList<SysDepartInfo> eplist = new EPList<SysDepartInfo>(); eplist.CreateIndex(new string[] { "ParentId" }); string sql = "select Id,ParentId,Code,Name from SysDepart"; SqlHelper.ExecuteReader(sql,null,(reader) => { SysDepartInfo record = new SysDepartInfo(); record.Id = Convert.ToString(reader["Id"]); record.ParentId = Convert.ToString(reader["ParentId"]); record.Code = Convert.ToString(reader["Code"]); record.Name = Convert.ToString(reader["Name"]); eplist.Add(record); }); return eplist; } 給EPList建立索引,並新增資料
private EPList<SysDepartInfo> GetEPListData() { EPList<SysDepartInfo> eplist = new EPList<SysDepartInfo>(); eplist.CreateIndex(new string[] { "ParentId" }); string sql = "select Id,Name from SysDepart"; SqlHelper.ExecuteReader(sql,(reader) => { SysDepartInfo record = new SysDepartInfo(); record.Id = Convert.ToString(reader["Id"]); record.ParentId = Convert.ToString(reader["ParentId"]); record.Code = Convert.ToString(reader["Code"]); record.Name = Convert.ToString(reader["Name"]); eplist.Add(record); }); return eplist; }
給EPList建立索引,並新增資料
/// <summary> /// 獲取子節點 /// </summary> /// <param name="data"></param> /// <param name="parentId"></param> private IEnumerable<TreeInfo> CreateChildren(EPList<SysDepartInfo> data,TreeInfo node) { string id = node == null ? "0" : node.id; List<TreeInfo> childNodes = new List<TreeInfo>(); // ParentId欄位上建立了索引,所以這裡就可以通過索引值直接取出下一層子節點資料,避免Linq查詢引發的效率問題 var indexValues = new string[] { "ParentId:" + id }; var childData = data[indexValues]; childData.ForEach(record => { var childNode = new TreeInfo { id = record.Id,text = record.Code + " " + record.Name }; childNodes.Add(childNode); childNode.children = CreateChildren(data,childNode); }); return childNodes.OrderBy(record => record.text); } 通過索引高效查詢資料
以上就是小編整理的全部相關知識點內容,感謝大家的學習和對我們的支援。