Mono源码学习笔记:Console类(三)
Buffer 类 (public static class)
以下就是 mcs/class/corlib/System/Buffer.cs:
001: //
002: // System.Buffer.cs
003: //
004: // Authors:
005: // Paolo Molaro (lupus@ximian.com)
006: // Dan Lewis (dihlewis@yahoo.co.uk)
007: //
008: // (C) 2001 Ximian, Inc. http://www.ximian.com
009: //
010:
011: //
012: // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
013: //
014: // Permission is hereby granted, free of charge, to any person obtaining
015: // a copy of this software and associated documentation files (the
016: // "Software"), to deal in the Software without restriction, including
017: // without limitation the rights to use, copy, modify, merge, publish,
018: // distribute, sublicense, and/or sell copies of the Software, and to
019: // permit persons to whom the Software is furnished to do so, subject to
020: // the following conditions:
021: //
022: // The above copyright notice and this permission notice shall be
023: // included in all copies or substantial portions of the Software.
024: //
025: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
026: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
027: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
028: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
029: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
030: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
031: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
032: //
033:
034: using System.Runtime.CompilerServices;
035: using System.Runtime.InteropServices;
036:
037: namespace System {
038: [ComVisible (true)]
039: public static class Buffer {
040:
041: public static int ByteLength (Array array)
042: {
043: // note: the other methods in this class also use ByteLength to test for
044: // null and non-primitive arguments as a side-effect.
045:
046: if (array == null)
047: throw new ArgumentNullException ("array");
048:
049: int length = ByteLengthInternal (array);
050: if (length < 0)
051: throw new ArgumentException (Locale.GetText ("Object must be an array of primitives."));
052:
053: return length;
054: }
055:
056: public static byte GetByte (Array array, int index)
057: {
058: if (index < 0 || index >= ByteLength (array))
059: throw new ArgumentOutOfRangeException ("index", Locale.GetText(
060: "Value must be non-negative and less than the size of the collection."));
061:
062: return GetByteInternal (array, index);
063: }
064:
065: public static void SetByte (Array array, int index, byte value)
066: {
067: if (index < 0 || index >= ByteLength (array))
068: throw new ArgumentOutOfRangeException ("index", Locale.GetText(
069: "Value must be non-negative and less than the size of the collection."));
070:
071: SetByteInternal (array, index, value);
072: }
073:
074: public static void BlockCopy (Array src, int srcOffset, Array dst, int dstOffset, int count)
075: {
076: if (src == null)
077: throw new ArgumentNullException ("src");
078:
079: if (dst == null)
080: throw new ArgumentNullException ("dst");
081:
082: if (srcOffset < 0)
083: throw new ArgumentOutOfRangeException ("srcOffset", Locale.GetText(
084: "Non-negative number required."));
085:
086: if (dstOffset < 0)
087: throw new ArgumentOutOfRangeException ("dstOffset", Locale.GetText (
088: "Non-negative number required."));
089:
090: if (count < 0)
091: throw new ArgumentOutOfRangeException ("count", Locale.GetText (
092: "Non-negative number required."));
093:
094: // We do the checks in unmanaged code for performance reasons
095: bool res = BlockCopyInternal (src, srcOffset, dst, dstOffset, count);
096: if (!res) {
097: // watch for integer overflow
098: if ((srcOffset > ByteLength (src) - count) || (dstOffset > ByteLength (dst) - count))
099: throw new ArgumentException (Locale.GetText (
100: "Offset and length were out of bounds for the array or count is greater than " +
101: "the number of elements from index to the end of the source collection."));
102: }
103: }
104:
105: // private
106: [MethodImplAttribute (MethodImplOptions.InternalCall)]
107: private extern static int ByteLengthInternal (Array array);
108:
109: [MethodImplAttribute (MethodImplOptions.InternalCall)]
110: private extern static byte GetByteInternal (Array array, int index);
111:
112: [MethodImplAttribute (MethodImplOptions.InternalCall)]
113: private extern static void SetByteInternal (Array array, int index, int value);
114:
115: [MethodImplAttribute (MethodImplOptions.InternalCall)]
116: internal extern static bool BlockCopyInternal (Array src, int src_offset, Array dest, int dest_offset, int count);
117: }
118: }
上述源程序定义了 Buffer 类。
这是一个公共静态类。用于操作基元类型的数组,数组中的每一个基元类型都被视为一系列字节。它的公共成员仅仅有下面四个公共静态方法,这些方法比 System.Array 类中相似的方法提供更好的性能:
- BtyeLength: public static。返回指定数组中的字节数。(41 – 54 行)
- GetByte: public static,在指定数组中检索指定位置处的字节。(56 – 63 行)
- SetByte: public static,将指定的值分配给指定数组中特定位置处的字节。(65 – 72 行)
- BlockCopy: public static,将指定数目的字节从起始于特定偏移量的源数组拷贝到起始于特定偏移量的目标数组。(74 – 103 行)
上述四个方法不过在作一些必要的參数检查后调用下述四个非公共的外部静态方法:
- ByteLengthInternal: private extern static (106 – 107 行)
- GetByteInternal: private extern static (109 – 110 行)
- SetByteInternal: private extern static (112 –114 行)
- BlockCopyInternal: internal extern static (115 – 116 行)
上述四个方法都被标记为 [MethodImpl(MethodImplOptions.InternalCall)],也就是说。这四个方法都是对在公共语言执行时本身内部实现的方法的调用。
请注意
BlockCopyInternal 方法是 internal 的,而不象其它三个方法那样是 private 的。实际上。在 Console.dll 项目中,BlockCopyInternal 方法在 TermInfoReader.cs 中被调用。
而 Buffer 类的四个公共方法在 Console.dll 项目中都没有被调用。
IConsoleDriver 接口 (internal interface)
以下就是 mcs/class/corlib/System/IConsoleDriver.cs:
01: //
02: // System.IConsoleDriver
03: //
04: // Author:
05: // Gonzalo Paniagua Javier (gonzalo@ximian.com)
06: //
07: // (C) 2005 Novell, Inc. (http://www.novell.com)
08: //
09:
10: // Permission is hereby granted, free of charge, to any person obtaining
11: // a copy of this software and associated documentation files (the
12: // "Software"), to deal in the Software without restriction, including
13: // without limitation the rights to use, copy, modify, merge, publish,
14: // distribute, sublicense, and/or sell copies of the Software, and to
15: // permit persons to whom the Software is furnished to do so, subject to
16: // the following conditions:
17: //
18: // The above copyright notice and this permission notice shall be
19: // included in all copies or substantial portions of the Software.
20: //
21: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28: //
29: namespace System {
30: interface IConsoleDriver {
31: ConsoleColor BackgroundColor { get; set; }
32: int BufferHeight { get; set; }
33: int BufferWidth { get; set; }
34: bool CapsLock { get; }
35: int CursorLeft { get; set; }
36: int CursorSize { get; set; }
37: int CursorTop { get; set; }
38: bool CursorVisible { get; set; }
39: ConsoleColor ForegroundColor { get; set; }
40: bool KeyAvailable { get; }
41: bool Initialized { get; }
42: int LargestWindowHeight { get; }
43: int LargestWindowWidth { get; }
44: bool NumberLock { get; }
45: string Title { get; set; }
46: bool TreatControlCAsInput { get; set; }
47: int WindowHeight { get; set; }
48: int WindowLeft { get; set; }
49: int WindowTop { get; set; }
50: int WindowWidth { get; set; }
51:
52: void Init ();
53: void Beep (int frequency, int duration);
54: void Clear ();
55: void MoveBufferArea (int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight,
56: int targetLeft, int targetTop, Char sourceChar,
57: ConsoleColor sourceForeColor, ConsoleColor sourceBackColor);
58:
59: ConsoleKeyInfo ReadKey (bool intercept);
60: void ResetColor ();
61: void SetBufferSize (int width, int height);
62: void SetCursorPosition (int left, int top);
63: void SetWindowPosition (int left, int top);
64: void SetWindowSize (int width, int height);
65: string ReadLine ();
66: }
67: }
上述源程序定义了 IConsoleDriver 接口。
上述源程序第 30 行没有明白指出訪问修饰符。那么这个接口默觉得 internal 的,仅仅能在本程序集中使用。IConsoleDriver 接口是我在这个系列学习笔记第一篇的末尾指出的六个最核心的类型之中的一个,它规定了全部的控制台都必须实现的基本功能。
IConsoleDriver
共定义了 11 个方法。20 个属性,当中 6 个是仅仅读属性。
NullConsoleDriver 类 (internal class)
以下就是 mcs/class/corlib/System/NullConsoleDriver.cs:
001: //
002: // System.NullConsoleDriver
003: //
004: // Author:
005: // Gonzalo Paniagua Javier (gonzalo@ximian.com)
006: //
007: // (C) 2006 Novell, Inc. (http://www.novell.com)
008: //
009:
010: // Permission is hereby granted, free of charge, to any person obtaining
011: // a copy of this software and associated documentation files (the
012: // "Software"), to deal in the Software without restriction, including
013: // without limitation the rights to use, copy, modify, merge, publish,
014: // distribute, sublicense, and/or sell copies of the Software, and to
015: // permit persons to whom the Software is furnished to do so, subject to
016: // the following conditions:
017: //
018: // The above copyright notice and this permission notice shall be
019: // included in all copies or substantial portions of the Software.
020: //
021: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
022: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
023: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
024: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
025: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
026: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
027: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
028: //
029: #if !NET_2_1
030: using System.Runtime.InteropServices;
031: using System.Text;
032: namespace System {
033: class NullConsoleDriver : IConsoleDriver {
034: public ConsoleColor BackgroundColor {
035: get { return ConsoleColor.Black; }
036: set {
037: }
038: }
039:
040: public int BufferHeight {
041: get { return 0; }
042: set {}
043: }
044:
045: public int BufferWidth {
046: get { return 0; }
047: set {}
048: }
049:
050: public bool CapsLock {
051: get { return false; }
052: }
053:
054: public int CursorLeft {
055: get { return 0; }
056: set {}
057: }
058:
059: public int CursorSize {
060: get { return 0; }
061: set { }
062: }
063:
064: public int CursorTop {
065: get { return 0; }
066: set {}
067: }
068:
069: public bool CursorVisible {
070: get { return false; }
071: set {}
072: }
073:
074: public ConsoleColor ForegroundColor {
075: get { return ConsoleColor.Black; }
076: set {}
077: }
078:
079: public bool KeyAvailable {
080: get { return false; } // FIXME: throw?
081: }
082:
083: public bool Initialized {
084: get { return true; }
085: }
086:
087: public int LargestWindowHeight {
088: get { return 0; }
089: }
090:
091: public int LargestWindowWidth {
092: get { return 0; }
093: }
094:
095: public bool NumberLock {
096: get { return false; }
097: }
098:
099: public string Title {
100: get { return ""; }
101: set {}
102: }
103:
104: public bool TreatControlCAsInput {
105: get { return false; }
106: set {}
107: }
108:
109: public int WindowHeight {
110: get { return 0; }
111: set {}
112: }
113:
114: public int WindowLeft {
115: get { return 0; }
116: set {}
117: }
118:
119: public int WindowTop {
120: get { return 0; }
121: set {}
122: }
123:
124: public int WindowWidth {
125: get { return 0; }
126: set {}
127: }
128:
129: public void Beep (int frequency, int duration)
130: {
131: }
132:
133: public void Clear ()
134: {
135: }
136:
137: public void MoveBufferArea (int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight,
138: int targetLeft, int targetTop, Char sourceChar,
139: ConsoleColor sourceForeColor, ConsoleColor sourceBackColor)
140: {
141: }
142:
143: public void Init ()
144: {
145: }
146:
147: public string ReadLine ()
148: {
149: return null;
150: }
151:
152: public ConsoleKeyInfo ReadKey (bool intercept)
153: {
154: return ConsoleKeyInfo.Empty;
155: }
156:
157: public void ResetColor ()
158: {
159: }
160:
161: public void SetBufferSize (int width, int height)
162: {
163: }
164:
165: public void SetCursorPosition (int left, int top)
166: {
167: }
168:
169: public void SetWindowPosition (int left, int top)
170: {
171: }
172:
173: public void SetWindowSize (int width, int height)
174: {
175: }
176: }
177: }
178: #endif
上述源程序定义了 NullConsoleDriver 类。整个源程序(除了开头的凝视以外)被第 29 行的“#if !NET_2_1” 和第 178 行的“#endif”预处理指令括了起来,表明该类不能用在 Moonlight 中,实际上 Moonlight 是应用于 Web
的,不须要控制台的概念。
这里的 NET_2_1 表示 .NET 2.1。而 Moonlight 是基于 .NET 2.1 的,详细请參见:MoonlightNotes。
从上述源程序能够看出,该类的全部成员都是 public 的。并且刚好有 31 个成员,不过满足 IConsoleDriver 接口的要求。
第 34 行到第 127 行是 20 个属性,这些属性的 set 方法(假设不是只读属性的话)都是空的,get 方法也不过返回空字符串、零、null、false、true、或者 ConsoleColor.Black。
第 129 行到第 176 行是 11 个方法,这些方法或者是空的,或者只返回 null 或者 ConsoleKeyInfo.Empty。
NullConsoleDriver 类实践了 Null Object 设计模式。
在 Console.dll 项目中,NullConsoleDriver 类仅在 ConsoleDriver.cs 中被使用过一次。
Mono源码学习笔记:Console类(三)的更多相关文章
- Mono源码学习笔记:Console类(四)
NullStream 类 (internal class) 以下就是 mcs/class/corlib/System.IO/NullStream.cs: 01: namespace System.IO ...
- Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类
Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...
- async-validator 源码学习笔记(三):rule
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 rule 主要实现的是校验规则,文件结构为下图: 一.rul ...
- jquery源码学习笔记三:jQuery工厂剖析
jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- async-validator 源码学习笔记(五):Schema
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 3.async-validator 源码学习笔记(三):ru ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...
- JDK源码学习笔记——LinkedHashMap
HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...
随机推荐
- 简单实现ToolStripMenuItem(菜单栏)的单选效果
来源:http://www.97world.com/archives/2194 这几天在写又拍云的客户端,老实说确实学到了不少东西!接下来的几天我会把一些技巧或者原来没有接触过的一些东西发上来,算是复 ...
- Google Breakpad 完全解析(二) —— Windows前台实现篇
原创文章,转载请标明出处:Soul Apogee (http://bigasp.com),谢谢. 好,看完了如何使用breakpad,我们现在看看breakpad在Windows下到底是如何实现的呢? ...
- Traefik访问master节点不通的问题定位
问题 部署traefik到客户节点的对外访问节点后,发现日志里面报错 类似于 E0122 :: reflector.go:] k8s.io/dns/vendor/k8s.io/client-go/to ...
- 微信自动抢红包android实现
AccessibilityService-微信自动抢红包 2018年02月01日 16:09:06 阅读数:1757 在领导发红包的时候,看到有些同事在1s.2s抢到红包,为什么他们能够这么快?一定是 ...
- iOS:LKDBHelper实体对象映射数据库-第三方框架(在FMDB的基础上进行二次封装)
一 插件简介: 其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM 全面支持 NSArray,NSDictionary, Mode ...
- arithmetic-slices
https://leetcode.com/problems/arithmetic-slices/ public class Solution { public int numberOfArithmet ...
- XssEncode
0x00 闲扯 好吧继上一篇文章之后,就没发文章了!(其实是一直在写但是写的很少还凑不起一篇文章而已) 但是这几天对插件进行了一定的改良了 因为在自己在实际的XSS过程中也发现了自己的插件 还不够强大 ...
- trilinear filter
之前对三线型过滤理解有些问题更新一下 三线性采样点 一次sample采样点是8 (u,v,d) d是个分数 作为权重 miplevel floor(d)向上取整 在这级mipmap上用uv 采样4个点 ...
- ray tracing/shadow,reflection, caustic
看了一下午终于明白raytracing的算法了 不知道这次能记住多久 ssr我又完全不记得了 按照Henrik所说 理解raytracing的核心在于,它是从Eye到light反着走的 需要一个前序的 ...
- Strategy Pattern(策略模式)
Head First定义: 策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式的设计原则主要有三个: 找出应用中可能需要变化的部分,把它们独 ...