<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>守望轩 &#187; c#</title>
	<atom:link href="http://www.watch-life.net/category/csharp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.watch-life.net</link>
	<description>关注IT,审视自我,守望生活, 宁静雅致的小轩馆.</description>
	<lastBuildDate>Mon, 23 Aug 2010 15:08:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>c#细节&#8211;Property和Attribute迷局</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-property-attribute.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-property-attribute.html#comments</comments>
		<pubDate>Thu, 17 Jul 2008 15:10:45 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[Attribute]]></category>
		<category><![CDATA[Property]]></category>
		<category><![CDATA[细节]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=155</guid>
		<description><![CDATA[《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-) ——————————————————————————&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; C#中Property和Attribute本是两个非常好区分的概念，但翻译过来都叫“属性”，似乎让人迷惑。造成Property和Attribute迷局的原因有两个： 1、不知道是中文翻译词汇的贫乏，还是英文词汇的贫乏，导致两者的混淆。于是有人建议把Attribute翻译成“特性”。这虽然在称呼上把两者区分开来，但并不能从本质上揭开迷局。 2、在c#中引入了所谓“字段”（Field），把OOA/OOD中的Attribute给替换了，而同时有引入了自己的“Attribute”。 看看下面的表格，你也许就了解 ，在c#中所谓“字段”的渊源了。 OOA/OOD C++ .NET(C#) Attribute Member Variable Field Method Member Function Method   原来“field”就是原来c++中的“Member Variable” ，也就是OOA/OOD中的“Attribute”，按OOA/OOD的规定理所当然“field”是只能用private限定了。 下面来说说c#的“Property”，先看看下面的代码 public class cName { // C#中Field（字段），C++中Member Variable，OOA/OOD中Attribute（属性） private string m_Field; public string Prop { // C#中称为Property（属性） get { return m_Field; } set { name = m_Field; } } }   通过上面可以知道“Property”其实本质就是一个一对get/set方法（用public来限定），因此它就相当于c++的Member Function或者OOA/OOD中的Method，一个比较特殊一点的方法。 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #3366ff;">《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span></p>
<p>——————————————————————————&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>C#中Property和Attribute本是两个非常好区分的概念，但翻译过来都叫“属性”，似乎让人迷惑。造成Property和Attribute迷局的原因有两个：<br />
1、不知道是中文翻译词汇的贫乏，还是英文词汇的贫乏，导致两者的混淆。于是有人建议把Attribute翻译成“特性”。这虽然在称呼上把两者区分开来，但并不能从本质上揭开<a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html">迷局</a>。<br />
2、在c#中引入了所谓“字段”（Field），把OOA/OOD中的Attribute给替换了，而同时有引入了自己的“Attribute”。</p>
<p>看看下面的表格，你也许就了解 ，在c#中所谓“字段”的渊源了。</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">OOA/OOD</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">C++</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">.NET(C#)</p>
</td>
</tr>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.5pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="color: #ff0000;">Attribute</span></p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="color: #ff0000;">Member Variable</span></p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="color: #ff0000;">Field</span></p>
</td>
</tr>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.5pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">Method</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">Member Function</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">Method</p>
</td>
</tr>
</tbody>
</table>
<div> </div>
<div>原来“field”就是原来c++中的“Member Variable” ，也就是OOA/OOD中的“Attribute”，按OOA/OOD的规定理所当然“field”是只能用<span style="color: #0000ff;">private<span style="color: #000000;">限定了。</span></span></div>
<div><span style="color: #0000ff;"><span style="color: #000000;">下面来说说c#的“Property”，先看看下面的代码</span></span></div>
<div class="code">
<p>public class cName<br />
{<br />
// C#中Field（字段），C++中Member Variable，OOA/OOD中Attribute（属性）<br />
private string m_Field;<br />
public string Prop { // C#中称为Property（属性）<br />
get<br />
{<br />
return m_Field;<br />
}<br />
set<br />
{<br />
name = m_Field;<br />
}</p>
<p>}<br />
}<br />
 </p></div>
<p>通过上面可以知道“Property”其实本质就是一个一对get/set方法（用public来限定），因此它就相当于c++的<span>Member Function或者OOA/OOD中的Method，一个比较特殊一点的方法。</span></p>
<p><span>而c#中的“<span style="color: #ff0000;">Attribute</span>”则完全和OOA/OOD中的“<span style="color: #0000ff;">Attribute</span>” 完全不一样了，而是c#（net）全新引入的一个概念。</span><br />
msdn官方的解释如下：</p>
<blockquote><p>公共语言运行时允许你添加类似关键字的描述声明，叫做attributes, 它对程序中的元素进行标注，如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起，可以用来向运行时描述你的代码，或者在程序运行的时候影响应用程序的行为。</p></blockquote>
<p>说的通俗些Attribute是类,不过是一类比较特殊的类，Attribute必须写在一对方括符中，用来处理net中多种问题：序列化、程序的安全特征等等，在net中的作用非同凡响。那么关于Attribute的用法，不再是本文条论范围了，你可以看看<a href="http://www.cnblogs.com/dudu" target="_blank">dudu</a>写的一个系列文章,链接如下<a href="http://www.cnblogs.com/dudu/articles/4449.html" target="_blank">http://www.cnblogs.com/dudu/articles/4449.html</a></p>
<p>本文地址：h<a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html">ttp://www.watch-life.net/csharp/csharp-detail-property-attribute.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html" title="c#的细节(二)-修饰符 (2008-07-06)">c#的细节(二)-修饰符</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/insert-quotes-values-automatically-while-typing-the-attrib-values.html" title="web developer tips (66):输入属性时自动插入引号 (2009-11-19)">web developer tips (66):输入属性时自动插入引号</a> (0)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：1 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-property-attribute.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-property-attribute.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-property-attribute.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>c#细节(三)-AS和IS</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html#comments</comments>
		<pubDate>Mon, 07 Jul 2008 09:26:54 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[IS]]></category>
		<category><![CDATA[操作符]]></category>
		<category><![CDATA[细节]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=150</guid>
		<description><![CDATA[《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-) &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 在c#中类型的转换分两种：显式和隐式，基本的规则如下： 1、基类对象转化为子类对象，必须显式转换，规则：(类型名) 对象。 2、值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing). 3、子类转化为基类对象。 4、基本类型互相之间转化可以用Covent类来实现。 5、字符串类型转换为对应的基本类型用Parse方法，除了String类型外其他的类型都可以用Parse方法。 6、用GetType可以取得对象的精确类型。 7、子类转化为基类，采用隐式转换。 下面来说说AS和IS操作符。 AS：用于在兼容的引用类型之间执行转换。 IS：检查对象是否与给定类型兼容 从概念来分析： 1、AS在转换的同事兼判断兼容性，如果无法进行转换，则 as 返回 null（没有产生新的对象）而不是引发异常。有了AS我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。 2、AS是引用类型类型的转换或者装箱转换，不能用与值类型的转换。如果是值类型只能结合is来强制转换，代码如下： object objTest = 11; if( objTest is int ) { &#160;&#160;&#160; int nValue = (int )objTest; } 3、IS只是做类型兼容判断，并不执行真正的类型转换。返回true或false，不会返回null，对象为null也会返回false。 4、AS模式的效率要比IS模式的高，因为借助IS进行类型转换的化，需要执行两次类型兼容检查。而AS只需要做一次类型兼容，一次null检查，null检查要比类型兼容检查快。 本文地址：http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html 你可能也会喜欢以下文章： c#细节&#8211;Property和Attribute迷局 (1) web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (0) c#的细节(二)-修饰符 (0) 求职与做人 (6) html页面表格导出到excel总结 (3) [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
在<a href="http://www.watch-life.net/category/csharp" target="_blank">c#</a>中类型的转换分两种：显式和隐式，基本的规则如下：<br />
1、基类对象转化为子类对象，必须显式转换，规则：(类型名) 对象。<br />
2、值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing).<br />
3、子类转化为基类对象。<br />
4、基本类型互相之间转化可以用Covent类来实现。<br />
5、字符串类型转换为对应的基本类型用Parse方法，除了String类型外其他的类型都可以用Parse方法。<br />
6、用GetType可以取得对象的精确类型。<br />
7、子类转化为基类，采用隐式转换。</p>
<p>下面来说说<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html">AS和IS操作符</a>。<br />
AS：用于在兼容的引用类型之间执行转换。<br />
IS：检查对象是否与给定类型兼容</p>
<p>从概念来分析：<br />
1、AS在转换的同事兼判断兼容性，如果无法进行转换，则 as 返回 null（没有产生新的对象）而不是引发异常。有了AS我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。<br />
2、AS是引用类型类型的转换或者装箱转换，不能用与值类型的转换。如果是值类型只能结合is来强制转换，代码如下：</p>
<div class="code"><span style="color: #0000ff;">object</span><span style="color: #000000;"> objTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">11</span><span style="color: #000000;">;    </span></p>
<p>
<span style="color: #000000;"><span style="color: #0000ff;">if</span><span style="color: #000000;">( objTest </span><span style="color: #0000ff;">is</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> )</span></span>
	</p>
<p><span style="color: #000000;">    {</span><br />
<span style="color: #000000;">        <span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; int</span><span style="color: #000000;"> nValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> )objTest;</span></span></p>
<p>
<span style="color: #000000;"><span style="color: #000000;">    }<br />
</span></div>
<p>3、IS只是做类型兼容判断，并不执行真正的类型转换。返回true或false，不会返回null，对象为null也会返回false。<br />
4、AS模式的效率要比IS模式的高，因为借助IS进行类型转换的化，需要执行两次类型兼容检查。而AS只需要做一次类型兼容，一次null检查，null检查要比类型兼容检查快。</p>
<p>本文地址：<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html">http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html" title="c#细节&#8211;Property和Attribute迷局 (2008-07-17)">c#细节&#8211;Property和Attribute迷局</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html" title="c#的细节(二)-修饰符 (2008-07-06)">c#的细节(二)-修饰符</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html" title="c#的细节(一)-问号的细节 (2008-07-03)">c#的细节(一)-问号的细节</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c#的细节(二)-修饰符</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-modifiers.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-modifiers.html#comments</comments>
		<pubDate>Sat, 05 Jul 2008 16:44:12 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[修饰符]]></category>
		<category><![CDATA[细节]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=148</guid>
		<description><![CDATA[写在最前面的话： 《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-) &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 在c#的中修饰符的概念，最让初学者有些头痛了，理解起来也不是想象中那么简单，关键是不要搞乱了。 c#的修饰符大概分3类： 1、访问型修饰符，就是控制所修饰成员的可访问域，包括：public、private、protected、internal 和protected internal。其中只能protected internal 组合，其他都不能。 public：访问不受限制。 private：访问仅限于包含类型。只有包含该成员的类可以存取. protected：访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取. Internal：访问仅限于当前程序集。只有当前项目（工程）可以存取. protected internal：访问仅限于当前程序集或从包含类派生的类型。 上面的概念好像很绕口。不过在如果你对面向对象大致了解的话，理解这些概念并不难，需要明确两个东东：程序集和项目。这里不详细讨论程序集和项目（如果你想全面了解有关程序集，项目，命名空间等东东，可以去看看这里），你可以大致理解，一个项目可以是一个程序集。 public、private、proteced我觉得非常比较好理解，麻烦点就是Internal，只能在一个项目中使用，不能跨项目调用，只能自己的项目内使用，即使是子类也不能访问。 namespace space1 { internal class Class1 { public int a } class Class2 { public void b() { Class1 cc = new Class1(); } } } namespace space2 { class App { static void Main(string[] args) { [...]]]></description>
			<content:encoded><![CDATA[<p>写在最前面的话：<br />
<span style="color: #0000ff;"><br />
《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
在c#的中<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html">修饰符</a>的概念，最让初学者有些头痛了，理解起来也不是想象中那么简单，关键是不要搞乱了。</p>
<p>c#的修饰符大概分3类：</p>
<p>1、访问型修饰符，就是控制所修饰成员的可访问域，包括：public、private、protected、internal 和protected internal。其中只能protected internal 组合，其他都不能。</p>
<p>public：访问不受限制。<br />
private：访问仅限于包含类型。只有包含该成员的类可以存取.<br />
protected：访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取.<br />
Internal：访问仅限于当前程序集。只有当前项目（工程）可以存取.<br />
protected internal：访问仅限于当前程序集或从包含类派生的类型。</p>
<p>上面的概念好像很绕口。不过在如果你对面向对象大致了解的话，理解这些概念并不难，需要明确两个东东：程序集和项目。这里不详细讨论程序集和项目（如果你想全面了解有关程序集，项目，命名空间等东东，可以去看看<a href="http://www.cnblogs.com/wayfarer/archive/2006/04/07/369371.html">这里</a>），你可以大致理解，一个项目可以是一个程序集。</p>
<p>public、private、proteced我觉得非常比较好理解，麻烦点就是Internal，只能在一个项目中使用，不能跨项目调用，只能自己的项目内使用，即使是子类也不能访问。</p>
<blockquote>
<pre><span style="color: #0000ff;">namespace</span> space1
{
    <span style="color: #0000ff;">internal</span> <span style="color: #0000ff;">class</span> Class1
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> a
    }

    <span style="color: #0000ff;">class</span> Class2
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> b()
        {
            Class1 cc = <span style="color: #0000ff;">new</span> Class1();
        }

    }
}

<span style="color: #0000ff;">namespace</span> space2
{
    <span style="color: #0000ff;">class</span> App
    {
      <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)
        {
           space1.Class1 t_xA = <span style="color: #0000ff;">new</span> space1.Class1();//error</pre>
<pre>        }
   }
 }</pre>
</blockquote>
<p>以上的代码表明，Internal 是不能跨项目访问的。</p>
<p>对于protected internal 简单些理解，就是protected 和internal 的并集。protected就只能被子类内部所访问，于是它们的并集就是：同一个项目内或者子类内部可以访问。如果既不是同一程序集也不是子类，就无法访问。如下面的代码所示：</p>
<blockquote>
<pre><span style="color: #0000ff;">namespace</span> space3
{
    <span style="color: #0000ff;">public</span>  <span style="color: #0000ff;">class</span> Class1
    {
       <span style="color: #0000ff;">internal</span>  <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">int</span>  a;
        <span style="color: #0000ff;">internal</span> <span style="color: #0000ff;">int</span> b;
        <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">int</span> c;
    }

    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">class</span>2
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span>  bbb()
        {
            Class1 t_x1=<span style="color: #0000ff;">new</span> Class1();
	   t_x1.a <span style="color: #008000;">//ok</span>
	   t_x1.b <span style="color: #008000;">//ok</span>
            t_x1.b  <span style="color: #008000;">//error</span>

        }
    }

    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">class</span>3:Class1
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> bbb()
        {
                 <span style="color: #0000ff;">base</span>.a...<span style="color: #008000;">//ok</span>
	        <span style="color: #0000ff;">base</span>.b...<span style="color: #008000;">//ok</span>
                 <span style="color: #0000ff;">base</span>.c ...<span style="color: #008000;">//ok</span>
        }
    }
}

<span style="color: #0000ff;">namespace</span> space4
{
    <span style="color: #0000ff;">class</span> Application1:space3.Class1
    {
      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span>  a()
        {
            <span style="color: #0000ff;">base</span>.aa...
            <span style="color: #0000ff;">base</span>.cc...
        }
   }

    <span style="color: #0000ff;">class</span> bbb
    {
          <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span>  ccc()
        {
            space3..Class2 d = <span style="color: #0000ff;">new</span> space3.Class2();
            d.a.. <span style="color: #008000;">//error</span>
	   d.b...<span style="color: #008000;">//error</span>
            d.c... <span style="color: #008000;">//error</span>

        }

    }

 }</pre>
</blockquote>
<p>2、类修饰符：<br />
abstract:标识一个类只能作为其它类的基类.　　<br />
sealed:标识一个类不能被继承.<br />
partial ：局部类。将你的 class 分为多个部分，编译器会将多个部分拼合在一起。关于局部类部分你可以看看<a href="http://blog.csdn.net/SmartJavaer/archive/2006/10/12/1331151.aspx" target="_blank">这里</a></p>
<p>3、成员修饰符:<br />
　　<br />
　　abstract:指示该方法或属性没有实现.<br />
　　<br />
　　const:指定域或局部变量的值不能被改动.<br />
　　<br />
　　event:声明一个事件.<br />
　　<br />
　　extern:指示方法在外部实现.<br />
　　<br />
　　override:对由基类继承成员的新实现.<br />
　　<br />
　　readonly:指示一个域只能在声明时以及相同类的内部被赋值.<br />
　　<br />
　　static:指示一个成员属于类型本身,而不是属于特定的对象.<br />
　　<br />
　　virtual:指示一个方法或存取器的实现可以在继承类中被覆盖.</p>
<p>注意：1、命名空间不能使用访问修饰符。对命名空间没有访问是不受限制的，它的引入是主要是避免相同对象名的冲突。<br />
2、如果在成员声明中未指定访问修饰符，则使用默认的可访问性。</p>
<table id="table1" class="MsoNormalTable" style="width: 100%; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td style="border: 1pt solid #dddddd; padding: 3.75pt; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%" valign="bottom">
<p class="MsoNormal" style="text-align: left; margin: 7.5pt 0cm" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">属于 </span></strong></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: 1pt solid #dddddd; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%" valign="bottom">
<p class="MsoNormal" style="text-align: left; margin: 7.5pt 0cm" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">默认的成员可访问性 </span></strong></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: 1pt solid #dddddd; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%" valign="bottom">
<p class="MsoNormal" style="text-align: left; margin: 7.5pt 0cm" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">该成员允许的声明的可访问性 </span><br />
</strong></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">enum</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><span style="font-size: 8.5pt; font-family: 宋体;">无</span></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">class</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
protected</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">internal</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
protected</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
<strong>internal</strong> </span></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
interface</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><span style="font-size: 8.5pt; font-family: 宋体;">无</span></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">struct</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">internal</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
</tr>
</tbody>
</table>
<p>本文地址：<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html">http://www.watch-life.net/csharp/csharp-detail-modifiers.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html" title="c#的细节(一)-问号的细节 (2008-07-03)">c#的细节(一)-问号的细节</a> (0)</li>
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html" title="c#细节&#8211;Property和Attribute迷局 (2008-07-17)">c#细节&#8211;Property和Attribute迷局</a> (1)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-modifiers.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-modifiers.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-modifiers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c#的细节(一)-问号的细节</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-question-marks.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-question-marks.html#comments</comments>
		<pubDate>Wed, 02 Jul 2008 16:40:37 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[细节]]></category>
		<category><![CDATA[问号]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=145</guid>
		<description><![CDATA[写在最前面的话： 《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-) &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 我想你一定写过下面这样类似的代码： string strParam = Request.Params["param"]; if ( strParam== null ) { strParam= ""; } 或者这样的代码： string strParam= Request.Params["param"] == null ? "": Request.Params["param"]; 你发现，尽管实现的同一个功能，但第二段代码要比第一段代码是不是更简洁。这里的” ？：“就是一个三元的操作符。利用这个三元操作符也称条件操作符，就很简单的把一个if语句给实现了。 在使用条件操作符的时候要注意，假定条件表达式是这样 x？y：z，表达式类型的只能是使y 和z的变量类型之一，换句话说就是 y和z的变量类型决定这个条件表达式的类型，无论y和z是同一类型，还是y和z不是同一类型。 如果表达式的类型和赋值类型不一致，发生编译时错误 ，例如：如果你想实现如下代码： string strTemp ; object obj; .... if(strTemp == "") obj = DBNull.Value; else obj = strTemp ; 然后为了简单，改成下面这种形式： string strTemp; object [...]]]></description>
			<content:encoded><![CDATA[<p>写在最前面的话：</p>
<p><strong><span style="color: #0000ff;">《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span></strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>我想你一定写过下面这样类似的代码：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strParam = Request.Params["<span style="color: #8b0000;">param</span>"];
<span style="color: #0000ff;">if</span> ( strParam== <span style="color: #0000ff;">null</span> )
{
    strParam= "";
}</pre>
</blockquote>
<p>或者这样的代码：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strParam=</pre>
<pre>  Request.Params["<span style="color: #8b0000;">param</span>"] == <span style="color: #0000ff;">null</span> ? "": Request.Params["<span style="color: #8b0000;">param</span>"];</pre>
</blockquote>
<p>你发现，尽管实现的同一个功能，但第二段代码要比第一段代码是不是更简洁。这里的” <span style="color: #ff0000;">？：</span>“就是一个三元的操作符。利用这个三元操作符也称条件操作符，就很简单的把一个if语句给实现了。</p>
<p>在使用条件操作符的时候要注意，假定条件表达式是这样 x？y：z，表达式类型的只能是使y 和z的变量类型之一，换句话说就是<br />
y和z的变量类型决定这个条件表达式的类型，无论y和z是同一类型，还是y和z不是同一类型。<br />
如果表达式的类型和赋值类型不一致，发生编译时错误 ，例如：如果你想实现如下代码：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strTemp ;
<span style="color: #0000ff;">object</span> obj;
....

<span style="color: #0000ff;">if</span>(strTemp ==  "")
          obj   =   DBNull.Value;
  <span style="color: #0000ff;">else</span>
          obj   =   strTemp ;</pre>
</blockquote>
<p>然后为了简单，改成下面这种形式：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strTemp;
<span style="color: #0000ff;">object</span> obj = strTemp == ""?DBNull.Value:strTemp;</pre>
</blockquote>
<p>你编译的时候，会报错。因为DBNull和string之间没隐式转换，修改成如下代码就可以了：</p>
<blockquote>
<pre><span style="color: #0000ff;">object</span> obj = strTemp == ""? DBNull.Value: (<span style="color: #0000ff;">object</span>)strTemp;</pre>
</blockquote>
<p>另外条件操作符是向右关联的，从左到右进行计算，于是a?b:c?d:e 应理解为 a?b:(c?d:e)。</p>
<p>上面提到了DBNull，在c#2.0里面实现了Nullable数据类型，别小看这个数据类型，其实非常有用，从此我们就可以放弃对object数据进行 if（object==null）这样的判断了。同时你会发现，在数据库应用上，数据库中有的字段允许取空值，在C#世界中引入nullable类型正好与之对应，，从（C#）对象映射到关系数据库对象，或者反过来，转换都是比较平滑。如果你想进一步了解Nullable数据类型可以去查msdn(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref2/html/T_System_Nullable.htm) 或者去<a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx" target="_blank">这里</a>看看. 为了实现Nullable数据类型转换成non-Nullable型数据，就有了一个这样的操作符”<span style="color: #ff0000;">？？</span>（两个问号）“，双问号操作符意思是取所赋值??左边的，如果左边为null，取所赋值??右边的，比如int y = x ?? -1 如果x为空，那么y的值为-1.</p>
<p>于是这时候就可以把最上面第二段代码改成：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strParam= Request.Params["<span style="color: #8b0000;">param</span>"]?? "";</pre>
</blockquote>
<p>嘿嘿，是不是更简洁了。</p>
<p>另外还有”<span style="color: #ff0000;">？</span>（单问号）“修饰符，是System.Nullable&lt;T&gt;的缩写形式，比如int?代表是可空的整形，例如：int? a = 1 或者 int? b=null。Nullable类型具有一个HasValue的bool类型只读属性，当Nullable类型实例的该属性为true时，则表示该实例是非空实例，包含一个已知值Value，HasValue为false时，访问Value属性将导致System.InvalidOperationException。</p>
<p>怎么样？这里有关“？”号的细节，就不单单关注<a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html">问号</a>本身了</p>
<p> </p>
<p>本文地址：<a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html">http://www.watch-life.net/csharp/csharp-detail-question-marks.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html" title="c#细节&#8211;Property和Attribute迷局 (2008-07-17)">c#细节&#8211;Property和Attribute迷局</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html" title="c#的细节(二)-修饰符 (2008-07-06)">c#的细节(二)-修饰符</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-question-marks.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-question-marks.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-question-marks.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/


Served from: www.watch-life.net @ 2010-09-02 21:17:26 -->