<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[aoding8407的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/aoding8407</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; aoding8407]]></copyright><item><title><![CDATA[c# -- 对象销毁和垃圾回收]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405053</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405053</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:29 +0800</pubDate><description><![CDATA[有些对象需要显示地销毁代码来释放资源，比如打开的文件资源，锁，操作系统句柄和非托管对象。在.NET中，这就是所谓的对象销毁，它通过IDisposal接口来实现。不再使用的对象所占用的内存管理，必须在某个时候回收；这个被称为无用单元收集的功能由CLR执行。 对象销毁和垃圾回收的区别在于：对象销毁通常是明确的策动；而垃圾回收完全是自动地。换句话说，程序员负责释放文件句柄，锁，以及操作系统资源...]]></description><category></category></item><item><title><![CDATA[C#集合 -- 自定义集合与代理]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405052</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405052</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:28 +0800</pubDate><description><![CDATA[前面章节所讨论的集合都可以直接实例化，因此我们可以非常方便地使用这些集合类。但是如果你试图在集合添加或移除元素时添加控制，它们就不适用了。对于强类型集合，在某些情况下，你需要添加这样的控制：  添加或移除元素时，触发事件 更新由于添加或移除元素对应的属性 识别添加或删除元素的误操作并抛出异常 .NET Framework为上述目的提供了集合类，它们位于System.Collections...]]></description><category></category></item><item><title><![CDATA[C#集合 -- Equality和Order插件]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405051</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405051</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:27 +0800</pubDate><description><![CDATA[在前面的文章C#相等性比较和C#排序比较中，我已经叙述了类型相等，类型哈希，和类型比较的.NET标准协议。实现了这些协议的类型在一个字典或者列表中也可以正常工作。但是需要注意的是：  只有当类型的Equals方法和GetHashCode方法返回有意义的结果时，该类型才可以作为Dictionary或Hashtable的键 只有当类型实现了IComparable/IComparable&lt...]]></description><category></category></item><item><title><![CDATA[C#集合--Dictionary]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405050</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405050</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:26 +0800</pubDate><description><![CDATA[字典(dictionary)是一个集合，其中每个元素都是一个键/值对。字典(Dictionaries)是常用于查找和排序的列表。 .NET Framework通过IDictionary接口和IDictionary&lt;TKey,TValue&gt;接口，以及一些常用的子典了定义了子典协议。每个类在以下方面各有不同：  元素是否已经排序  元素是否能通过索引或键来获取  字典类是gene...]]></description><category></category></item><item><title><![CDATA[C#集合 -- Lists，Queues， Stacks 和 Sets]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405049</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405049</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:25 +0800</pubDate><description><![CDATA[List&lt;T&gt;和ArrayList Generic的List和非Generic的ArrayList类支持可变化大小的对象数组，它们也是最常见的集合类。ArrayList实现了IList接口，而List&lt;T&gt;实现了IList&lt;T&gt;和IList接口（以及新增的IReadonlyList&lt;T&gt;）。与数组不同，所有的接口实现都是公开的，并且Add和...]]></description><category></category></item><item><title><![CDATA[C#集合--ICollection接口和IList接口]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405048</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405048</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:24 +0800</pubDate><description><![CDATA[虽然列举接口提供了一个协议，用于向前的方式遍历集合，但它们没有提供一种机制来确定集合的大小，通过索引访问集合的成员，搜索集合，或修改集合。为了实现这些功能，.NET Framework定义了ICollection，IList和IDictionary接口。每个接口都有Generic的接口和非Generic的接口，请注意非Generic多数用于支持遗留代码。 这些接口的继承挂关系如下图所示：...]]></description><category></category></item><item><title><![CDATA[C#集合--数组]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405047</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405047</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:24 +0800</pubDate><description><![CDATA[Array类是所有一维和多维数组的隐式基类，同时也是实现标准集合接口的最基本的类型。Array类实现了类型统一，因此它为所有数组提供了一组通用的方法，不论这些数组元素的类型，这些通用的方法均适用。 正因为数组如此重要，所以C#为声明数组和初始化数组提供了明确的语法。在使用C#语法声明一个数组时，CLR隐式地构建Array类--合成一个伪类型以匹配数组的维数和数组元素的类型。而且这个伪类型...]]></description><category></category></item><item><title><![CDATA[C#集合-列举（Enumeration）]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405046</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405046</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:22 +0800</pubDate><description><![CDATA[在计算机这个范畴内存在许多种类的集合，从简单的数据结构比如数组、链表，到复杂的数据结构比如红黑树，哈希表。尽管这些数据结构的内部实现和外部特征大相径庭，但是遍历集合的内容确是一个共同的需求。.NET Framework通过IEnumerable和IEnumerator接口实现遍历集合功能。    Non-Generic Generic 备注  IEnumerator IEnumerato...]]></description><category></category></item><item><title><![CDATA[C#排序比较]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405045</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405045</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:22 +0800</pubDate><description><![CDATA[与C#定义了相等性比较规范一样，C#也定义了排序比较规范，以确定一个对象与另一个对象的先后顺序。排序规范如下  IComparable接口（包括IComparable接口和IComparable&lt;T&gt;接口）  &gt;和&lt;运算符 当需要实现排序算法时，使用IComparable接口。在下面的例子中，Array.Sort静态方法可以调用，是因为System.String类...]]></description><category></category></item><item><title><![CDATA[C#相等性比较]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405044</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405044</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:20 +0800</pubDate><description><![CDATA[本文阐述C#中相等性比较，其中主要集中在下面两个方面
==和！=运算符，什么时候它们可以用于相等性比较，什么时候它们不适用，如果不使用，那么它们的替代方式是什么？
什么时候，需要自定一个类型的相等性比较逻辑
在阐述相等性比较，以及如何自定义相等性比较逻辑之前，我们首先了解一下值类型比较和引用类型比较
值类型比较对比引用类型比较
C#中的相等性比较有两种：

值类型相等，两个...]]></description><category></category></item><item><title><![CDATA[Customer IEnuramble Extension]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405043</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405043</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:20 +0800</pubDate><description><![CDATA[public static class IEnurambleExtension
{
    public static IEnumerable&lt;TSource&gt; DistinctBy&lt;TSource, TKey&gt;
        (this IEnumerable&lt;TSource&gt; source, Func&lt;TSource, TKey&...]]></description><category></category></item><item><title><![CDATA[c#列举和迭代器]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405042</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405042</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:18 +0800</pubDate><description><![CDATA[列举 - Enumeration
迭代器是一个值序列（集合）上的一个只读且只向前移动的游标。迭代器要么实现了IEnumerator接口，要么实现了IEnumerator&lt;T&gt;接口。
从技术的角度看，如果一个对象有MoveNext方法以及Current属性，那么我们就可以将其看作一个迭代器。
我们可以使用foreach语句去迭代一个可列举对象。可迭代的对象其实就是一个序列...]]></description><category></category></item><item><title><![CDATA[C#记录对象的变化]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405041</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405041</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:18 +0800</pubDate><description><![CDATA[经常，我们会遇到一个场景，在保存对象到数据库之前，对比内存对象和数据库值的差异。下面我写了一种实现，为保存定义一个事件，然后自动找出对象之间的差异，请注意，并没有通过反射的方式去获取每个属性及其值。因为那样会影响性能。闲话不表，直接贴代码



class Program
    {
        static void Main(string[] args)
    ...]]></description><category></category></item><item><title><![CDATA[C#按需序列化对象为Json字符串]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405040</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405040</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:17 +0800</pubDate><description><![CDATA[只贴代码，不解释了。新的代理类型确实很给力！


public static class JsonHelper
{
    public static string ToJsonString&lt;T&gt;(IList&lt;T&gt; list, Func&lt;T, string&gt; fun)
    {
        StringBuilder buffer ...]]></description><category></category></item><item><title><![CDATA[c#如何区分静态只读变量和常量]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405039</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405039</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:17 +0800</pubDate><description><![CDATA[常量const
常量就是一个其值永远不会改变的静态字段。常量的值会在编译时自动推算，编译器会在遇到常量时，将其逐个替换为该常量的值。常量可以是C#内建的任何数字类型或枚举类型。声明一个常量的时候必须对其进行初始化。
例如：


class Program
{
    const int a = 2;        
    
    static void Main(s...]]></description><category></category></item><item><title><![CDATA[C#如何更好地理解引用类型和值类型]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405038</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405038</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:15 +0800</pubDate><description><![CDATA[说道值类型和引用类型，在C#中，官方的说法就是：
值类型直接指向数据；一般包括C#自带的所有数字类型，字符类型，bool类型，当然还有自定义的结构类型和枚举类型
而引用类型则是指向数据存储的地址。一般指所有类，数组，代理和接口类型。请注意还包括字符类型
值类型与引用类型的根本区别就是它们在内存中处理的方式：
值类型的内容仅仅就是对类型的值；为一个值类型实例赋值总是赋值这个值的实例...]]></description><category></category></item><item><title><![CDATA[C#代理那点事儿]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405037</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405037</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:15 +0800</pubDate><description><![CDATA[Func代理是啥？
Func代理接收0个或多个参数，返回TResult值；
以Func&lt;TSource, TResult&gt;为例：Func带来封装一个方法，该方法接收一个参数，然会一个TResult类型。
举个最简单的例子，求一个一维整数数组的和


private static void Demo()
{
    Func&lt;int[], int&gt; ...]]></description><category></category></item><item><title><![CDATA[Pro ASP.NET MVC –第五章 使用Razor]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405036</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405036</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:14 +0800</pubDate><description><![CDATA[Razor是微软在MVC3中引入的视图引擎的名字，在MVC4中对其进行了改进（尽管改动非常小）。视图引擎处理ASP.NET内容、寻找指令，典型地用于插入动态数据并输出到浏览器中。微软维持了两个视图引擎——ASPX视图引擎工作与&lt;%%&gt;标签，ASP.NET已经依赖它多年；RAZOR引擎工作与@字符后的内容块上。
总的来说，如果你熟悉&lt;%%&gt;语法，那么你就不会在使用...]]></description><category></category></item><item><title><![CDATA[Pro ASP.NET MVC –第六章 MVC的基本工具]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405035</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405035</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:13 +0800</pubDate><description><![CDATA[在本章，我们将介绍每个MVC程序员"武器库"的三个重要工具：依赖注入容器、单元测试框架和mock工具。在本书，对于三个工具分别都只用了一种方式实现，但每个工具都还有其他的实现方式。如果我们的实现方式不适合你的具体情况，那么你也不必担心。因为它们并不仅仅局限于我们采用的实现，你可以找到与你工作环境相适合的实现方式。
在第三章，我们提到Ninject是一个推荐的依赖注入容器。它非常简单，优...]]></description><category></category></item><item><title><![CDATA[Pro ASP.NET MVC –第三章 MVC模式]]></title><link>https://blog.youkuaiyun.com/aoding8407/article/details/101405034</link><guid>https://blog.youkuaiyun.com/aoding8407/article/details/101405034</guid><author>aoding8407</author><pubDate>Thu, 26 Sep 2019 02:22:12 +0800</pubDate><description><![CDATA[在第七章，我们将创建一个更复杂的ASP.NET MVC示例，但在那之前，我们会深入ASP.NET MVC框架的细节；我们希望你能熟悉MVC设计模式，并且考虑为什么这样设计。在本章，我们将讨论下列内容

MVC架构模式
域模型和Respositories
使用依赖注入创建松耦合的系统
自动化测试的基础

你或许已经对本章我们将讨论的概念和规范非常熟悉，尤其如果你有开发ASP....]]></description><category></category></item></channel></rss>