问题描述
publicoverrideIEnumerable<ModuleReference>Modules{get{//Pleasefillthismethodwithyourmoduleswithlineslikethis://yieldreturnnewModuleReference(typeof(Module));yieldreturnnewModuleReference(typeof(HelloModule));yieldreturnnewModuleReference(typeof(HelloModule2));}}首先我想问,属性是IEnumerable<>泛型接口类型是什么意思?为什么属性可以是接口类型?为什么这段代码不写成publicoverridelist<ModuleReference>Modules但是我拿到的这段代码,经常用IEnumerable<>泛型接口当成类型修饰符,为什么要这么用呢?这是我十分困惑的还有这里面的get方法中,yieldreturn是什么意思,他到底在做什么?这个属性Modules上文中并没有对应的私有字段。同时,这个属性方法get里只是yieldreturn,并没有出现类似_modules=newModuleReference(typeof(Module));这样的语句还有想知道这样的属性想调用是怎么调用呢
解决方案
本帖最后由 shuxiaolele 于 2016-02-20 23:59:25 编辑
解决方案二:
yieldreturn这个关键字你不能去查下的……我都懒得给你贴链接msdn查下就知道了
解决方案三:
那我贴个链接吧
解决方案四:
有哪位大神能讲讲么?用泛型接口做类型是什么意思?
解决方案五:
引用1楼starfd的回复:
yieldreturn这个关键字你不能去查下的……我都懒得给你贴链接msdn查下就知道了
查了,我没看懂。我是问这段代码写了是什么意思,不是说某个语法
解决方案六:
引用1楼starfd的回复:
yieldreturn这个关键字你不能去查下的……我都懒得给你贴链接msdn查下就知道了
您好,我想问的问题主要是:首先我想问,属性是IEnumerable<>泛型接口类型是什么意思?为什么属性可以是接口类型?为什么这段代码不写成publicoverridelist<ModuleReference>Modules
解决方案七:
IEnumerable是指可用foreach遍历的“集合”。yieldreturn你可以理解为一个虚的结果,只有在foreach内部真正用到某个结果时,才会给真的。不用List是因为没必要。假设有一卖火柴的小女孩,一毛钱一把(5根)。这一把就是IEnumerable<火柴>,大多数情况下你只要能从这把里一根一根的拿出来用好,沒必要在每根火柴上贴上标签,再装入盒子。yieldreturn相当于你买一把火柴后,并没有马上拿到,而是在用的时候(比如:点烟)时,小女孩才一根一根给你。(只要在5根用完前把烟点着,那小女孩就赚了。)
解决方案八:
1.Enumerable<>泛型接口类型--答:就是指一个数据的结构,比如int型,string型,2.为什么属性可以是接口类型答:既然属性可以是int型。为什么不可以是接口类型。它只代表一个数据结构。3.为什么这段代码不写成publicoverridelist<ModuleReference>Modules答:list《T》已经实现了Enumerable<>泛型接口。如果用list。把newModuleReference(typeof(HelloModule));newModuleReference(typeof(HelloModule2));添加到list里面。直接调用foreach效果等同上面的代码。至于为什么不用list。这个不得而知,不过list<t>的内部实现也是调用yieldreturn;4.yieldreturn是什么意思。楼上https://msdn.microsoft.com/zh-cn/library/dscyy5s0.aspx贴出的写得很详细。你只需要知道这个是语法,语法是什么?就是一套c#设计出来就已经规定好的编码规则。整个代码执行的结果就是调用foreach遍历Modules时依次返回newModuleReference(typeof(HelloModule))。newModuleReference(typeof(HelloModule2));
解决方案九:
引用2楼shingoscar的回复:
那我贴个链接吧
非常感谢,您的引用6楼qbilbo的回复:
IEnumerable是指可用foreach遍历的“集合”。yieldreturn你可以理解为一个虚的结果,只有在foreach内部真正用到某个结果时,才会给真的。不用List是因为没必要。假设有一卖火柴的小女孩,一毛钱一把(5根)。这一把就是IEnumerable<火柴>,大多数情况下你只要能从这把里一根一根的拿出来用好,沒必要在每根火柴上贴上标签,再装入盒子。yieldreturn相当于你买一把火柴后,并没有马上拿到,而是在用的时候(比如:点烟)时,小女孩才一根一根给你。(只要在5根用完前把烟点着,那小女孩就赚了。)
我晕,你讲的太形象了。真的,你要是写书绝对好。我看了那么多,都是模模糊糊的,你一句话就把我搞清楚了
解决方案十:
引用7楼qq_34038955的回复:
1.Enumerable<>泛型接口类型--答:就是指一个数据的结构,比如int型,string型,2.为什么属性可以是接口类型答:既然属性可以是int型。为什么不可以是接口类型。它只代表一个数据结构。3.为什么这段代码不写成publicoverridelist<ModuleReference>Modules答:list《T》已经实现了Enumerable<>泛型接口。如果用list。把newModuleReference(typeof(HelloModule));newModuleReference(typeof(HelloModule2));添加到list里面。直接调用foreach效果等同上面的代码。至于为什么不用list。这个不得而知,不过list<t>的内部实现也是调用yieldreturn;4.yieldreturn是什么意思。楼上https://msdn.microsoft.com/zh-cn/library/dscyy5s0.aspx贴出的写得很详细。你只需要知道这个是语法,语法是什么?就是一套c#设计出来就已经规定好的编码规则。整个代码执行的结果就是调用foreach遍历Modules时依次返回newModuleReference(typeof(HelloModule))。newModuleReference(typeof(HelloModule2));
哇,讲的好透彻
解决方案十一:
引用7楼qq_34038955的回复:
1.Enumerable<>泛型接口类型--答:就是指一个数据的结构,比如int型,string型,2.为什么属性可以是接口类型答:既然属性可以是int型。为什么不可以是接口类型。它只代表一个数据结构。3.为什么这段代码不写成publicoverridelist<ModuleReference>Modules答:list《T》已经实现了Enumerable<>泛型接口。如果用list。把newModuleReference(typeof(HelloModule));newModuleReference(typeof(HelloModule2));添加到list里面。直接调用foreach效果等同上面的代码。至于为什么不用list。这个不得而知,不过list<t>的内部实现也是调用yieldreturn;4.yieldreturn是什么意思。楼上https://msdn.microsoft.com/zh-cn/library/dscyy5s0.aspx贴出的写得很详细。你只需要知道这个是语法,语法是什么?就是一套c#设计出来就已经规定好的编码规则。整个代码执行的结果就是调用foreach遍历Modules时依次返回newModuleReference(typeof(HelloModule))。newModuleReference(typeof(HelloModule2));
非常感谢
解决方案十二:
引用3楼shuxiaolele的回复:
有哪位大神能讲讲么?用泛型接口做类型是什么意思?
我感觉你这里是理解错误,其中并不是泛型接口做类型。实际上Modules是一个对象,并不是一个类型。也就说这里是定义了一个满足泛型接口要求的对象。对你的其它内容我说说我的理解,希望对你有帮助://首先我想问,属性是IEnumerable<>泛型接口类型是什么意思?为什么属性可以是接口类型?属性是一个对象,只是通过类型修饰符来进行定义。//为什么这段代码不写成publicoverridelist<ModuleReference>ModulesIEnumerable<T>与LINQ紧密相连,优于list<T>//但是我拿到的这段代码,经常用IEnumerable<>泛型接口当成类型修饰符,为什么要这么用呢?这是我十分困惑的这里体现了IEnumerable<T>的通用性和优越性//还有这里面的get方法中,yieldreturn是什么意思,他到底在做什么?这是以迭代的方式生成了一个集合,使用yieldreturn是编译器对迭代器做的优化。//这个属性Modules上文中并没有对应的私有字段。编译器会自动生成私有字段,是C#3.0以上的一个特性,叫“自动实现的属性”,可以减少编程人员的编码量//同时,这个属性方法get里只是yieldreturn,并没有出现类似_modules=newModuleReference(typeof(Module));这样的语句yieldreturnnewModuleReference(typeof(HelloModule2));在这里已经进行实现。如果是对Modules有疑问的话,其实很多对象并不需要显式初始化,编译器或者设计人员已经隐式完成了。//还有想知道这样的属性想调用是怎么调用呢正常像其它属性一样就行了
解决方案十三:
引用11楼gxmark的回复:
Quote: 引用3楼shuxiaolele的回复:
有哪位大神能讲讲么?用泛型接口做类型是什么意思?我感觉你这里是理解错误,其中并不是泛型接口做类型。实际上Modules是一个对象,并不是一个类型。也就说这里是定义了一个满足泛型接口要求的对象。对你的其它内容我说说我的理解,希望对你有帮助://首先我想问,属性是IEnumerable<>泛型接口类型是什么意思?为什么属性可以是接口类型?属性是一个对象,只是通过类型修饰符来进行定义。//为什么这段代码不写成publicoverridelist<ModuleReference>ModulesIEnumerable<T>与LINQ紧密相连,优于list<T>//但是我拿到的这段代码,经常用IEnumerable<>泛型接口当成类型修饰符,为什么要这么用呢?这是我十分困惑的这里体现了IEnumerable<T>的通用性和优越性//还有这里面的get方法中,yieldreturn是什么意思,他到底在做什么?这是以迭代的方式生成了一个集合,使用yieldreturn是编译器对迭代器做的优化。//这个属性Modules上文中并没有对应的私有字段。编译器会自动生成私有字段,是C#3.0以上的一个特性,叫“自动实现的属性”,可以减少编程人员的编码量//同时,这个属性方法get里只是yieldreturn,并没有出现类似_modules=newModuleReference(typeof(Module));这样的语句yieldreturnnewModuleReference(typeof(HelloModule2));在这里已经进行实现。如果是对Modules有疑问的话,其实很多对象并不需要显式初始化,编译器或者设计人员已经隐式完成了。//还有想知道这样的属性想调用是怎么调用呢正常像其它属性一样就行了
非常感谢您的回复,有一点仍然不明白的是,在这行代码publicoverridelist<ModuleReference>Modules中,ModuleReference是指的一个类型么。引用11楼gxmark的回复:
Quote: 引用3楼shuxiaolele的回复:
有哪位大神能讲讲么?用泛型接口做类型是什么意思?我感觉你这里是理解错误,其中并不是泛型接口做类型。实际上Modules是一个对象,并不是一个类型。也就说这里是定义了一个满足泛型接口要求的对象。对你的其它内容我说说我的理解,希望对你有帮助://首先我想问,属性是IEnumerable<>泛型接口类型是什么意思?为什么属性可以是接口类型?属性是一个对象,只是通过类型修饰符来进行定义。//为什么这段代码不写成publicoverridelist<ModuleReference>ModulesIEnumerable<T>与LINQ紧密相连,优于list<T>//但是我拿到的这段代码,经常用IEnumerable<>泛型接口当成类型修饰符,为什么要这么用呢?这是我十分困惑的这里体现了IEnumerable<T>的通用性和优越性//还有这里面的get方法中,yieldreturn是什么意思,他到底在做什么?这是以迭代的方式生成了一个集合,使用yieldreturn是编译器对迭代器做的优化。//这个属性Modules上文中并没有对应的私有字段。编译器会自动生成私有字段,是C#3.0以上的一个特性,叫“自动实现的属性”,可以减少编程人员的编码量//同时,这个属性方法get里只是yieldreturn,并没有出现类似_modules=newModuleReference(typeof(Module));这样的语句yieldreturnnewModuleReference(typeof(HelloModule2));在这里已经进行实现。如果是对Modules有疑问的话,其实很多对象并不需要显式初始化,编译器或者设计人员已经隐式完成了。//还有想知道这样的属性想调用是怎么调用呢正常像其它属性一样就行了
还有个问题想请教您,请问用IEnumerable<T>做属性或方法的类型修饰符主要是为了干什么,是想让这个属性或方法干什么才这样用的