• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

C# 程序员参考--索引属性教程

发布: 2007-7-14 20:11 | 作者: 佚名    | 来源: 网络转载     | 查看: 8次 | 进入软件测试论坛讨论

领测软件测试网 C# 程序员参考--索引属性教程:

本教程展示如何实现使用索引属性的类。索引属性使您可以使用表示类似于数组的若干种不同事物的集合的类。学习本教程以前应完成索引器教程。

示例文件

请参见“索引属性”示例以下载和生成本教程中讨论的示例文件。

教程

假定您要编写一个 Document 类,该类封装非常长的文本章节。为能够方便地实现各种操作(如检查拼写),您可能希望以单词(以及字符)的虚拟数组形式查看文档。

下面的示例展示实现这种类的技术。对于每个“索引属性”,您定义一个嵌套类,该类包含对主类实例的反向引用。主类上的 readonly 字段提供对嵌套类(定义每个虚拟数组)的实例的访问。每个嵌套类定义一个索引器以及其他类似集合的方法(例如 Count 属性)。下面的示例针对“Words”和“Characters”展示这一点。

注意   请慎重使用该技术!仅在使用数组索引操作提供的抽象化能明确阐明使用您的类的代码,并且索引器同时具有“获取”(Get) 和“设置”(Set) 访问器时,才使用该模式。

示例

本示例中定义了 Document 类。使用 WordsCharacters 这两个索引属性在 Document 对象上执行某些文本操作。

// indexedproperty.csusing System;public class Document{    // Type allowing the document to be viewed like an array of words:    public class WordCollection    {        readonly Document document;  // The containing document        internal WordCollection(Document d)        {           document = d;        }        // Helper function -- search character array "text", starting at        // character "begin", for word number "wordCount." Returns false        // if there are less than wordCount words. Sets "start" and        // length" to the position and length of the word within text:        private bool GetWord(char[] text, int begin, int wordCount,                                        out int start, out int length)         {             int end = text.Length;            int count = 0;            int inWord = -1;            start = length = 0;             for (int i = begin; i <= end; ++i)             {                bool isLetter = i < end && Char.IsLetterOrDigit(text[i]);                if (inWord >= 0)                 {                    if (!isLetter)                     {                        if (count++ == wordCount)                         {                            start = inWord;                            length = i - inWord;                            return true;                        }                        inWord = -1;                    }                }                else                 {                    if (isLetter)                        inWord = i;                }            }            return false;        }        // Indexer to get and set words of the containing document:        public string this[int index]         {            get             {                 int start, length;                if (GetWord(document.TextArray, 0, index, out start,                                                           out length))                    return new string(document.TextArray, start, length);                else                    throw new IndexOutOfRangeException();            }            set             {                int start, length;                if (GetWord(document.TextArray, 0, index, out start,                                                          out length))                 {                    // Replace the word at start/length with the                     // string "value":                    if (length == value.Length)                     {                        Array.Copy(value.ToCharArray(), 0,                                  document.TextArray, start, length);                    }                    else                     {                        char[] newText =                             new char[document.TextArray.Length +                                            value.Length - length];                        Array.Copy(document.TextArray, 0, newText,                                                         0, start);                        Array.Copy(value.ToCharArray(), 0, newText,                                              start, value.Length);                        Array.Copy(document.TextArray, start + length,                                   newText, start + value.Length,                                  document.TextArray.Length - start                                                            - length);                        document.TextArray = newText;                    }                }                                    else                    throw new IndexOutOfRangeException();            }        }        // Get the count of words in the containing document:        public int Count         {            get             {                 int count = 0, start = 0, length = 0;                while (GetWord(document.TextArray, start + length, 0,                                               out start, out length))                    ++count;                return count;             }        }    }    // Type allowing the document to be viewed like an "array"     // of characters:    public class CharacterCollection    {        readonly Document document;  // The containing document        internal CharacterCollection(Document d)        {          document = d;         }        // Indexer to get and set characters in the containing document:        public char this[int index]         {            get             {                 return document.TextArray[index];             }            set             {                 document.TextArray[index] = value;             }        }        // Get the count of characters in the containing document:        public int Count         {            get             {                 return document.TextArray.Length;             }        }    }    // Because the types of the fields have indexers,     // these fields appear as "indexed properties":    public readonly WordCollection Words;    public readonly CharacterCollection Characters;    private char[] TextArray;  // The text of the document.     public Document(string initialText)    {        TextArray = initialText.ToCharArray();        Words = new WordCollection(this);        Characters = new CharacterCollection(this);    }    public string Text     {        get         {            return new string(TextArray);         }    }}class Test{    static void Main()    {        Document d = new Document(           "peter piper picked a peck of pickled peppers. How many pickled peppers did peter piper pick?"        );        // Change word "peter" to "penelope":        for (int i = 0; i < d.Words.Count; ++i)         {            if (d.Words[i] == "peter")                 d.Words[i] = "penelope";        }        // Change character "p" to "P"        for (int i = 0; i < d.Characters.Count; ++i)         {            if (d.Characters[i] == 'p')                d.Characters[i] = 'P';        }                Console.WriteLine(d.Text);    }}

输出

PeneloPe PiPer Picked a Peck of Pickled PePPers. How many Pickled PePPers did PeneloPe PiPer Pick?

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网