0

我正在从 Tutorialspoint.com 进行 C# 封装。我读了这个

Public、Private、Protected 和 Nothing 有什么区别?1
来自 Stackoverflow 的问题。我阅读了答案,并且理解了 teoric 中的访问说明符。现在我想在 Visual Studio 中用这个主题制作控制台应用程序。

上市

类型或成员可以由同一程序集或引用它的另一个程序集中的任何其他代码访问。

私人的

类型或成员只能由同一类或结构中的代码访问。

受保护

类型或成员只能由同一类或结构中的代码或派生类中的代码访问。

内部的

类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集中访问。

受保护的内部

同一程序集中的任何代码或另一个程序集中的任何派生类都可以访问该类型或成员。

具有公共访问说明符的变量或方法可以从相同的程序集和不同的程序集访问。但这个车站在内部描述上有所不同。内部类型变量和方法只能访问相同的程序集,但不能访问 C# 中的不同程序集。我想在 C# 中测试这个站。所以我创建了两个项目并在彼此之间调用方法或变量。

我的项目层次结构

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TutorialsPoint.Encapsulation
{
   public class PublicEncapsulation
    {
        //member variables
        public double length;
        public double width;


        public double GetArea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }

    }
}

上面的代码是我的“PublicEncapsulation.cs”,我应该从其他程序集中调用它的成员。我的其他程序集项目的类是 Program.cs。我想从 Program.cs(其他程序集)连接 PublicEncapsulation.cs 的成员。如何从 c# 中的其他程序集执行此调用操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
using System.Collections;

namespace CallOtherAssemblyVariablesOrMethods
{
    class Program
    {
        static void Main(string[] args)
        {
            /*Call PublicEncapsulation.cs's members in there.*/
        }
    }
}

上面的类是 Program.cs。我想在这里调用其他组件 PublicEncapsulation.cs 的成员。

4

2 回答 2

3

我猜在你的 Program.cs 中你有这样的东西:

var typeFromOtherAssembly = new InternalEncapsulation();

// Here you expect a compiler error:
var area = typeFromOtherAssembly.GetArea();

// This should return a string.
var details = typeFromOtherAssembly.Display();

您认为newandDisplay()会起作用,并且(内部)GetArea()调用会显示编译器错误:

“InternalEncapsulation”不包含“GetArea”的定义,并且找不到接受“InternalEncapsulation”类型的第一个参数的扩展方法“GetArea”(您是否缺少 using 指令或程序集引用?)

但是您没有为InternalEncapsulation该类指定访问修饰符,因此它是internal

如果未指定访问修饰符,则默认为 Internal。

所以在new InternalEncapsulation你得到另一个编译器错误:

InternalEncapsulation由于其保护级别而无法访问

因此,您需要将其公开:

public class InternalEncapsulation
于 2015-06-06T19:40:58.053 回答
0

2天前我有一个简单的问题。我用 Stackoverflow 解决了我的问题。我想看看内部访问说明符和公共访问说明符之间的区别。然后我创建了两个项目来看看它们的区别。如果我可以调用公共方法并且不能从其他程序集中调用内部方法,那么 C# 控制台应用程序支持理论知识。我想这样做。但我看不到其他项目的公共成员。然后我在 如何将一个 C# 项目中的类与另一个 C# 项目 教程一起使用中找到了解决方案。我应该通过右键单击在项目中添加参考。

解决步骤

1. 在“解决方案资源管理器”树中,展开“CallOtherAssemblyVariablesOrMethods”项目,然后右键单击该项目并从菜单中选择“添加引用”。

2. 在“AddReference”对话框中,选择“Projects”选项卡并选择“TutorialsPoint”项目。

3. 如果您使用命名空间,则需要通过 在“TutorialsPoint”中的文件中添加“using”语句来导入“CallOtherAssemblyVariablesOrMethods”类型的命名空间。

非常感谢大家...

于 2015-06-08T20:53:52.333 回答