【问题标题】:Dividing class file into partial classes affects scope?将类文件划分为部分类会影响范围吗?
【发布时间】:2012-04-03 13:47:27
【问题描述】:

我有一个类库项目,我的命名空间/主类如下所示:

文件:Document.cs

     namespace HtmlEngine 
     {

         public class Document : IDisposable
         { ...

               public class DocumentActionReplaceByTag : IDocumentAction
               {

所有这些都可以正常工作,我在另一个项目/程序集中放置:

using HtmlEngine;

...

DocumentActionReplaceByTag currentDocAction = new HtmlEngine.DocumentActionReplaceByTag("[NEXT_PART]");

而且效果很好。但是,我现在已将该 Document 类文件分成几个文件,分别称为 DocumentActions.cs、DocumentSections.cs,并将主要功能保留在我的 Document.cs 文件中。我在每一个的顶部都放了:

public partial class Document : IDisposable
{

现在,在消费项目中,我收到“无法解析符号 'DocumentActionReplaceByTag'”错误。我仍然有对 HtmlEngine 的使用参考。

我能在网上找到的最接近的东西是这篇文章,它类似地描述了我的困境,但他不太清楚发生这种情况的原因:http://www.daniweb.com/software-development/csharp/threads/140673/understanding-partial-classes

我一直认为部分类是语法糖,它们在编译之前被组合成一个类。我为每个部分类声明重复了接口,不确定这是否是一个因素。

为什么现在超出范围?

【问题讨论】:

    标签: c# scope partial-classes


    【解决方案1】:

    如果我正确理解了您的代码,则创建新 DocumentActionReplaceByTag 的行必须如下所示:

    DocumentActionReplaceByTag currentDocAction = new HtmlEngine.Document.DocumentActionReplaceByTag("[NEXT_PART]");
    

    IDisposable 呢,只能在一个部分文件中指定。

    Glinkot,从提供的代码中,我看到您的 DocumentActionReplaceByTag 类已放入 Document 类中。以下示例显示嵌套类始终可以通过 ParentClass.NestedClass 访问(请注意,我所有的类都在同一个文件中并且代码无法编译)

        namespace SomeNamespace
    {
        public class ParentClass
        {
            public class NestedClass { }
    
                    public void SomeMethod()
                    {
                        // This compiles, since nested class is used inside parent class
                        NestedClass nestedClass = new NestedClass();
                    }
        }
    
        public class AnotherClass
        {
            public AnotherClass()
            {
                // Not compiles since "NestedClass" is defined as nested class
                var nestedClass = new NestedClass();
                // Will compiles
                var nestedClass = new ParentClass.NestedClass();
    
                // Not compiles since "NestedClass" is defined as nested class
                NestedClass nestedClass = new NestedClass();
                // Will compiles
                ParentClass.NestedClass nestedClass = new ParentClass.NestedClass();
            }
        }
    }
    

    如果您有其他情况,请提供更多详细信息。

    【讨论】:

    • 谢谢安德里斯。没错,添加显式引用就可以了,但我想继续访问没有前缀的 DocumentActionReplaceByTag。这就是划分班级之前的工作方式。我确实从其他文件中删除了 IDisposable ,但这仍然没有任何区别。我不能添加“使用 HtmlEngin.Document”,因为这不是命名空间 - 我的问题是为什么它的行为不同(希望我能做些什么来解决它)。谢谢
    • 我添加示例,使用嵌套类。如果您觉得我不理解您的情况,请提供更多详细信息。
    • 嗨,安德里斯。在这种情况下(请参阅原始问题中的 desc),我正在使用来自不同程序集/命名空间的类。当类位于单个文件中时,可以不加限定地实例化嵌套类,但是当我将它划分为部分类时,这不再有效!根据我问题链接中那个人的描述。我不明白为什么我需要用父类来限定每个人。如果归根结底,我只需要重新组合课程,并使用区域。无论如何,也许这样会更好,但我仍然想知道为什么会发生范围变化。
    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 2021-12-01
    • 2020-04-29
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多