C# this关键字的四种用法
Go to below URL to find more details and example.
http://blog.csdn.net/longlong821/article/details/7097666
用法一 this代表当前类的实例对象

- namespace Demo
- {
- public class Test
- {
- private string scope = "全局变量";
- public string getResult()
- {
- string scope = "局部变量";
- // this代表Test的实例对象
- // 所以this.scope对应的是全局变量
- // scope对应的是getResult方法内的局部变量
- return this.scope + "-" + scope;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- Test test = new Test();
- Console.WriteLine(test.getResult());
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- finally
- {
- Console.ReadLine();
- }
- }
- }
- }

用法二 用this串联构造函数

- namespace Demo
- {
- public class Test
- {
- public Test()
- {
- Console.WriteLine("无参构造函数");
- }
- // this()对应无参构造方法Test()
- // 先执行Test(),后执行Test(string text)
- public Test(string text) : this()
- {
- Console.WriteLine(text);
- Console.WriteLine("有参构造函数");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- Test test = new Test("张三");
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- finally
- {
- Console.ReadLine();
- }
- }
- }
- }

用法三 为原始类型扩展方法

- namespace Demo
- {
- public static class Extends
- {
- // string类型扩展ToJson方法
- public static object ToJson(this string Json)
- {
- return Json == null ? null : JsonConvert.DeserializeObject(Json);
- }
- // object类型扩展ToJson方法
- public static string ToJson(this object obj)
- {
- var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
- return JsonConvert.SerializeObject(obj, timeConverter);
- }
- public static string ToJson(this object obj, string datetimeformats)
- {
- var timeConverter = new IsoDateTimeConverter { DateTimeFormat = datetimeformats };
- return JsonConvert.SerializeObject(obj, timeConverter);
- }
- public static T ToObject<T>(this string Json)
- {
- return Json == null ? default(T) : JsonConvert.DeserializeObject<T>(Json);
- }
- public static List<T> ToList<T>(this string Json)
- {
- return Json == null ? null : JsonConvert.DeserializeObject<List<T>>(Json);
- }
- public static DataTable ToTable(this string Json)
- {
- return Json == null ? null : JsonConvert.DeserializeObject<DataTable>(Json);
- }
- public static JObject ToJObject(this string Json)
- {
- return Json == null ? JObject.Parse("{}") : JObject.Parse(Json.Replace(" ", ""));
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- List<User> users = new List<User>{
- new User{ID="1",Code="zs",Name="张三"},
- new User{ID="2",Code="ls",Name="李四"}
- };
- // list转化json字符串
- string json = users.ToJson();
- // string转化List
- users = json.ToList<User>();
- // string转化DataTable
- DataTable dt = json.ToTable();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- finally
- {
- Console.ReadLine();
- }
- }
- }
- public class User
- {
- public string ID { get; set; }
- public string Code { get; set; }
- public string Name { get; set; }
- }
- }

用法四 索引器(基于索引器封装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创建索引,并添加数据

- 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;
- }

通过索引高效查询数据

- /// <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);
- }

C# this关键字的四种用法的更多相关文章
- 【转载】java static 关键字的四种用法
原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...
- [java]static关键字的四种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...
- C# this关键字的四种用法(转)
用法一 this代表当前类的实例对象 namespace Demo { public class Test { private string scope = "全局变量"; pu ...
- 浅谈static关键字的四种用法
1.修饰成员变量 在一个person类中,一个成员变量例如 String name,当new2个person()对象时候,这2个对象在堆的位置是不同的,给name赋值张三.李四,这两个对象的name是 ...
- C#中 this关键字 四种用法
/// <summary> /// 主程序入口 /// </summary> /// <param name="args"></param ...
- 【转载】java final 关键字的几种用法
原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...
- [java]final关键字的几种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...
- final关键字的几种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...
- javascript中this的四种用法
javascript中this的四种用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-05-11我要评论 在javascript当中每一个function都是一个对象,所 ...
随机推荐
- hadoop distcp 命令使用指导
1.概述 DistCp(distributed copy)是一款被用于大型集群间/集群内的复制工具. 它使用MapReduce来实现其分布,错误处理和恢复以及报告.它将文件列表和目录扩展为map任务的 ...
- Singleton多种实现方式的在多线程情况下的优缺点
一.饿汉式 缺点:不能懒加载 // 不能懒加载 public class SingletonObject1 { private static final SingletonObject1 instan ...
- ie6下固定位置的实现
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- webp图片技术调研最终结论(完全真实数据可自行分析)
关于webp图片格式调研及测试 资料收集 什么是 WebP? WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩 ...
- SpringMVC 监听文件上传进度
Spring MVC 监听文件上传进度 具体实现分三个步骤: 接管CommonsMultipartResolver,重写针对文件上传的请求. 在第一步中写入监听,以获取上传进度. 修改上传部分的配置文 ...
- Nginx下配置SSL模块,支持https
Http与Https的区别 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效 ...
- Day062--django--模板,母版和继承
1.MVC和MTV MVC C Controller : 逻辑的控制 M Model : 存取数据 V View : 信息的展示 MTV M : model ORM操作 T: Template 模板 ...
- Vue-router(基础)_滚动行为和history模式
一.前言 1.滚动事件 2.h5 history模式 二.主要内容 1. (1)使用前度路由,当切换到新路由时,想要页面滚动到顶部,或者是保持原先滚动的位置,就像重新加载页面那样.vue-rout ...
- 虚拟机中使用centos7搭建ftp服务器
应用场景 本地windows作为客户端,虚拟机CentOS7作为服务器端,搭建FTP服务器,本地访问虚拟机实现文件的上传下载.如何在虚拟机安装centos7就不在赘述. 1.在centos7上安装vs ...
- easyUI文本框获得焦点,失去焦点
easyUI帮助文档对于文本框的操作没有提供直接获得焦点,或者失去焦点的方法,我们可以采用以下写法来实现. 获得焦点: $('input',$('#文本框Id').next('span')).focu ...