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

相关推荐
九鼎科技-Leo24 分钟前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC1 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
baivfhpwxf20232 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
直裾2 小时前
Scala全文单词统计
开发语言·c#·scala
ZwaterZ3 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue
ZwaterZ5 小时前
el-table-column自动生成序号&&在序号前插入图标
前端·javascript·c#·vue
SRC_BLUE_178 小时前
SQLI LABS | Less-55 GET-Challenge-Union-14 Queries Allowed-Variation 2
oracle·c#·less
yngsqq9 小时前
037集——JoinEntities连接多段线polyline和圆弧arc(CAD—C#二次开发入门)
开发语言·c#·swift
Zԅ(¯ㅂ¯ԅ)9 小时前
C#桌面应用制作计算器进阶版01
开发语言·c#
hccee10 小时前
C#之异步编程
c#