c# this關(guān)鍵字用法代碼詳解
用法1 為原始類型擴(kuò)展方法
先說一下,this 后面跟的類型,就是要拓展方法的類型。注意要寫在靜態(tài)類中的靜態(tài)方法,不然有些情況下訪問
/// <summary> /// 擴(kuò)展類 用于為原始類擴(kuò)展方法 /// </summary> public static class AM_Extends { /// <summary> /// 為string類擴(kuò)展了一個child方法,實(shí)現(xiàn)某功能 /// </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; } } 定義擴(kuò)展方法
private void Form1_Load(object sender, EventArgs e) { string st1 = "123"; string st2 = ""; string st3 = ""; st3 = st2.Child(st1);//st3的值為“123” } 調(diào)用實(shí)例
用法2 this代表當(dāng)前類的實(shí)例對象
用法3 用this串聯(lián)構(gòu)造函數(shù)
public class Test { public Test() { Console.WriteLine("無參構(gòu)造函數(shù)"); } // this()對應(yīng)無參構(gòu)造方法Test() // 先執(zhí)行Test(),后執(zhí)行Test(string text) public Test(string text) : this() { Console.WriteLine(text); Console.WriteLine("有參構(gòu)造函數(shù)"); } }
用法4 索引器(基于索引器封裝EPList,用于優(yōu)化大數(shù)據(jù)下頻發(fā)的Linq查詢引發(fā)的程序性能問題,通過索引從list集合中查詢數(shù)據(jù))
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace MyDemo.Web { /// <summary> /// EPList 支持為List創(chuàng)建索引 /// </summary> /// <typeparam name="T">類型</typeparam> public class EPList<T> { #region 成員變量 /// <summary> /// 索引 /// </summary> private List<string[]> m_Index = new List<string[]>(); /// <summary> /// 緩存數(shù)據(jù) /// </summary> private Dictionary<string, List<T>> m_CachedData = new Dictionary<string, List<T>>(); /// <summary> /// List數(shù)據(jù)源 /// </summary> private List<T> m_ListData = new List<T>(); /// <summary> /// 通過索引值取數(shù)據(jù) /// </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> /// 創(chuàng)建索引 /// </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 } } 創(chuàng)建EPList
給EPList創(chuàng)建索引,并添加數(shù)據(jù)
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創(chuàng)建索引,并添加數(shù)據(jù)
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創(chuàng)建索引,并添加數(shù)據(jù)
/// <summary> /// 獲取子節(jié)點(diǎn) /// </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字段上創(chuàng)建了索引,所以這里就可以通過索引值直接取出下一層子節(jié)點(diǎn)數(shù)據(jù),避免Linq查詢引發(fā)的效率問題 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); } 通過索引高效查詢數(shù)據(jù)
以上就是小編整理的全部相關(guān)知識點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對腳本之家的支持。
相關(guān)文章
C#中神器類BlockingCollection的實(shí)現(xiàn)詳解
如果你想玩轉(zhuǎn)C#?里面多線程,工廠模式,生產(chǎn)者/消費(fèi)者,隊(duì)列等高級操作,就可以和我一起探索這個強(qiáng)大的線程安全提供阻塞和限制功能的C#神器類BlockingCollection吧2023-02-02C#實(shí)現(xiàn)windows form限制文本框輸入的方法
這篇文章主要介紹了C#實(shí)現(xiàn)windows form限制文本框輸入的方法,涉及C#限制文本框輸入的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04關(guān)于Unity中RectTransform與transform的區(qū)別
這篇文章主要介紹了Unity中RectTransform與transform的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二 線性結(jié)構(gòu)
本文中,我們討論了什么是線性結(jié)構(gòu),線性結(jié)構(gòu)有哪些特點(diǎn),并且詳細(xì)介紹了一個最簡單線性結(jié)構(gòu)順序表,并且通過源代碼對她進(jìn)行一些列的分析,最后還舉了兩個例子,讓我們更好的理解順序表2012-11-11C#實(shí)現(xiàn)泛型動態(tài)循環(huán)數(shù)組隊(duì)列的方法
隊(duì)列一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),本文通過實(shí)例代碼給大家介紹下C#實(shí)現(xiàn)泛型動態(tài)循環(huán)數(shù)組隊(duì)列的方法,感興趣的朋友一起看看吧2022-01-01C# Environment.CurrentDirectory 靜態(tài)屬性的實(shí)現(xiàn)
本文主要介紹了C# Environment.CurrentDirectory 靜態(tài)屬性的實(shí)現(xiàn),它返回當(dāng)前應(yīng)用程序的工作目錄路徑,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02