日期:2014-05-18  浏览次数:20810 次

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的头像一直以来都很耀眼
------解决方案--------------------