泛型(C# )(转)

泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。[@more@]

原文:http://msdn2.microsoft.com/zh-cn/library/0x6a29h6(VS.80).aspx

泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic,其中包含几个新的基于泛型的集合类。建议面向 2.0 版的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类,如 ArrayList。有关更多信息,请参见 .NET Framework 类库中的泛型(C# 编程指南)

当然,也可以创建自定义泛型类型和方法,以提供自己的通用解决方案,设计类型安全的高效模式。下面的代码示例演示一个用于演示用途的简单泛型链接列表类。(大多数情况下,建议使用 .NET Framework 类库提供的 List 类,而不要自行创建类。)在通常使用具体类型来指示列表中所存储项的类型时,可使用类型参数 T。其使用方法如下:

  • AddHead 方法中作为方法参数的类型。

  • Node 嵌套类中作为公共方法 GetNextData 属性的返回类型。

  • 在嵌套类中作为私有成员数据的类型。

注意,T 可用于 Node 嵌套类。如果使用具体类型实例化 GenericList(例如,作为 GenericList),则所有的 T 都将被替换为 int

C#
// type parameter T in angle brackets
public class GenericList 
{
    // The nested class is also generic on T
    private class Node
    {
        // T used in non-generic constructor
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }
        
        // T as private member data type
        private T data;

        // T as return type of property
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;
    
    // constructor
    public GenericList() 
    {
        head = null;
    }

    // T as method parameter type:
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

下面的代码示例演示客户端代码如何使用泛型 GenericList 类来创建整数列表。只需更改类型参数,即可方便地修改下面的代码示例,创建字符串或任何其他自定义类型的列表:

C#
class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();

        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("nDone");
    }
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7764484/viewspace-903168/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7764484/viewspace-903168/

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
<think>我们正在讨论C#。根据用户请求,需要提供关于C#的概念、使用方法和示例的教程。 根据引用[1],允许编写处理多种数据类的代码,避免重复。定义时使用尖括号<>包含类参数。 引用[2]展示了委托的示例,包括Func和Action。 回答结构: 1. 介绍的概念和优势 2. 类、接口、方法、委托的定义和使用 3. 提供示例代码 注意:代码部分使用Markdown代码块,行内公式用$...$,独立公式用$$...$$(但本主题可能较少涉及数学公式,若有则按规则处理) 同时,生成相关问题。 由于用户要求的是教程,我们将逐步讲解。</think>### C# 教程:概念、使用方法与示例 #### 1. 的概念与优势 C# 的核心特性,允许编写**可处理多种数据类的通用代码**,通过类参数(`<T>`)避免为每种数据类重复编写逻辑。主要优势包括: - **类安全**:编译时检查类错误 - **代码复用**:一套逻辑处理多种数据类 - **性能优化**:避免装箱拆箱操作 - **代码简洁**:减少冗余代码[^1] #### 2. 定义 ##### 类 ```csharp // 定义类 public class GenericBox<T> { private T _content; public GenericBox(T content) => _content = content; public T GetContent() => _content; } // 使用示例 var intBox = new GenericBox<int>(100); var strBox = new GenericBox<string>("Hello Generics"); ``` ##### 接口 ```csharp public interface IRepository<T> { void Add(T entity); T GetById(int id); } // 实现接口 public class UserRepository : IRepository<User> { public void Add(User user) { /* 实现 */ } public User GetById(int id) { /* 实现 */ } } ``` #### 3. 方法 ```csharp // 独立方法 public static T Max<T>(T a, T b) where T : IComparable<T> { return a.CompareTo(b) > 0 ? a : b; } // 使用示例 int maxInt = Max(10, 20); // 推断为 int string maxStr = Max("apple", "orange"); // 推断为 string ``` #### 4. 委托 ```csharp // 定义委托 public delegate TOutput Converter<TInput, TOutput>(TInput input); // 使用示例 Converter<double, int> doubleToInt = d => (int)d; int result = doubleToInt(3.14); // 输出 3 ``` ##### 内置委托(`Func<>`/`Action<>`) ```csharp // Func<T>:有返回值的委托 Func<int, int, int> add = (x, y) => x + y; int sum = add(5, 7); // 输出 12 // Action<T>:无返回值的委托 Action<string> print = msg => Console.WriteLine(msg); print("Hello Action!"); // 输出文本[^2] ``` #### 5. 类约束(`where` 关键字) ```csharp public class DataProcessor<T> where T : class, // 引用类 new(), // 有无参构造函数 IComparable // 实现接口 { public void Process(T data) { var newObj = new T(); // 使用 new() 约束 if(data.CompareTo(newObj) > 0) // 使用 IComparable 约束 { /* 逻辑 */ } } } ``` #### 6. 高级应用场景 1. **集合类**:`List<T>`, `Dictionary<TKey, TValue>` 2. **依赖注入**:`IServiceCollection.AddSingleton<TService>` 3. **异步编程**:`Task<TResult>` 4. **反射**:`Type.GetGenericArguments()` ```csharp // 集合示例 List<DateTime> dates = new List<DateTime>(); dates.Add(DateTime.Now); Dictionary<int, string> idToName = new Dictionary<int, string>(); ``` --- ### 常见问题解答 **Q:与 `object` 类有何区别?** A:在编译时保留类信息,避免装箱拆箱;而 `object` 需要运行时类换,存在性能和安全风险。 **Q:运行时如何获取?** A:通过反射:`typeof(GenericBox<>).MakeGenericType(typeof(int))` **Q:会影响性能吗?** A:不会!在编译时生成具体类,与直接编写类特定代码性能相同。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值