100165351.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 150 行 · 第 1/2 页
HTM
150 行
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">pDoubles[0] = 3.0; // pDoubles[0] is the same as *pDoubles</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">pDoubles[1] = 8.4; // pDoubles[1] is the same as *(pDoubles+1)</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">把数组的语法应用于指针并不是新东西。自从开发出</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 楷体_GB2312">和</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 楷体_GB2312">语言以来,它们就是这两种语言的基础部分。实际上,</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 楷体_GB2312">开发人员会把这里用</span><span lang="EN-US">stackalloc</span><span style="FONT-FAMILY: 楷体_GB2312">获得的、基于堆栈的数组完全等同于传统的基于堆栈的</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 楷体_GB2312">和</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 楷体_GB2312">数组。这个语法和指针与数组的链接方式是</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 楷体_GB2312">语言在</span><span lang="EN-US">70</span><span style="FONT-FAMILY: 楷体_GB2312">年代后期流行起来的原因之一,也是指针的使用成为</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 楷体_GB2312">和</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 楷体_GB2312">中一种大众化编程技巧的主要原因。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">高性能的数组可以用与一般</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">数组相同的方式访问,但需要强调其中的一个警告。在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中,下面的代码会抛出一个异常:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">double [] myDoubleArray = new double [20];</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">myDoubleArray[50] = 3.0;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">抛出异常的原因很明显。使用越界的下标来访问数组:下标是</span><span lang="EN-US">50</span><span style="FONT-FAMILY: 宋体">,但允许的最大值是</span><span lang="EN-US">19</span><span style="FONT-FAMILY: 宋体">。但是,如果使用</span><span lang="EN-US">stackalloc</span><span style="FONT-FAMILY: 宋体">声明了一个相同数组,对数组进行边界检查时,这个数组中没有包装任何对象,因此下面的代码不会抛出异常:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">double* pDoubles = stackalloc double [20];</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">pDoubles[50] = 3.0;</span></p>
<p class="MsoNormal" style="FTEL: 0cm"><span style="FONT-FAMILY: 宋体">在这段代码中,我们分配了足够的内存来存储</span><span lang="EN-US">20</span><span style="FONT-FAMILY: 宋体">个</span><span lang="EN-US">double</span><span style="FONT-FAMILY: 宋体">类型数据。接着把</span><span lang="EN-US">sizeof(double)</span><span style="FONT-FAMILY: 宋体">存储单元的起始位置设置为该存储单元的起始位置加上</span><span lang="EN-US">50*sizeof(double)</span><span style="FONT-FAMILY: 宋体">存储单元,来保存双精度值</span><span lang="EN-US">3.0</span><span style="FONT-FAMILY: 宋体">。但这个存储单元超出了刚才为</span><span lang="EN-US">double</span><span style="FONT-FAMILY: 宋体">分配的内存区域。谁也不知道这个地址上存储了什么数据。最好是只使用某个当前未使用的内存,<span style="LETTER-SPACING: 0.1pt">但所重写的空间也有可能是堆栈上用于存储其他变量或某个正在执行的方法的返回地址</span>。因此,使用指针获得高性能的同时,也会付出一些代价:需要确保自己知道在做什么,否则就会抛出非常古怪的运行时错误。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">2.</span><span lang="EN-US" style="FONT-FAMILY: 宋体"> </span><span style="FONT-FAMILY: 黑体">示例</span><span lang="EN-US">QuickArray</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下面用一个</span><span lang="EN-US">stackalloc</span><span style="FONT-FAMILY: 宋体">示例</span><span lang="EN-US">QuickArray</span><span style="FONT-FAMILY: 宋体">来结束关于指针的讨论。在这个示例中,程序仅要求用户提供为数组分配的元素数。然后代码使用</span><span lang="EN-US">stackalloc</span><span style="FONT-FAMILY: 宋体">给</span><span lang="EN-US">long</span><span style="FONT-FAMILY: 宋体">型数组分配一定的存储单元。这个数组的元素是从</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体">开始的整数的平方,结果显示在控制台上:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">using System;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">namespace Wrox.ProCSharp.Chapter07</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> class MainEntryPoint</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> static unsafe void Main()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.Write("How big an array do you want? \n> ");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> string userInput = Console.ReadLine();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> uint size = uint.Parse(userInput);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> long* pArray = stackalloc long [(int)size];</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> for (int i=0 ; i<size ; i++)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pArray[i] = i*i;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> for (int i=0 ; i<size ; i++)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("Element {0} = {1}", i, *(pArray+i));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">运行这个示例,得到如下所示的结果:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><strong><span lang="EN-US">QuickArray</span></strong></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">How big an array do you want?</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">> <strong>15</strong></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 0 = 0</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 1 = 1</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 2 = 4</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 3 = 9</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 4 = 16</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 5 = 25</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 6 = 36</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 7 = 49</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 8 = 64</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 9 = 81</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 10 = 100</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 11 = 121</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 12 = 144</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Element 13 = 169</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">Element 14 = 196</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165350.htm">上一页</a> <a href="index.html">首页</a> <a href="100165352.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165351.htm'><font color='red'>7.3.2 使用指针优化性能</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165348.htm'>7.3.1 指针(1)</a></div><div style='float:right;width:49%'>·<a href='100165349.htm'>7.3.1 指针(2)</a></div><div style='float:left;width:49%'>·<a href='100165350.htm'>7.3.1 指针(3)</a></div><div style='float:right;width:49%'>·<a href='100165352.htm'>7.4 小结</a></div><div style='float:left;width:49%'>·<a href='100165353.htm'>8.1 System.String类</a></div><div style='float:right;width:49%'>·<a href='100165354.htm'>8.1.1 创建字符串</a></div></div>
</div>
</div>
</div></div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?