命名空间只有C#/ .NET中的类可见性?

时间:2009-08-03 18:25:53

标签: c# .net

在C#中,您是否只能在其自己的命名空间中看到一个类,而不是在不同的程序集中?这对于不应在别处使用的典型帮助程序类似乎很有用。 (即java调用包私有类)

6 个答案:

答案 0 :(得分:65)

您可以创建类internal,但这只能阻止程序集之外的任何人使用该类。但是,您仍然需要为要执行此操作的每个命名空间创建单独的程序集。我假设这就是想要这样做的原因。

让C#编译器实现命名空间可见性

这里有一篇文章(Namespace visibility in C#),它显示了一种使用部分类作为“假名称空间”形式的方法,您可能会发现它有用。

作者指出,这并不完美,他讨论了这些缺点。主要问题是C#设计人员设计的C#而不是以这种方式工作。这与C#/ .NET中的预期编码实践有很大不同,后者是.NET框架之一最大的优势。

这是一个巧妙的技巧......现在 这样做。

答案 1 :(得分:27)

我认为你想要的不可能。

答案 2 :(得分:19)

内部是组装(严格来说是模块)隐私。它对命名空间可见性没有影响。

从同一程序集中的其他类实现类隐私的唯一方法是将类作为内部类。

此时如果该类是私有的,则对于该类或外部类本身中的任何内容都是不可见的。

如果受到保护,那么每个人都可以看到它在私有时可以看到它,但外层类的子类也可以看到它。

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}

实质上,实现所需内容的唯一方法是使用外部类作为命名空间的一种形式并限制在该类中。

答案 3 :(得分:0)

如果你有一个程序集,你可以根据需要在该程序集中定义任意数量的名称空间,但无论你在IDE中应用什么修饰符,你总能看到其他名称空间中的类。

答案 4 :(得分:0)

不确定它是否可以直接使用,但是伪造它的一些好方法是:

1)需要这类东西的类是否从一个具有辅助类作为内部类的类继承。

2)使用扩展方法,然后仅引用命名空间中的扩展方法。

答案 5 :(得分:0)

不,这是可能的。您可以在另一个程序集中使用内部类。 例如,我有一个位于 SharMillSoft.Core 程序集中的内部字符串扩展类,如果我想在另一个名为 SharpMilSoft.Extension 的程序集中使用它,我必须使用如下程序集属性:

using System;
using System.Linq;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("SharpMilSoft.Extensions")]

namespace SharpMilSoft.Core.Extensions.Strings.Public
{
    internal static class SharpStringExtensions
    {
        public static bool IsNullOrEmpty(this string data)
        {
            return string.IsNullOrEmpty(data);
        }
    }
}

我在 SharpMilSoft.Extension 程序集中使用这个类,如下所示:

namespace SharpMilSoft.Extensions.Strings
{
    public static class SharpStringExtensions
    {
        public static bool IsNullOrEmpty(this string data)
        {
            return Core.Extensions.Strings.Public.SharpStringExtensions.IsNullOrEmpty(data);
        }
    }
}

注意:那么SharpMilSoft.Extensions程序集将成为SharpMilSoft.Core程序集的好友程序集

关于朋友聚会的更多细节,您可以访问此链接:Friend assemblies