Studies not stops(学无止尽)

本文详细介绍了C#中的泛型概念,包括泛型类、结构、接口、委托及方法等。探讨了泛型类型的成员、泛型接口的实现、泛型委托的应用、泛型方法的重载与重写,以及泛型约束的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#泛型类与结构
C#除可单独声明泛型类型(包括类与结构)外,也可在基类中包含泛型类型的声明。但基类如果是泛型类,它的类型参数要么已实例化,要么来源于子类(同样是泛型类型)声明的类型参数。
class C<U, V> {} //合法
class D: C<string,int>{} //合法
class E<U, V>: C<U, V> {} //合法
class F<U, V>: C<string, int> {} //合法
class G : C<U, V> { } //非法

泛型类型的成员
class C<V>{
public V f1; //声明字段
public D<V> f2; //作为其他泛型类型的参数
public C(V x) {
this.f1 = x;
}
}
泛型类型的成员可以使用泛型类型声明中的类型参数。但类型参数如果没有任何约束,则只能在该类型上使用从System.Object继承的公有成员。

泛型接口
interface IList<T> {
T[] GetElements();
}
interface IDictionary<K,V> {
void Add(K key, V value);
}
// 泛型接口的类型参数要么已实例化,
// 要么来源于实现类声明的类型参数
class List<T> : IList<T>, IDictionary<int, T> {
public T[] GetElements() { return null; }
public void Add(int index, T value) { }
}
泛型委托
delegate bool Predicate<T>(T value);
class X {
static bool F(int i) {...}
static bool G(string s) {...}
static void Main() {
Predicate<string> p2 = G;
Predicate<int> p1 = new Predicate<int>(F);
}
}
泛型委托支持在委托返回值和参数上应用参数类型,这些参数类型同样可以附带合法的约束。
泛型方法简介
• C#泛型机制只支持“在方法声明上包含类型参数”——即泛型方法
• C#泛型机制不支持在除方法外的其他成员(包括属性、事件、索引器、构造器、析构器)的声明上包含类    型参数,但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数
• 泛型方法既可以包含在泛型类型中,也可以包含在非泛型类型中
泛型方法的声明与调用
//不是泛型类,是一个具体的类,这个类不需要泛型类型的实例化
public class Finder {
// 但是是一个泛型方法,请看泛型方法的声明,参数要求泛型化
public static int Find<T> ( T[] items, T item) {
for(int i=0;i<items.Length;i++){
if (items[i].Equals(item)) { return i; }
}
return -1;
}
}
// 泛型方法的调用<int>不是放到Finder后面,而是放在Find后面。
int i=Finder.Find<int> ( new int[]{1,3,4,5,6,8,9}, 6);

泛型方法的重载
class MyClass {
void F1<T>(T[] a, int i); // 不可以构成重载方法
void F1<U>(U[] a, int i);
void F2<T>(int x); //可以构成重载方法
void F2(int x);
//两句申明一样,where字句,T继承A,泛型参数必需要继承A
void F3<T>(T t) where T : A; //不可以构成重载方法
void F3<T>(T t) where T : B;
}
泛型方法的重写
abstract class Base
{
public abstract T F<T,U>(T t, U u) where U: T;
public abstract T G<T>(T t) where T: IComparable;
}
class Derived: Base{
//合法的重写,约束被默认继承,只需要写方法的签名
public override X F<X,Y>(X x, Y y) { }
//非法的重写,指定任何约束都是多余的
//重写的时候,不能写约束,也不添加新的约束,只能继承父类的约束。
public override T G<T>(T t) where T: IComparable {}
}
泛型约束简介
• C#泛型要求对“所有泛型类型或泛型方法的类型参数”的任何假定,都要基于“显式的约束”,以维护
C#所要求的类型安全。
• “显式约束”由where子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”“值类型/引用类型约束”共四种约束。
• “显式约束”并非必须,如果没有指定“显式约束”,泛型类型参数将只能访问System.Object类型中的公有方法。
基类约束
class A { public void F1() {…} }
class B { public void F2() {…} }
class C<S,T>
where S: A // S继承自A
where T: B // T继承自B
{
// 可以在类型为S的变量上调用F1,
// 可以在类型为T的变量上调用F2
….
}
接口约束
interface IPrintable { void Print(); }
interface IComparable<T> { int CompareTo(T v);}
interface IKeyProvider<T> { T GetKey(); }
class Dictionary<K,V>
where K: IComparable<K>
where V: IPrintable, IKeyProvider<K>
{
// 可以在类型为K的变量上调用CompareTo,
// 可以在类型为V的变量上调用Print和GetKey
….
}
构造器约束
class A { public A() { } }
class B { public B(int i) { } }
class C<T>
where T : new()
{
//可以在其中使用T t=new T();
….
}
C<A> c=new C<A>(); //可以,A有无参构造器
C<B> c=new C<B>(); //错误,B没有无参构造器
值类型/引用类型约束
public struct A { … }
public class B { … }
class C<T>
where T : struct
{
// T在这里面是一个值类型

}
C<A> c=new C<A>(); //可以,A是一个值类型
C<B> c=new C<B>(); //错误,B是一个引用类型

总结
• C#的泛型能力由CLR在运行时支持,它既不同于C++在编译时所支持的静态模板,也不同于Java在编译器层面使用“搽拭法”支持的简单的泛型。
• C#的泛型支持包括类、结构、接口、委托共四种泛型类型,以及方法成员。
• C#的泛型采用“基类, 接口, 构造器, 值类型/引用类型”的约束方式来实现对类型参数的“显式约束”,它不支持C++模板那样的基于签名的隐式约束。

Do you like solving technical problems? Are you good at science and math? You might consider it becoming an engineer. Engineers are problem solvers who apply the theories and principles of science and mathematics to research and develop economical solutions to technical problems. Their work is the link between perceived social needs and commercial applications. However, it's always good to let students know what's ahead and help them understand how their choices may impact their life. Here we are providing the pros and cons of an engineering degree. Prose of an engineering degree. Engineering degrees usually dominate the best college degrees lists. It's a bit easier to get a job with an engineering degree than with a humanity's degree. Engineering jobs pay well and are more stable than most other careers. Also, there is a wide variety of job opportunities. If you like solving problems, then the right engineering job will keep you busily happy. You would finally know how things work in real life. You would finally learn the science or engineering behind all machines. You can design and implement your own creation. Engineers often escalate to management positions and earn excellent money over the life of their careers. If a career in research is interesting, an engineering degree can pave the way to further study. An understanding of high level math gives a greater understanding of the world around you. And application of this to real problems can be very satisfying. Abundant job opportunities worldwide. The world will always get more technically advanced, and will need more engineers. Cons of an engineering degree, the engineering coursework can be quite difficult. If you don't have the aptitude for it, then you might not be able to get through it. More time in school than an associates degree. Also, the cost for college will also be relatively high. Often, engineering students have very little opportunity to take business manufacturing, art or writing courses. The amount of stuff you learn at university is negligible to what you do in industry. In industry, you'll probably solve a problem that has never been encountered before. You need to keep learning new stuff to stay current in your field. The work can be stressful, especially when the equipment or structure has the potential to impact human life. Long work hours, it's hard to maintain a good work life balance in the initial phase of an engineering career, workload can be unpredictable and at times very high competitive atmosphere for promotion. Performance is perceived by superiors, determines one's ability to be promoted. Need to do a lot of hard work during studies and also after studies, until you get settled in a good job. Even after that, you have to continue to work hard to keep up with the latest technology. Studying never stops. Well, don't be scared. It is not that difficult as it looks to keep up with the latest technology. The bottom line is, you have to enjoy it. If you like tinkering with electronics, writing computer programs, designing buildings or taking apart engines, then you might enjoy being an engineer. It's a tough decision to make when you're young, but reach out and try to talk to some real engineers. If you're thinking about a career in engineering, it is much easier now with social media to contact people. Thank you for watching this video, and good luck for your career. 生成思维导图
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值