C# this关键字的四种用法(转)
用法一 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="",Code="zs",Name="张三"},
new User{ID="",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 = ; 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 ? "" : 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关键字的四种用法
Go to below URL to find more details and example. http://blog.csdn.net/longlong821/article/details/7 ...
- 浅谈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都是一个对象,所 ...
随机推荐
- 网页的js源文件被加密解决方案
Firefox和Chrome都具有这个功能,而且位置几乎一致
- WCF进阶(一)——概述
前言 时间的朋友>里面几句特别有预见性的话来说明当今儿世界互联网发展趋势: 市场上有一种叫做"父爱算法"的需求.将会诞生很多伟大的公司.背后的精神就是六个字:你不用懂,听我的 ...
- bzoj2440完全平方数
题目链接 上来先吐槽题面!!!!!! 你跟我说$1$不是完全平方数昂? 看了半天样例啊. 活生生的半天$……$ 莫比乌斯 反演 函数容斥一下,每次二分就好 反正本宝宝不知道反演是啥. 每次判断应 ...
- [Swift]八大排序算法(四):堆排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- 16、OpenCV Python 腐蚀和彭胀
__author__ = "WSX" import cv2 as cv import numpy as np def erode_demo(image): print(image. ...
- js去重方法
function remove(array){ var obj={}; newarray=[]; for(var i in array){ console.log(i); var arg=array[ ...
- 二分答案 & 洛谷 P2678 跳石头
首先让我们先学一下二分答案这个东西... 二分答案,肯定与二分有关,还与可能是答案的东西有关... 二分答案的准确定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转 ...
- 为Arch Linux添加鼠标支持(gpm)
gpm的安装 在Arch Linux中安装gpm $ pacman -S gpm 如果你正在使用触控板,需要安装一下插件 $ pacman -S gpm xf86-input-synaptics 需要 ...
- Tomcat 配置文件的解析
转载:https://www.cnblogs.com/sunshine-1/p/8990044.html https://www.cnblogs.com/kismetv/p/7228274.html ...
- 解压与压缩(把dataset转为string、、 )
/// <summary> /// 压缩 解压 /// </summary> public class ZipHelper { #region 压缩解缩 /// <sum ...