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都是一个对象,所 ...
随机推荐
- 5w5:第五周程序填空题1
描述 写一个MyString 类,使得下面程序的输出结果是: 1. abcd-efgh-abcd- 2. abcd- 3. 4. abcd-efgh- 5. efgh- 6. c 7. abcd- 8 ...
- Cocos Creator 入门
Cocos Createor 资源 略 场景 节点树 节点与组件 坐标系 脚本 组件声明,生命周期回调 var Component = cc.Class({ // 用于序列化,可省略 name: 's ...
- 最大子树和 树形dp
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- CBoard 图表布局浅析
这两天想了解下图表布局,对前端Angular不熟悉,Java也不熟悉.只能靠经验摸索查找,所以把过程简单记录,生怕忘记.首先是打开图表,发现位置指向 /config/widget, 然后用IDEA搜索 ...
- Android 数据库框架GreenDao使用
1.GreenDao3介绍 (1)基本概念 (2)GreenDao3工作原理 (3)GreenDao优点 (4)GreenDao3版本的改进 2.GreenDao3的相关配置概念介绍 (1)配置项目( ...
- 013 Android ActionFloatingButton悬浮按钮组件与Snackbar组件使用
1.导入ActionFloatingButton组件(点击下载按钮,安装组件) 2,.ImageView图片XML设置 <ImageView android:id="@+id/imag ...
- C++_语法知识点大纲
最近在学习C++的STL和泛型编程的部分,其中涉及到很多词汇.术语.在这里做一些梳理,以便有条理性地去理解泛型编程的设计理念. 整体上来讲编程主要有两种理念: 面向对象的编程——侧重点是数据: 泛型编 ...
- Docker 查看容器环境变量
#linux指令# printenv
- Olesya and Rodion (思维)
Olesya loves numbers consisting of n digits, and Rodion only likes numbers that are divisible by t. ...
- HDU 6301 (贪心+优先队列)
题目大意: 求一个长度为n的数列, 给出m个区间,这m个区间各自区间内的数不同 题解: 用优先队列来模拟过程 , 解题思路是想到了 , 可是不知道如何实现 , 果然还须继续努力呀 这道题思路是去掉重复 ...