C# in关键字你造吗

原创 2016年08月30日 17:21:49

上下文in关键字大致有三种


第一:在foreach中使用

用于遍历数组或集合foreach 语句对实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口的数组或对象集合中的每个元素重复一组嵌入式语句。 foreach 语句用于循环访问集合,以获取您需要的信息,但不能用于在源集合中添加或移除项,否则可能产生不可预知的副作用。 如果需要在源集合中添加或移除项,请使用 for 循环。
嵌入语句为数组或集合中的每个元素继续执行。 当为集合中的所有元素完成迭代后,控制传递给 foreach 块之后的下一个语句。
可以在 foreach 块的任何点使用 break 关键字跳出循环,或使用 continue 关键字进入循环的下一轮迭代。

int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
        foreach (int element in fibarray)
        {
            System.Console.WriteLine(element);
        }


第二:在linq或linq中的join in中

使用 join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联。  唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。  例如,食品经销商可能具有某种产品的供应商列表以及买主列表。

var innerJoinQuery =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID
    select new { ProductName = prod.Name, Category = category.Name };

第三:泛型接口和委托中的参数

1.对于泛型类型参数,in 关键字指定该类型参数是逆变的。 通过逆变,可以使用与泛型参数指定的派生类型相比,派生程度更小的类型。
2.可以在泛型接口和委托中使用 in 关键字。可以向逆变委托分配同一类型的其他委托,但需使用派生程度较小的泛型类型参数。
3.引用类型支持泛型类型参数中的协变和逆变,但值类型不支持。
4. .NET Framework 4 的 IComparer<T> 接口中,类型 T 是逆变的,因此如果 Employee 继承 Person,则无需使用任何特殊转换方法,就可以将 IComparer(Of Person) 类型的对象指派给 IComparer(Of Employee) 类型的对象。


下例演示如何声明、扩展和实现一个逆变泛型接口。 此外还演示了如何对实现此接口的类使用隐式转换

// Contravariant interface.
interface IContravariant<in A> { }

// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }

// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }

class Program
{
    static void Test()
    {
        IContravariant<Object> iobj = new Sample<Object>();
        IContravariant<String> istr = new Sample<String>();

        // You can assign iobj to istr because
        // the IContravariant interface is contravariant.
        istr = iobj;
    }
}

下例演示如何声明、实例化和调用一个逆变泛型委托。 此外还演示了如何隐式转换委托类型。

// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);

// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }

public void Test()
{

    // Instantiating the delegates with the methods.
    DContravariant<Control> dControl = SampleControl;
    DContravariant<Button> dButton = SampleButton;

    // You can assign dControl to dButton
    // because the DContravariant delegate is contravariant.
    dButton = dControl;

    // Invoke the delegate.
    dButton(new Button()); 
}



版权声明:本文为博主原创文章,未经博主允许不得转载,如果转载请写明出处。

C#中in,out,ref的作用和区别

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键...

C# 协变逆变(泛型修饰符in和out)

in和out用在范型interface和delegate中, 用来支持逆变和协变(in是逆变,out是协变)。协变保留赋值兼容性,逆变与之相反。 下例中,泛型接口类型参数T有out修饰符,所以  ...

c#中泛型的协变与逆变:<in T>详解

MSDN上的demo:http://msdn.microsoft.com/zh-cn/library/dd469484.aspx
  • Joyhen
  • Joyhen
  • 2014年10月17日 16:25
  • 4419

C#参数Sql,如果给IN传参数

in不能用参数赋值 可以用charindex函数代替 SQL code ? 1 SELECT * FROM sys_User WH...
  • kim
  • kim
  • 2014年10月09日 11:00
  • 3152

C# asp.net 中sql like in 参数化

在写项目的时候遇到一个问题,sql 语句进行 like in 参数化,按照正常的方式是无法实现的我们一般的思维是:Like 参数:string strSql = "select * from Pers...

C# 参数化SQL语句中的like和in

在写项目的时候遇到一个问题,sql 语句进行 like in 参数化,按照正常的方式是无法实现的 我们一般的思维是: Like 参数: string strSql = "select * fro...

c#中4个访问修饰符和8个声明修饰符详解

4个访问修饰符(是添加到类、结构或成员声明的关键字)   Public:公有的,是类型和类型成员的访问修饰符。对其访问没有限制。 Internal:内部的,是类型和类型成员的访问修饰符。同一个程...

使用:Comparison委托,为list等集合做自定义排序。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com...
  • yan_hyz
  • yan_hyz
  • 2012年07月24日 18:51
  • 1905

C#语法之{0:C}及其扩展

在学习ASP.NET的过程中遇到了{0,C}这样的小知识点,好奇便研究了一下,记录下来。 C#语法,按货币格式输入第一参数。所用代码为{0,C}。C是Currency的简称。 除次之外还有...

关键字 yield in C#

http://msdn.microsoft.com/zh-cn/library/9k7k7cf0.aspx yield 关键字向编译器指示它所在的方法是迭代器块。编译器生成一个类来实现迭代器块中表示...
  • Lyncai
  • Lyncai
  • 2012年06月19日 11:43
  • 456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# in关键字你造吗
举报原因:
原因补充:

(最多只允许输入30个字)