100162754.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 334 行 · 第 1/5 页
HTM
334 行
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">mainForm.Height = 400;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">执行这段代码,窗口的高度设置为</span><span lang="EN-US">400</span><span style="FONT-FAMILY: 宋体">,因此窗口会在屏幕上重新设置大小。在语法上,上面的代码类似于设置一个字段,但实际上是调用了包含代码的属性访问器</span><span lang="EN-US">(accessor)</span><span style="FONT-FAMILY: 宋体">重新设置了窗体的大小。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中定义属性,可以使用下面的语法:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">public string SomeProperty</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> get</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> return "This is the property value";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> set</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> // do whatever needs to be done to set the property</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">get</span><span style="FONT-FAMILY: 宋体">访问器不带参数,且必须返回为属性声明的类型。也不应为</span><span lang="EN-US">set</span><span style="FONT-FAMILY: 宋体">访问器指定任何显式参数,但编译器假定它带一个参数,其类型也与属性相同,并表示为</span><span lang="EN-US">value</span><span style="FONT-FAMILY: 宋体">。例如,下面的代码包含一个属性</span><span lang="EN-US">ForeName</span><span style="FONT-FAMILY: 宋体">,它设置了一个字段</span><span lang="EN-US">foreName</span><span style="FONT-FAMILY: 宋体">,该字段有一个长度限制。</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">private string foreName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">public string ForeName</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> get</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> return foreName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> set</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> if (value.Length > 20)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> // code here to take error recovery action </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> // (eg. throw an exception)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> else</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> foreName = value;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</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">Pascal</span><span style="FONT-FAMILY: 宋体">大小写命名规则,而私有属性采用</span><span lang="EN-US">camel</span><span style="FONT-FAMILY: 宋体">大小写命名规则。这是标准的命名方式。一些开发人员喜欢使用前面有下划线的字段名</span><span lang="EN-US">_foreName</span><span style="FONT-FAMILY: 宋体">,这会为识别字段提供极大的便利。</span></p>
<p class="MsoNormal"><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">程序员应注意,</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">不区分</span><span lang="EN-US">VB6</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">Set</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">Let</span><span style="FONT-FAMILY: 宋体">,在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中,写入访问器</span><span lang="EN-US">(write accessor)</span><span style="FONT-FAMILY: 宋体">总是</span><span lang="EN-US">set</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; TEXT-INDENT: 21.45pt"><span lang="EN-US">(1) </span><span style="FONT-FAMILY: 黑体">只读和只写属性</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在属性定义中省略</span><span lang="EN-US">set</span><span style="FONT-FAMILY: 宋体">访问器,就可以创建只读属性。因此,在上面的例子中把</span><span lang="EN-US">ForeName</span><span style="FONT-FAMILY: 宋体">变成只读属性:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">private string foreName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">public string ForeName</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> get</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> return foreName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">同样,在属性定义中省略</span><span lang="EN-US">get</span><span style="FONT-FAMILY: 宋体">访问器,就可以创建只写属性。但是,这是不好的编程方式,因为这可能会使客户机代码的作者感到迷惑。一般情况下,如果要这么做,最好使用一个方法替代。</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; TEXT-INDENT: 21.45pt"><span lang="EN-US">(2) </span><span style="FONT-FAMILY: 黑体">属性的访问修饰符</span></p>
<p class="MsoNormal"><span lang="EN-US" style="BACKGROUND: aqua"><span></span></span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">不允许给属性的</span><span lang="EN-US">get </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> set </span><span style="FONT-FAMILY: 宋体">访问器设置不同的访问修饰符。如果有一个封装了私有字段的属性需要读取的公共访问权限,但要限制对派生类的写入访问,就应把底层的字段设置为</span><span lang="EN-US">protected</span><span style="FONT-FAMILY: 宋体">,而不是</span><span lang="EN-US">private</span><span style="FONT-FAMILY: 宋体">,但这通常是不好的编码方法。此时,最常见的解决方法是声明一个公共只读属性和一个受保护或私有的</span><span lang="EN-US">Set()</span><span style="FONT-FAMILY: 宋体">函数:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">public string ForeName</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> get</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> return foreName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">protected void SetForeName(string value)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> if (value.Length > 20)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> // code here to take error recovery action </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> // (eg. throw an exception)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> else</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> foreName = value;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; TEXT-INDENT: 21.45pt"><span lang="EN-US">(3) </span><span style="FONT-FAMILY: 黑体">内联</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><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">代码会编译为</span><span lang="EN-US">IL</span><span style="FONT-FAMILY: 宋体">,然后在运行期间进行正常的</span><span lang="EN-US">JIT</span><span style="FONT-FAMILY: 宋体">编译,获得内部可执行代码,并在适当的时候内联代码</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">即
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?