首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 语法不能理解。解决方法

2012-04-07 
C# 语法不能理解。下面的代码是从 .net 库提出来的,读不懂 求解释。C# codeusing System.Runtime.InteropSer

C# 语法不能理解。
下面的代码是从 .net 库提出来的,读不懂 求解释。

C# code
using System.Runtime.InteropServices;namespace System.Collections{    // 摘要:    //     Exposes the enumerator, which supports a simple iteration over a non-generic    //     collection.    [ComVisible(true)] //[1] 这个标志是什么意思    [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] //[2] 这个标志是什么意思    public interface IEnumerable    {        // 摘要:        //     Returns an enumerator that iterates through a collection.        //        // 返回结果:        //     An System.Collections.IEnumerator object that can be used to iterate through        //     the collection.        [DispId(-4)] //[3] 这个标志是什么意思        IEnumerator GetEnumerator();    }}


谁能说说? 谢谢了!!!!!

说说 那三处?
//[1]
//[2]
//[3]

[解决办法]
[ComVisible(true)] //[1] 这个标志是什么意思 com 可见
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] //[2] 这个标志是什么意思 这个接口的guid ,因为com 那时还没有 .net ,类型信息要用 guid 来查找
public interface IEnumerable
{
// 摘要:
// Returns an enumerator that iterates through a collection.
//
// 返回结果:
// An System.Collections.IEnumerator object that can be used to iterate through
// the collection.
[DispId(-4)] //[3] 这个标志是什么意思 跟自动话有关,具体查idispatch 接口



[解决办法]
探讨

[ComVisible(true)] //[1] 这个标志是什么意思 com 可见
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] //[2] 这个标志是什么意思 这个接口的guid ,因为com 那时还没有 .net ,类型信息要用 guid 来查找
public interface IEnumerable
{
……

[解决办法]
和C#语法没有关系,一些Attribute,是COM包装器需要的,至于COM,没办法几句话说清楚。
[解决办法]
不是COM的Attribute,而是这是Attribute,用来给COM互操作包装类提供额外的元数据(metadata)。

要看懂COM,需要C++语言的基础,对COM本身的了解(这些东西没有什么道理,来自微软十几年前的一些约定,甚至更早追溯到OLE时代),有一本叫《COM本质论》的书专门说这个。IDispatch是COM自动化的接口,另外还有一个著名的IUnknown接口,以及其他的接口,是在IDL(接口定义语言文件)中描述的,并且被编译器装配起来。这些COM接口非C#里面我们说的接口,虽然概念上是有联系的,但是实现上没有什么关系。

COM学起来是一个非常庞大的东西,而且用C#的话,大部分细节都被隐藏起来,不过要刨根问底,这些东西又不是很容易讲清楚的。只有IE/Shell开发、VBA插件、编写ActiveX部件或者ActiveX文档,Addins程序等等地方才需要这些知识。说实话,这些东西用得越来越少,这些技术也逐渐边缘化了。
[解决办法]
之所以这里让 IEnumerable 对COM可见,是互操作的需要,使得那些ActiveX部件也可以兼容 IEnumerable 类型。
[解决办法]
在你眼里,IEnumerable的定义应该是这个样子的

using System.Runtime.InteropServices;
namespace System.Collections
{
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
}

知道这些就足够了
[解决办法]
1,2,3都不必说,lz去看一下com的接口规范就明白了

这3个都是按照com的接口规范标准的声明,至于原理!其实没有任何原理,也没有任何理由,当初那个规范标准那么要求的,所以就按那个要求做。

对于规范,要求来说不必说原理了,如果我要求你只能传bool值给我,那么你就不能传int给我,这中间没有任何道理可言
[解决办法]
接口只是接口,他并不带实现

所以他的实现在具体类型上

比如List<string> 的就在List<T> 这个类里面
[解决办法]
抛开那些版本判断、异常处理等等额外的东西不谈,这个代码是很容易理解的。

你可以看《设计模式》的迭代器模式,一个迭代器由三个基本操作组成,分别是重置迭代器,取当前,将游标移动到下一个(并判断是否到结尾)。
[解决办法]
lz的头像一直以来都很耀眼
------解决方案--------------------


lz的发帖一直很绚烂
[解决办法]
lz的行为一直不像是个技术人员。
[解决办法]

探讨
也就是说,
如果我想写一个自已的 数据集管现器, 要让它可以实现 foreach 遍历。
那就
要 实现IEnumerable 接口,
要 实现IEnumerable 接口就要实现 GetEnumerator 方法
而 GetEnumerator 方法 又要返回 Enumerator<T> 实例化的对象。
而 Enumerator<T> 类型 又是一个 《迭代器》
《迭代器》……

[解决办法]
探讨

也就是说,
如果我想写一个自已的 数据集管现器, 要让它可以实现 foreach 遍历。
那就
要 实现IEnumerable 接口,
要 实现IEnumerable 接口就要实现 GetEnumerator 方法
而 GetEnumerator 方法 又要返回 Enumerator<T> 实例化的对象。
而 Enumerator<T> 类型 又是一个 《迭代器》
《迭代……

[解决办法]
好专业啊。
[解决办法]
看不懂
[解决办法]
探讨
也就是说,
如果我想写一个自已的 数据集管现器, 要让它可以实现 foreach 遍历。
那就
要 实现IEnumerable 接口,
要 实现IEnumerable 接口就要实现 GetEnumerator 方法
而 GetEnumerator 方法 又要返回 Enumerator<T> 实例化的对象。
而 Enumerator<T> 类型 又是一个 《迭代器》
《迭代器》……

[解决办法]
能用不就完了嘛
[解决办法]
探讨
不是COM的Attribute,而是这是Attribute,用来给COM互操作包装类提供额外的元数据(metadata)。

要看懂COM,需要C++语言的基础,对COM本身的了解(这些东西没有什么道理,来自微软十几年前的一些约定,甚至更早追溯到OLE时代),有一本叫《COM本质论》的书专门说这个。IDispatch是COM自动化的接口,另外还有一个著名的IUnknown接口,以及其他的接口,……

[解决办法]
COM组件里面有这些属性,应用的时候需要使用。

热点排行