欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

C#类方法声明where的用法 有大用

where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。
 1.接口约束。
 例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口:

public class MyGenericClass<T> where T:IComparable { }


 2.基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。
 这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。

class MyClassy<T, U>
 where T : class
 where U : struct
{
}


 3.where 子句还可以包括构造函数约束。
 可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:

public class MyGenericClass <T> where T: IComparable, new()
{
 // The following line is not possible without new() constraint:
 T item = new T();
}

new() 约束出现在 where 子句的最后。

 4.对于多个类型参数,每个类型参数都使用一个 where 子句,
 例如:

interface MyI { }
class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: MyI
{
 public void Add(TKey key, TVal val)
 {
 }
}


5.还可以将约束附加到泛型方法的类型参数,例如:

public bool MyMethod<T>(T t) where T : IMyInterface { }


请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:

delegate T MyDelegate<T>() where T : new()


来自  https://www.cnblogs.com/nimorl/p/12579926.html



 2010-10-15  8 views  1 likes     
1        

我真的不知道这是一个C#的东西还是一个asp.net的东西。我正看着这篇文章:http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/,冲进这一行:C#和/或ASP.NET类where子句?            

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class 
           

我是相当新的C#/ ASP.NET,所以我不完全了解这一行。 “TEntity:class”在做什么?我从来没有创建过一个带有“where子句”的类(即使它叫做什么)。

来源                    

2010-10-15 William                    


                   


                   

A    

回答

3        

它使用generics(C#的东西,与ASP.NET无关)。

<TEntity>是泛型类型参数,这意味着您必须指定GenericRepository的类型。

像这样:

var repo = new GenericRepository<Person>(); 
               

其中条款说你提供的类型必须是类。它被称为派生约束。它基本上告诉编译器执行这个约束。

如果将其更改为where TEntity : int,则上述代码将失败。

你会需要这样的:

var repo = new GenericRepository<int>(); 
               

了一份关于<TEntity>,这不是一个关键字/保留字。您可以轻松将其更改为<FooBar>where FooBar : class。它具有T来表示泛型,而Entity指定存储库可以在实体之外工作。

将泛型类型参数更改为对您和您的代码有意义的内容。

顺便说一句 - 那篇文章就像我目前的圣经。 :)

来源                    

2010-10-15 01:32:38 RPM1984                    


                   


                   

+1                        

我明白了。所以“where子句”可以用来强制提供的对象是或者是任何物品的子类。在这种情况下,它是“类”,所以任何类都可以是通用的。因此,如果我要做“:IList”,它只接受实现IList接口的类;正确? – William 2010-10-15 01:54:56                                

+0                        

@William - 完全正确。发现。我们使用泛型来避免重复。如果你没有使用类型参数 - 你需要创建一个PersonRepository,CustomerRepository等重复代码。 – RPM1984 2010-10-15 02:01:59                            

来自  http://cn.voidcc.com/question/p-fkjunsvp-eh.html


C#和/或ASP.NET Class where子句?

我真的不知道这是C#还是asp.net的东西。我正在看这篇文章:http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/并遇到这一行:
public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
我是C#/ ASP.NET的新手,所以我不完全理解这一行。 “TEntity:class”的作用是什么?我从来没有用“where子句”创建一个类(即使是它所谓的)。     
2019-07-08 2 条评论            
分享            

    1 个回复

               

昧伎                    


                   

它使用泛型(C#,与ASP.NET无关)。
<TEntity>
是泛型类型参数,这意味着您必须指定GenericRepository的类型。 像这样:
var repo = new GenericRepository<Person>();
where子句表示您提供的类型必须是类。 它被称为派生约束。它基本上告诉编译器强制执行此约束。 如果您将其更改为
where TEntity : int
,则上述代码将失败。 你需要这个:
var repo = new GenericRepository<int>();
关于
<TEntity>
的注释,这不是关键字/保留字。您可以轻松将其更改为
<FooBar>
where FooBar : class
。它具有指示泛型的T,以及指定存储库工作的实体。 将泛型类型参数更改为对您和您的代码有意义的参数。 顺便说一下 - 那篇文章就像我的圣经一样。 :)     
2019-07-08 0 0                


来自  https://www.orcode.com/question/959317_ka68f1.html


普通分类: