【学习笔记】C# 泛型

今天学习了一下C#里泛型的使用,在此方法中,首先用一个简单的数组,定义一个class Array来进行数组内,增加数字,查看数组内元素个数,更改某个索引下数组的某个元素。

在此我们发现,如果想进行其他类型的数组的操作,我们需要使用最强大的CV大法进行复制粘贴,使得代码的重用性降低,所以在此,泛型的引入十分重要,泛型的学习心得及解释代码如下:

泛型

  • 使用泛型能够最大限度地重用代码、保护类型安全、提高性能
  • 泛型成员因为类型的不确定性,不能使用算术运算符、比较运算符
  • 类型参数可以有多个,可以是编译器能够识别的任何类型
  • 类型参数的名字不能够随便起,不能重名

  

  1 using System;
  2 //泛型
  3 namespace GenericTypeDemo
  4 {
  5     //使用泛型
  6     //数组类 Array
  7     //泛型类--需要在类名后加上泛型类型
  8     //定义的时候需要用 T 泛型类型表示任意一种类型
  9     //1. 使用泛型能够提高代码重用
 10
 11     //2. 使用泛型时,由于类型不确定,所以我们不能使用算术运算符
 12     //public class Math<T>
 13     //{
 14     //    public T Max(T num1, T num2)
 15     //    {
 16     //        return num1 > num2 ? num1 : num2;
 17     //    }
 18     //}
 19
 20     //T - type
 21     //S/U/V - 第二、三、四种类型
 22     //K/V - key/value
 23     //N - number
 24     public class Array<T/*,S,U,V*/>
 25     {
 26         //索引器
 27         public T this[int index]
 28         {
 29             set { _arr[index] = value; }
 30             get { return _arr[index]; }
 31         }
 32
 33         public int Count
 34         {
 35             get { return _count; }
 36         }
 37
 38         public void Add(T value)
 39         {
 40             _arr[_count] = value;
 41             _count++;
 42         }
 43
 44         public void Log()
 45         {
 46             string str = "当前数组中包含 " + Count + " 个元素:(";
 47             for (int i = 0; i < Count; i++)
 48             {
 49                 str += _arr[i];
 50                 if (i < Count - 1)
 51                 {
 52                     str += ", ";
 53                 }
 54             }
 55             str += ")";
 56             Console.WriteLine(str);
 57         }
 58         public Array()
 59         {
 60             _arr = new T[100];
 61         }
 62         private T[] _arr;
 63         private int _count = 0; //保存当前数组里的元素个数
 64     }
 65
 66     #region
 67     /*
 68     //数组类 Array
 69     public class Array
 70     {
 71         //索引器
 72         public int this[int index]
 73         {
 74             set { _arr[index] = value; }
 75             get { return _arr[index]; }
 76         }
 77
 78         public int Count
 79         {
 80             get { return _count; }
 81         }
 82
 83         public void Add(int value)
 84         {
 85             _arr[_count] = value;
 86             _count++;
 87         }
 88
 89         public void Log()
 90         {
 91             string str = "当前数组中包含 " + Count + " 个元素:(";
 92             for (int i = 0; i < Count; i++)
 93             {
 94                 str += _arr[i];
 95                 if (i < Count - 1)
 96                 {
 97                     str += ", ";
 98                 }
 99             }
100             str += ")";
101             Console.WriteLine(str);
102         }
103         public Array()
104         {
105             _arr = new int[100];
106         }
107         private int[] _arr;
108         private int _count = 0; //保存当前数组里的元素个数
109     }*/
110     #endregion
111
112     class Program
113     {
114         static void Main(string[] args)
115         {
116             //当具体使用的时候,才需要确定作用的类型
117             //Array<int> arr = new Array<int>();
118             Array<float> arr = new Array<float>();
119             arr.Log();
120
121             arr.Add(23.5f);
122             arr.Log();
123
124             arr.Add(432.332f);
125             arr.Log();
126
127             arr[1] = 12.55f;
128             arr.Log();
129
130             #region
131             //Array arr = new Array();
132             //arr.Log();
133
134             //arr.Add(13);
135             //arr.Log();
136
137             //arr.Add(97);
138             //arr.Log();
139
140             //arr.Add(32);
141             //arr.Log();
142
143             //arr[0] = 25;
144             //arr.Log();
145             //Console.WriteLine("arr[1]= " + arr[1]);
146             #endregion
147
148             //int[] arr = new int[3];
149             //arr[0] = 1;
150             //arr[1] = 2;
151             //arr[2] = 3;
152             //Console.WriteLine(arr.Length);
153         }
154     }
155 }
时间: 2024-12-07 22:40:23

【学习笔记】C# 泛型的相关文章

Java学习笔记_26_泛型概述

                                                               泛型概述 在Java中存入容器中的对象再取出时需要转换类型,因为对象加入容器会被转换成Object类型,而取出时要转换成实际类型.但向  下类型转换都 是存在潜在危险的,因此应该尽量避免它们.  Java的泛型: 所谓泛型就是在定义(类.方法.形参.成员变量等等)的时候,指 定它们为通用类型,也就是数据类型可以是任意类型. 泛型为提高大型程序的类型安全和维护带来了很大的潜

Java泛型学习笔记 - (六)泛型的继承

在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: 1 Object obj = new Integer(10); 这其实就是面向对象编程中的is-a关系. 既然上面的代码正确, 那么在泛型中, 也可以使用如下代码: 1 public class Box<T> { 2 private T obj; 3 4 public Box() {} 5 6 public T getObj() { 7 return obj; 8 } 9 10 pub

iOS学习笔记(01) - 泛型

决定新开一坑,在不断学习的同时分享自己的学习历程给大家,既是对自己学习的记录,又希望能对大家提供些微的帮助. 这一篇文章主要来介绍泛型的意义.使用与声明方法等. 1.泛型:限制类型 1.1.泛型使用场景: 1.在集合(数组NSArray.字典NSDictionary.集合NSSet)中使用泛型比较常见. 2.当声明一个类,但是类里面的某些属性的类型不确定的时候,我们才使用泛型. 1.2.泛型书写规范 在类型后面定义泛型:NSMutableArray<UITouch *> dataArray 1

C#学习笔记:泛型委托Action&lt;T&gt;和Fun&lt;TResult&gt;

转自:http://www.cnblogs.com/Joetao/articles/2094271.html 本节学习了泛型委托Action<T>和Fun<TResult>两类特殊的委托,这两个特殊的委托是Dot FrameWrok自带的.结合lambda表达式,可以在写程序时,简洁代码和提高编码效率. (一)Action<T>和Fun<TResult>两个委托的不同点: Action<T>只能委托必须是无返回值的方法 Fun<TResul

Java泛型学习笔记 - (一)泛型的介绍

一.什么是泛型:泛型的作用是用来规定一个类, 接口或方法所能接受的数据的类型. 就像在声明方法时指定参数一样, 我们在声明一个类, 接口或方法时, 也可以指定其"类型参数", 也就是泛型. 不同的是, 声明方法时我们给其参数指定一个值, 而给其泛型指定一个数据类型.二.基本使用方式: 上面的概念啰嗦了许多, 其实我自己写的都累. 最简单有效的学习方法就是用一用嘛: 1 List<String> list = new ArrayList<String>(); 这就

C++学习笔记之泛型算法

先贴个代码 有时间的再补笔记 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //模板类在接收了参数之后会将参数实例化 5 //自然可以接收 vector<string> 和 vector<int> 6 7 template<typename T> void print(T vec) //打印该实例 8 { 9 for(auto it:vec) 10 { 11 cout<<it<&l

黑马程序员——JAVA学习笔记九(泛型)

1,    泛型机制是JAVA5才支持,使用泛型机制编写的代码比那些杂乱地使用Object变量,然后再强制类型转换的代码具有更好的安全性和可读性. 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用,在泛型出来以前,泛型程序设计是继承Object来实现的.但是有缺点:1,当获取一个值必须要强制类型转换.2,没有类型检查错误,运行时才会出错.泛型提供了类型参数,解决了此问题.   2,    定义泛型类(generic class).格式: public class Pair<T, U>

.Net学习笔记----2015-06-25(泛型集合的练习)

1:将一个数组中的奇数放到一个集合中,再将偶数放到另一个集合中,最终将两个集合合并为一个集合,并且奇数显示在左边,偶数显示在右边. 思路: (1)判断数组中元素的奇偶,分别赋值到2个集合中 (2)声明第三个集合,分别传入奇偶2个集合||直接用其中一个集合添加另外一个集合 疑问:如何输出成:“奇数:1,3,5,7 | 偶数:2,4,6,8”? int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; List<int> jiShu = new List<int

【DAY12】第十二天集合&泛型&IO学习笔记

hash:散列 ------------------ Hashset集合内部是通过HashMap进行实现的.使用的是HashMap中key部分. 对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和 自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行 &运算,得到介于0和集合容量值之间一个数字.该数字表示着数组的下标. 也就是该元素应该存放在哪个元素中. Map与Collection -------------- Map与Collection在

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)