跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 泛型方法
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#泛型方法 = '''泛型方法'''是C#中一种强大的编程特性,允许在方法定义中使用类型参数(Type Parameters),从而编写可适用于多种数据类型的通用代码。泛型方法提高了代码的复用性、类型安全性,并减少了装箱和拆箱操作的开销。 == 介绍 == 泛型方法通过在方法签名中声明类型参数(通常用`T`表示)来实现通用性。与普通方法不同,泛型方法可以在调用时动态指定实际类型,而无需为每种类型编写单独的方法。 泛型方法的优势包括: * '''代码复用''':一个泛型方法可以处理多种数据类型。 * '''类型安全''':编译时类型检查避免了运行时类型转换错误。 * '''性能优化''':避免了值类型的装箱和拆箱操作。 == 基本语法 == 泛型方法的定义语法如下: <syntaxhighlight lang="csharp"> 访问修饰符 返回类型 方法名<类型参数>(参数列表) { // 方法体 } </syntaxhighlight> === 示例:简单的泛型方法 === 以下是一个交换两个变量的泛型方法: <syntaxhighlight lang="csharp"> public static void Swap<T>(ref T a, ref T b) { T temp = a; a = b; b = temp; } </syntaxhighlight> '''调用示例:''' <syntaxhighlight lang="csharp"> int x = 10, y = 20; Swap<int>(ref x, ref y); // 显式指定类型 Console.WriteLine($"x: {x}, y: {y}"); // 输出: x: 20, y: 10 string s1 = "Hello", s2 = "World"; Swap(ref s1, ref s2); // 编译器推断类型 Console.WriteLine($"s1: {s1}, s2: {s2}"); // 输出: s1: World, s2: Hello </syntaxhighlight> == 类型约束 == 泛型方法可以通过`where`子句对类型参数施加约束,限制可用的类型。 === 常用约束类型 === {| class="wikitable" |- ! 约束 !! 描述 |- | <code>where T : struct</code> || T必须是值类型 |- | <code>where T : class</code> || T必须是引用类型 |- | <code>where T : new()</code> || T必须有无参构造函数 |- | <code>where T : 基类名</code> || T必须继承自指定基类 |- | <code>where T : 接口名</code> || T必须实现指定接口 |} === 示例:带约束的泛型方法 === <syntaxhighlight lang="csharp"> public static T Max<T>(T a, T b) where T : IComparable<T> { return a.CompareTo(b) > 0 ? a : b; } </syntaxhighlight> '''调用示例:''' <syntaxhighlight lang="csharp"> int maxInt = Max(5, 10); // 10 double maxDouble = Max(3.14, 2.71); // 3.14 string maxString = Max("apple", "orange"); // "orange" </syntaxhighlight> == 实际应用案例 == === 案例1:集合操作 === 泛型方法常用于集合操作,如过滤、转换等: <syntaxhighlight lang="csharp"> public static List<T> Filter<T>(List<T> list, Predicate<T> predicate) { List<T> result = new List<T>(); foreach (T item in list) { if (predicate(item)) result.Add(item); } return result; } </syntaxhighlight> '''使用示例:''' <syntaxhighlight lang="csharp"> List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = Filter(numbers, x => x % 2 == 0); // [2, 4] </syntaxhighlight> === 案例2:工厂模式 === 泛型方法可用于实现类型安全的工厂: <syntaxhighlight lang="csharp"> public static T CreateInstance<T>() where T : new() { return new T(); } </syntaxhighlight> '''使用示例:''' <syntaxhighlight lang="csharp"> var myObject = CreateInstance<MyClass>(); </syntaxhighlight> == 高级主题 == === 泛型方法与重载 === 泛型方法可以与普通方法重载,编译器会优先选择最具体的匹配: <syntaxhighlight lang="csharp"> public void Process(object obj) { /* 处理object */ } public void Process<T>(T obj) { /* 处理泛型 */ } </syntaxhighlight> === 协变与逆变 === 在C# 4.0及更高版本中,泛型方法可以声明为协变(out)或逆变(in): <syntaxhighlight lang="csharp"> public interface IProcessor<in TInput, out TResult> { TResult Process(TInput input); } </syntaxhighlight> == 性能考虑 == 泛型方法相比非泛型方法有以下性能优势: * 避免了值类型的装箱/拆箱 * 减少了类型检查的开销 * 生成的代码针对具体类型进行了优化 == 常见问题与陷阱 == 1. '''类型推断失败''':当编译器无法推断类型时,需要显式指定类型参数 2. '''过度泛化''':不是所有情况都适合使用泛型,有时特定类型的方法更清晰 3. '''约束冲突''':多个约束条件可能互相排斥 == 总结 == 泛型方法是C#中实现代码通用性和类型安全的重要工具。通过合理使用泛型方法,可以: * 减少代码重复 * 提高类型安全性 * 优化性能 * 创建更灵活的API 掌握泛型方法的使用是成为高级C#开发者的重要一步。建议从简单示例开始,逐步尝试更复杂的应用场景。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 高级类特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)