<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>冰剑'blog - C#-ASP.net</title><link>http://www.xunzou.com/blog/</link><description>专注于WEB前端开发 | 2010 重生 - </description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 91204</generator><language>zh-CN</language><copyright>Copyright 2010 xunzou.com. Rights Reserved.备案序号:豫ICP备05003168号var gaJsHost = ((&amp;quot;https:&amp;quot; == document.location.protocol) ? &amp;quot;https://ssl.&amp;quot; : &amp;quot;http://www.&amp;quot;);document.write(unescape(&amp;quot;%3Cscript src='&amp;quot; + gaJsHost + &amp;quot;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&amp;quot;));try {var pageTracker = _gat._getTracker(&amp;quot;UA-11478901-1&amp;quot;);pageTracker._trackPageview();} catch(err) {}</copyright><pubDate>Wed, 08 Sep 2010 23:54:33 +0800</pubDate><item><title>使用asp.net创建用户出现“密码最短长度为7,其中必须包含以下非字母数字字符:1“提示</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/473.html</link><pubDate>Wed, 15 Oct 2008 15:04:39 +0800</pubDate><guid>http://www.xunzou.com/blog/post/473.html</guid><description><![CDATA[今天在用.net的时候，配置老是出错，不会弄，上网一查，原来是这么个问题。<br/>创建用户时：“密码最短长度为7,其中必须包含以下非字母数字字符: 1”的意思是说，密码至少有7位，且非字母、数字的字符至少必须有一个 如：~!@#$%^&*()_+    当然这些设置可以修改。<br/><br/>1.   修改machine.config文件（该文件在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(所安装Framework的版本号)\CONFIG）<br/>找到下面所示文字段：<br/><membership><br/>            <providers><br/>                <add name="AspNetSqlMembershipProvider"<br/>                    type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"<br/>                    connectionStringName="LocalSqlServer"<br/>                    enablePasswordRetrieval="false"<br/>                    enablePasswordReset="true"<br/>                    requiresQuestionAndAnswer="true"<br/>                    applicationName="/"<br/>                    requiresUniqueEmail="false"<br/>                    passwordFormat="Hashed"<br/>                    maxInvalidPasswordAttempts="5"<br/>                    <font color="Red">minRequiredPasswordLength="7"<br/>                    minRequiredNonalphanumericCharacters="1"</font>   <br/>                    passwordAttemptWindow="10"<br/>                    passwordStrengthRegularExpression="" /><br/>            </providers><br/>        </membership>里面有两个属性,一个是  minRequiredPasswordLength,意思是最长密码，默认为7.另一个是minRequiredNonalphanumericCharacters，默认为1，意思是至少有一个非字母字符，只要把它改成0就可以了。<br/><br/>2、只是对某一个站点，只要修改web.config<br/>注：一定要加上 <font color="Red"><remove name="AspNetSqlMembershipProvider" /></font>项，不然可能会出现如下错误：“ 项“AspNetSqlMembershipProvider”已添加。”错误提示。 <br/><br/><membership><br/>            <providers><br/>                <remove name="AspNetSqlMembershipProvider" /><br/>                <add name="AspNetSqlMembershipProvider"<br/>                    type="System.Web.Security.SqlMembershipProvider, System.Web, <br/>Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"<br/>                    connectionStringName="LocalSqlServer"<br/>                    enablePasswordRetrieval="false"<br/>                    enablePasswordReset="true"<br/>                    requiresQuestionAndAnswer="true"<br/>                    applicationName="/"<br/>                    requiresUniqueEmail="false"<br/>                    passwordFormat="Hashed"<br/>                    maxInvalidPasswordAttempts="5"<br/>                    minRequiredPasswordLength="6"<br/>                    minRequiredNonalphanumericCharacters="0"<br/>                    passwordAttemptWindow="10"<br/>                    passwordStrengthRegularExpression="" /><br/>            </providers><br/>   </membership><br/>把上面的代码插入在<system.web>节点中。]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/473.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=473</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=473&amp;key=6adaca4b</trackback:ping></item><item><title>C# 定义事件</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/472.html</link><pubDate>Thu, 09 Oct 2008 17:07:22 +0800</pubDate><guid>http://www.xunzou.com/blog/post/472.html</guid><description><![CDATA[定义事件前，先要定义一个委托类型(delegate)，以用于该事件。这个委托类型指定了事件处理方法必须遵循的签名。<br/>定义委托：<br/><p class="code"><code>public&nbsp;delegate&nbsp;void&nbsp;MessageHandler(string&nbsp;messageText);</code></p><br/>这个委托类型称为MessageHandler，是void函数的签名，它有一个string参数。<br/>定义了委托后就可以把事件本身定义为Connection类的一个成员：<br/><p class="code"><code>public&nbsp;class&nbsp;Connection&nbsp;&lt;br/&gt;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;event&nbsp;MessageHandler&nbsp;MessageArrived;&lt;br/&gt;</code></p><br/>给事件命名MessageArrived，用event关键字和要使用的委托类型声明它。<br/>以这种方式声明了事件后，就可以引发它，方法是按名称来调用它。就好象它是其签名有委托指定的方法一样。可以用下面的代码引发这个事件。<br/><p class="code"><code>MessageArrived("This&nbsp;is&nbsp;a&nbsp;message");</code></p><br/>如果定义该委托不包含任何参数，就可以使用下面的代码：<br/><p class="code"><code>MessageArrived();</code></p><br/><br/><b>1.多用途的事件处理程序</b><br/><br/>Timer.Elapse事件的签名包含了事件处理程序中常见的两个参数，如下所示：<br/>◆object source——引发事件的对象的引用；<br/>◆ElapsedEventArgse——由事件传送的参数；]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/472.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=472</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=472&amp;key=7f3da16b</trackback:ping></item><item><title>C# 定义泛型类</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/471.html</link><pubDate>Thu, 09 Oct 2008 11:17:12 +0800</pubDate><guid>http://www.xunzou.com/blog/post/471.html</guid><description><![CDATA[要定义泛型类，只需要在类定义中包含<>语法即可，例如：<br/><p class="code"><code>Class&nbsp;myGenericClass&nbsp;&lt;T&gt;&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这是泛型类的定义方法。&lt;br/&gt;}</code></p><br/><br/>T可以是任意标识符。<br/>泛型类还可以包含多个类型，他们用逗号隔开，例如：<br/><p class="code"><code>Class&nbsp;myGenericClass&nbsp;&lt;T1,t2,t3,t4,…&gt;&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这是泛型类的定义方法。&lt;br/&gt;}</code></p><br/><br/><b>1.default关键字</b><br/>要确定用于创建泛型的类实例的类型，需要了解一个最基本的情况：它们是引用类型还是值类型。如果不知道类型，就不能用下面的代码给赋予null值。<br/><p class="code"><code>&lt;br/&gt;public&nbsp;myGenericClass()&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;innerT1Object=null;&lt;br/&gt;}&lt;br/&gt;</code></p><br/><br/>如果T1是值类型，则上面的代码不能编译。<br/>可以使用default关键字的新方法来解决它：<br/><p class="code"><code>&lt;br/&gt;public&nbsp;myGenericClass()&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;innerT1Object=default(T1);&lt;br/&gt;}&lt;br/&gt;</code></p><br/>其结果是，如果innerT1Object是引用类型，就给它赋予null,如果它是值类型，就给它赋予默认值。对于数字类型，这个默认值是0；而结构根据其各个成员的类型，以相同的方式初始化为0或null。<br/><br/><b>2.约束类型</b><br/><br/>约束类型使用where关键字来实现。<br/><p class="code"><code>class&nbsp;myGenericClass&nbsp;&lt;T&gt;&nbsp;where&nbsp;T&nbsp;:&nbsp;&nbsp;constraint&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;……&lt;br/&gt;}</code></p><br/>其中constraint定义了约束。<br/>可以用这种方式提供许多约束！<br/><p class="code"><code>class&nbsp;myGenericClass&nbsp;&lt;T&gt;&nbsp;where&nbsp;T&nbsp;:&nbsp;&nbsp;constraint1,constaint2&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;……&lt;br/&gt;}</code></p><br/><br/>还可以使用多个where语句，定义泛型类需要的任意类型或所有类型上的约束：<br/><p class="code"><code>class&nbsp;myGenericClass&nbsp;&lt;T1,T2&gt;&nbsp;where&nbsp;T1:&nbsp;&nbsp;constraint1&nbsp;where&nbsp;T2:&nbsp;&nbsp;constraint2&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;……&lt;br/&gt;}</code></p>]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/471.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=471</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=471&amp;key=02b3063b</trackback:ping></item><item><title>C# 泛型--System.Collections.Generic命名空间的介绍</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/470.html</link><pubDate>Wed, 08 Oct 2008 17:03:47 +0800</pubDate><guid>http://www.xunzou.com/blog/post/470.html</guid><description><![CDATA[<b>1.List<T>，T类型对象的集合;<br/>2.Dictionary<K,V>，V类型的项与K类型的键值相关的集合;</b><br/><br/><b>1.List<T>.</b><br/>创建T类型的集合需要如下代码：<br/><p class="code"><code>&lt;br/&gt;List&lt;T&gt;&nbsp;myCollection&nbsp;=new&nbsp;List&lt;T&gt;();&lt;br/&gt;</code></p><br/>还可以吧List<T>对象传送给构造函数，在集合中设置项的起始列表。<br/><br/>使用这个语法实例化的对象，将支持下面的方法和属性：<br/><img onload="ResizeImage(this,520)" src="uploads/200810/08_173037_1.jpg" alt="" title=""/><br/><br/>List<T>的排序和搜索方法。<br/>◆ Comparison <T>：这个委托类型用于排序方法，其签名是 int method (T objectA ,T objectB)；<br/>◆Predicate<T>：这个委托类型用于搜索方法，其签名是bool method (T targetObject)。<br/><br/><b>2.Dictionary<K,V></b><br/><br/>这个类型可以定义键/值对的集合。这个类需要实例化两个类型，分别用于键和值，以表示集合中的各项。<br/>例如，可以使用强类型化的Add()方法添加键/值对。<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&lt;string,&nbsp;int&gt;&nbsp;strings&nbsp;=&nbsp;new&nbsp;Dictionary&lt;string,&nbsp;int&gt;();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings.Add("aa",&nbsp;25);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings.Add("bb",28);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings.Add("cc",&nbsp;15);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings.Add("dd",&nbsp;18);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings.Add("ee",&nbsp;94);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings.Add("ff",&nbsp;56);</code></p><br/>可以使用Keys和Values属性迭代集合中的键和值。<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(string&nbsp;key&nbsp;in&nbsp;strings.Keys)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(key);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(int&nbsp;value&nbsp;in&nbsp;strings.Values)&nbsp;;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(Value);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</code></p><br/><br/>            //还可以迭代集合中的各个项，把每个项作为KeyValuePair<K,V>实例来获取，这与上一章介绍的DictionaryEntry对象相同：<br/><br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(KeyValuePair&lt;string,&nbsp;int&gt;&nbsp;thing&nbsp;in&nbsp;strings)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("{0}={1}",thing.Key,thing.Value);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</code></p><br/><br/>            //Dictionary<K,V>中它的每个键都必须是唯一的，如果添加的项与它的已有项相同，就会出现ArgumentException异常]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/470.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=470</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=470&amp;key=bfd7096d</trackback:ping></item><item><title>C# 泛型--可空类型（nullable type）</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/469.html</link><pubDate>Wed, 08 Oct 2008 15:58:43 +0800</pubDate><guid>http://www.xunzou.com/blog/post/469.html</guid><description><![CDATA[值类型必须包含一个值，他们可以在声明之后、赋值之前，在未赋值的状态下存在，但不能以任何方式使用。而引用类型可以是null。<br/><b> 大多数基本类型如：int 、double和所有的结构都属于值类型；<br/>string和所有的类都数以引用类型！</b><br/><b>可空类型</b><br/><br/>有时让值类型为空是很有用的，泛型使用System.Nullable<T>类型提供了使值类型为空的一种方式。例如：<br/><p class="code"><code>&lt;br/&gt;System.Nullable&nbsp;&lt;int&gt;&nbsp;nullableInt;&lt;br/&gt;</code></p><br/>上面的代码声明了一个变量：nullableInt，它可以拥有int变量能包含的任何值还可以拥有值null。<br/><br/>上面可控类型的变量不适用上面的语法，而是使用下面的语法：<br/><p class="code"><code>&lt;br/&gt;int?&nbsp;nullableInt;&lt;br/&gt;</code></p><br/><b>int? </b>是System.Nullable<int>的缩写。<br/><br/><b>1.？？运算符 </b><br/>这个运算符可以提供可空类型是null和不是null的默认值。其用法如下：<br/><p class="code"><code>&lt;br/&gt;int?&nbsp;op1=null;&lt;br/&gt;int&nbsp;result=op1&nbsp;*&nbsp;2&nbsp;??&nbsp;5;&lt;br/&gt;</code></p><br/><br/>这个例子中op1是null，op1*2的值也是null 但是？？运算符检测到这个情况，就会吧5赋值给result。<br/>也可以吧“？？”运算符提供给“int？”。]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/469.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=469</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=469&amp;key=d2760c71</trackback:ping></item><item><title>c# 转换 as运算符</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/468.html</link><pubDate>Wed, 08 Oct 2008 12:08:26 +0800</pubDate><guid>http://www.xunzou.com/blog/post/468.html</guid><description><![CDATA[as运算符，一般用于引用类型的转换。<br/>as运算符使用下面的语法，把一种类型转换为指定的引用类型：<br/><operand> as <type><br/>这只使用于下列情况：<br/>◆<operand> 的类型是 <type>；<br/>◆<operand> 可以隐式转换为 <type>；<br/>◆<operand> 可以封箱到类型 <type>中；<br/>如果不能从<operand> 转换为 <type>，则表达式的结果就是null。]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/468.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=468</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=468&amp;key=68c1a08a</trackback:ping></item><item><title>使用IComparable和Icomparer接口对集合排序</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/467.html</link><pubDate>Wed, 08 Oct 2008 11:53:12 +0800</pubDate><guid>http://www.xunzou.com/blog/post/467.html</guid><description><![CDATA[许多集合类可以用对象的默认比较方式进行排序，或者用定制方法来排序。ArrayList就是一个实例，它包含方法Sort().这个方法使用时可以不带参数，此时使用默认的比较方式，也可以给它传送IComparer接口，以比较对象。<br/>在给ArrayList填充了简单类型，例如整数或字符串，就会进行默认比较。对于自己的类，必须在类定义中实现IComparable，或者创建一个支持ICoparer的类，来进行比较。（P278--P282）]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/467.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=467</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=467&amp;key=eecc42cc</trackback:ping></item><item><title>c# 比较：IComparable和IComparer接口是.net中比较对象的标准方式</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/466.html</link><pubDate>Wed, 08 Oct 2008 11:06:00 +0800</pubDate><guid>http://www.xunzou.com/blog/post/466.html</guid><description><![CDATA[IComparable和iComparer接口是.net中比较对象的标准方式。<br/>区别如下：<br/>◆IComparable在要比较的对象的类中实现，可以比较该对象和另一个对象；<br/>◆IComparer在一个单独的类中实现，可以比较任意两个对象。<br/><br/>一般情况下，使用IComparable给出类的默认比较代码，使用其他类给出非默认的比较代码。<br/>IComparable提供了一个方法CompareTo()。这个方法接受一个对象。返回一个int。例如：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;if&nbsp;(person1.CompareTo(person2)==0)&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("年龄相同");&lt;br/&gt;}&lt;br/&gt;else&nbsp;if(person1.CompareTo(person2)&gt;0)&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("person1比较大");&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;Console.WriteLine("Person1比较年轻");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>IComparer也提供了一个方法Compare()。这个方法接受两个对象，返回一个整形结果，这与CompareTo()相同。对于支持ICompare的对象，可以使用下面的代码：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;if&nbsp;(personComparer.Comparer(person1,person2)==0)&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("年龄相同");&lt;br/&gt;}&lt;br/&gt;else&nbsp;if&nbsp;(personComparer.Comparer(person1,person2)&gt;0)&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("person1年龄大");&lt;br/&gt;}&lt;br/&gt;else&nbsp;&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("person1年龄小");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>.net Framework在类Comparer上提供了IComparer接口的默认实现方式，类Comparer位于System.Collections命名空间中，可以对简单类型以及支持IComparable接口的认识类型进行特定文化的比较。例如，可以通过下面的代码使用它：<br/><p class="code"><code>&lt;br/&gt;string&nbsp;fristString&nbsp;="Frist&nbsp;string";&lt;br/&gt;string&nbsp;secondString="Second&nbsp;string";&lt;br/&gt;Console.WriteLine("Comparing'{0}'&nbsp;and&nbsp;'{1}',&nbsp;result:{2}",fristString,secondString,Comparer.Default.Compare(fristString,secondString));&lt;br/&gt;&lt;br/&gt;int&nbsp;fristNumber=35;&lt;br/&gt;int&nbsp;secondString=23;&lt;br/&gt;Console.WriteLine("Comparing&nbsp;'{0}'&nbsp;&nbsp;and&nbsp;'{1}'&nbsp;,result:{2}&nbsp;",fristNumber,secondString,Compare.Default.Compare(fristNumber,secondString));&lt;br/&gt;</code></p><br/><br/>这里使用Comparer.Default静态成员获取Comparer类的一个实例，接着使用Comparer()方法比较前两个字符串，之后比较两个整数，结果如下：<br/><p class="code"><code>&lt;br/&gt;Comparing&nbsp;'Frist&nbsp;String'&nbsp;and&nbsp;'Second&nbsp;String'&nbsp;,&nbsp;resulr:-1;&lt;br/&gt;&lt;br/&gt;Comparing&nbsp;'35'&nbsp;and&nbsp;'23'&nbsp;,&nbsp;resulr:1;&lt;br/&gt;</code></p><br/>注意：这里的结构并未给出相差的幅度。<br/>在使用Comparer时，必须使用可以比较的类型。例如，上面如果要比较fristString 和fristNumber就会生成一个异常。]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/466.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=466</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=466&amp;key=31875f35</trackback:ping></item><item><title>C#中 值的比较</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/465.html</link><pubDate>Wed, 08 Oct 2008 09:25:31 +0800</pubDate><guid>http://www.xunzou.com/blog/post/465.html</guid><description><![CDATA[值的比较利用运算符重载的方法！<br/><br/>1.运算符重载<br/>要进行运算符的重载，可以给类添加运算符类型成员（他们必须是static）。有些运算符有多种用途（例如-有一元和两元两种功能，）因此我们还要指定处理了多少个操作数，以及这些操作数的类型。一般情况下，操作数的类型与定义运算符的类相同，但也可以定义处理混合类型的运算符。<br/>先看例子：<br/><p class="code"><code>&lt;br/&gt;public&nbsp;class&nbsp;AddClass1&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;val;&lt;br/&gt;}&lt;br/&gt;</code></p><br/>这个仅仅是int值的一个包装器（wrapper）。<br/>对于这个类，下面的代码不能编译。<br/><p class="code"><code>&lt;br/&gt;AddClass1&nbsp;op1=new&nbsp;AddClass1();&lt;br/&gt;op1=5;&lt;br/&gt;AddClass1&nbsp;op2=new&nbsp;AddClass1();&lt;br/&gt;op2=5;&lt;br/&gt;AddClass1&nbsp;op3=op1+op2;&lt;br/&gt;</code></p><br/>因为+运算符不能应用于AddClass1的操作数，因为我们没有定义要执行的操作。<br/>下面的代码可以执行，但是得不到希望的结果。<br/><p class="code"><code>&lt;br/&gt;AddClass1&nbsp;op1=new&nbsp;AddClass1();&lt;br/&gt;op1=5;&lt;br/&gt;AddClass1&nbsp;op2=new&nbsp;AddClass1();&lt;br/&gt;op2=5;&lt;br/&gt;AddClass1&nbsp;op3=op1==op2;&lt;br/&gt;</code></p><br/>使用==二元运算符来比较op1和op2，看看他们是否引用同一个对象，而不是验证他们的值是否相等。在上述代码中即使op1和op2相等，op3也是false。<br/><br/>要重载+运算符，要使用下面的代码：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;public&nbsp;class&nbsp;AddClass1&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;AddClass1&nbsp;operator&nbsp;+(AddClass1&nbsp;op1,AddClass1&nbsp;op2)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddClass1&nbsp;returnVal=new&nbsp;AddClass1();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnVal.val=op1.val+op2.val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;returnVal;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>运算符重载看起来与标准静态方法声明类似，但它们使用关键字operator和运算符本身，而不是一个方法名。<br/>一元运算符和二元运算符差不多，一元运算符只需要一个参数。<br/><br/>也可以使用混合运算符，例如：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;public&nbsp;class&nbsp;AddClass1&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;AddClass3&nbsp;operator&nbsp;+(AddClass1&nbsp;op1,AddClass1&nbsp;op2)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddClass1&nbsp;returnVal=new&nbsp;AddClass1();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnVal.val=op1.val+op2.val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;returnVal;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;public&nbsp;class&nbsp;AddClass2&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;val;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;public&nbsp;class&nbsp;AddClass3&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;val;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;</code></p><br/>下面的代码就可以执行：<br/><p class="code"><code>&lt;br/&gt;AddClass1&nbsp;op1=new&nbsp;AddClass1();&lt;br/&gt;op1=5;&lt;br/&gt;AddClass3&nbsp;op2=new&nbsp;AddClass2();&lt;br/&gt;op2=5;&lt;br/&gt;AddClass3&nbsp;op3=op1+op2;&lt;br/&gt;</code></p><br/>但是如果吧签名相同的运算符添加到AddClass2中，上面的代码就会失败，因为它不知道要使用那个运算符。因此应注意，不要吧签名相同的运算符添加到多个类中。<br/><br/>混合了类型，操作数的顺序应与运算符重载的的参数顺序相同。如果使用了重载的运算符，和顺序错误的错作数，操作就会失败，下面的就会失败。<br/>[/CODE_LITE]AddClass3 op3=op2+op1;[/CODE_LITE]<br/><br/>下面的运算符可以重载：<br/>◆一元运算符：+，—，！，~，++，--，true，flase<br/>◆二元运算符：+，—，*，/，%，&，|，^，<<，>><br/>◆比较运算符：==，!=，<，>，<=，>=<br/><br/>注意：如果重载true和flase ，就可以在布尔表达式中使用类，例如：if(op1){}；<br/>一些运算符比较成对的重载，如<、>必须成对重载，<br/>还有=、!=，但这个运算符常常需要重写，Object.Equals()和Object.GetHashCode()。<br/>它需要下述非静态重写方法：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;public&nbsp;class&nbsp;AddClass1&lt;br/&gt;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;bool&nbsp;operator&nbsp;==(AddClass1&nbsp;op1,AddClass1&nbsp;op2)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(op1.val=op2.val);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;bool&nbsp;operator&nbsp;!=(AddClass1&nbsp;op1,AddClass1&nbsp;op2)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;!(op1==op2);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;override&nbsp;bool&nbsp;Equals(object&nbsp;op1)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;val&nbsp;==((AddClass1).op1).val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;override&nbsp;int&nbsp;GetHashCode()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;val;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>需要注意的是Equals()使用object类型参数。我们需要使用这个签名，否则就将重载这个方法，而不是重写它。]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/465.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=465</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=465&amp;key=b61bcaca</trackback:ping></item><item><title>c#类型的比较</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/464.html</link><pubDate>Tue, 07 Oct 2008 17:14:17 +0800</pubDate><guid>http://www.xunzou.com/blog/post/464.html</guid><description><![CDATA[在比较对象时，我们常常要知道他的类型，这样才能确定是否可以进行值的比较。<br/>GetType()方法，所有的类都从System.Object中继承了此方法，这个方法和typeof()运算符一起使用，就可以确定对象的类型：<br/><p class="code"><code>if&nbsp;(myobj.GetType()==typeof(MyComplexClass))&lt;br/&gt;{&lt;br/&gt;}</code></p><br/><br/>1.封箱和拆箱 封箱是在没有用户干涉的情况下进行的，而拆箱则需要进行显式转换。<br/><br/>2.is运算符<br/>is运算符的语法如下：<br/><p class="code"><code>&lt;operand&gt;is&lt;type&gt;</code></p><br/>这个表达式的结果如下：<br/>◆如果<type>是一个类类型，而<operand>也是该类型，或者它继承了该类型，或者它是封箱到该类型中，则结果为true；<br/>◆如果<type>是一个接口类型，而<operand>也是该类型，或者是实现该接口的类型，则结果为true；<br/>◆如果<type>是一个值类型，而<operand>也是该类型，或者它被拆箱到该类型中，则结果为true；]]></description><category>C#-ASP.net</category><comments>http://www.xunzou.com/blog/post/464.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=464</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=464&amp;key=88c763d6</trackback:ping></item></channel></rss>
