C#,入门教程(38)——大型工程软件中类(class)修饰词partial的使用方法

上一篇:

C#,入门教程(37)------优秀程序员的修炼之道https://blog.csdn.net/beijinghorn/article/details/125011644

一、大型(工程应用)软件倚重 partial

先说说大型(工程应用)软件对源代码的文件及函数"行"数的基本要求:

(1)每个class文件不要太多行,512行就算多的了;

(2)每个函数的行数也不要太多,256行就不少了;

而实际上,很多 class 却不得不又很多行程序,因而对于(1)而言 partial 就非常重要了。

首先,partial 允许将一个 class 拆分,写到多个 .cs 文件中!

其次,partial 允许大家分工编写 class 的不同部分!

总之,partial 非常有用!

二、一些不太重要的限制

至于下面的一下局限性与限制,大致了解即可:

1、仅适用于类class、接口interface、结构struct,不支持委托delegate、枚举enum;

2、每个部分必须都有修饰符 partial;

3、位于同一个的命名空间namespace;

4、如有部分使用static/abstract/sealed,整个类都被视为static/abstract/sealed;互相不能矛盾;

5、各个部分的基类必须一致;

6、局部类型上的接口具有累加效应。

三、partial 实例

字符串匹配(Pattern Search)有很多算法,各种算法可以写在一个 静态类中。

但应该分别写在不同的 cs 文件,便于维护、协作、管理。

文件1、Legalsoft.Truffer.PatternSearch.KMP.cs

cs 复制代码
using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
	/// <summary>
	/// 字符串匹配(模式搜索)算法集锦
	/// </summary>
	public static partial class PatternSearch
	{
		/// <summary>
		/// 字符串匹配的KMP算法
		/// </summary>
		/// <param name="pat"></param>
		/// <param name="txt"></param>
		public static List<int> KMPSearch(string pattern, string text)
		{
			List<int> result = new List<int>();

			int M = pattern.Length;
			int N = text.Length;

			int[] lps = new int[M];
			int j = 0;

			Build_LPS_Array(pattern, M, lps);

			int i = 0;
			while (i < N)
			{
				if (pattern[j] == text[i])
				{
					j++;
					i++;
				}
				if (j == M)
				{
					result.Add(i - j);
					j = lps[j - 1];
				}

				else if (i < N && pattern[j] != text[i])
				{
					if (j != 0)
					{
						j = lps[j - 1];
					}
					else
					{
						i = i + 1;
					}
				}
			}

			return result;
		}

		/// <summary>
		/// 构造 LPS 数组
		/// 最长后缀数组,Longest Proper Suffix 
		/// </summary>
		/// <param name="pattern"></param>
		/// <param name="M"></param>
		/// <param name="lps"></param>
		private static void Build_LPS_Array(string pattern, int M, int[] lps)
		{
			lps[0] = 0;
			int len = 0;
			int i = 1;
			while (i < M)
			{
				if (pattern[i] == pattern[len])
				{
					len++;
					lps[i] = len;
					i++;
				}
				else
				{
					if (len != 0)
					{
						len = lps[len - 1];
					}
					else
					{
						lps[i] = len;
						i++;
					}
				}
			}
		}
	}
}

PatternSearch 类的另外一个 暴力算法,写在:

文件2、Legalsoft.Truffer.PatternSearch.Native.cs

cs 复制代码
using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
	/// <summary>
	/// 字符串匹配(模式搜索)算法集锦
	/// </summary>
	public static partial class PatternSearch
	{
		/// <summary>
		/// 字符串匹配的暴力算法
		/// </summary>
		/// <param name="text"></param>
		/// <param name="pattern"></param>
		/// <returns></returns>
		public static List<int> NativeSearch(string text, string pattern)
		{
			int M = pattern.Length;
			int N = text.Length;
			int S = N - M;

			List<int> matchs = new List<int>();
			if (S <= 0) return matchs;
			for (int i = 0; i <= S; i++)
			{
				int j = 0;
				while (j < M)
				{
					if (text[i + j] != pattern[j])
					{
						break;
					}
					j++;
				}

				if (j == M)
				{
					matchs.Add(i);
				}
			}

			return matchs;
		}
	}
}

POWER BY 315SOFT.COM &
TRUFFER.CN

相关推荐
wyh要好好学习31 分钟前
C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中
开发语言·c#·wpf
AitTech31 分钟前
C#实现:电脑系统信息的全面获取与监控
开发语言·c#
咩咩觉主1 小时前
尽量通俗易懂地概述.Net && U nity跨语言/跨平台相关知识
unity·c#·.net·.netcore
yngsqq1 小时前
035集——BOUNDARY获取图形外轮廓(CAD—C#二次开发入门)
开发语言·javascript·c#
墨笺染尘缘2 小时前
Unity——对RectTransform进行操作
ui·unity·c#·游戏引擎
IT规划师10 小时前
开源 - Ideal库 - 常用枚举扩展方法(二)
开源·c#·.net core·ideal库·枚举转换
吾与谁归in14 小时前
【C#设计模式(8)——过滤器模式(Adapter Pattern)】
设计模式·c#·过滤器模式
子不语14 小时前
C#程序开发,检测当前电脑已经安装的软件目录
开发语言·c#·安装·列表·软件
一步一个foot-print15 小时前
C# unity 星期几 年月日控制
unity·c#
晨曦_子画19 小时前
C#中:Any() 与 Count,选择哪一个??
开发语言·windows·c#