扩展方法的出现与需要向已经存在的数据类型(特别是库和外部类型)添加新功能有关,而不需要更改这些类型的源代码。这在现代.NET应用程序中尤其重要,因为需要额外的便利,但无法修改源类。
问题在于无法扩展类型而不创建继承者或包装器,这导致了复杂的架构和“错误”的继承。
解决方案就是扩展方法。在Visual Basic中,它们作为模块声明,具有标记为 <Extension> 的静态方法。方法的第一个参数总是指向可扩展类型,这使得可以像调用对象的普通成员一样调用该方法。
示例代码:
Imports System.Runtime.CompilerServices Module StringExtensions <Extension> Public Function ToTitleCase(ByVal str As String) As String If String.IsNullOrEmpty(str) Then Return str Return Char.ToUpper(str(0)) & str.Substring(1).ToLower() End Function End Module ' 使用: Dim s As String = "visual basic" Console.WriteLine(s.ToTitleCase()) ' Visual basic
关键特性:
可以通过类名而不是实例来访问扩展方法吗?
可以,扩展方法也可以通过扩展类的类名作为静态方法调用,只需明确指定第一个(this/Me)参数。
示例代码:
StringExtensions.ToTitleCase("test string")
可以通过扩展方法重写(Override)系统方法的行为吗?
不可以,扩展方法不会重写现有的实例方法。如果名称重复,将调用类型的原生方法。
扩展方法可以接受可变数量的参数(ParamArray),例如,用于字符串吗?
可以,在扩展方法中可以使用ParamArray,就像在普通的静态方法中一样。
在大型项目中,为每种类型创建自己的扩展方法,名称重叠且逻辑不同,且没有统一风格。
优点:
缺点:
在模块中仅收集通用且文档明确的扩展,以进行标准类型操作。每个方法的名称清晰指示其用途。
优点:
缺点: