在C#中,如何使用来自不同程序集的公共类成员(方法或变量)

时间:2015-06-06 19:37:19

标签: c# .net .net-assembly access-specifier class-members

我正在从Tutorialspoint.com开始使用C#封装。我从Stackoverflow上读到了这个

What is the difference between Public, Private, Protected, and Nothing?1
的问题。我读了答案,我理解teoric中的访问说明符。现在我想在visual studio中使用这个主题制作控制台应用程序。

  

公共

     
    

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

  
     

私有

     
    

只能通过相同类或结构中的代码访问类型或成员。

  
     

保护

     
    

只能通过相同类或结构中的代码或派生类访问类型或成员。

  
     

内部

     
    

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

  
     

受保护的内部

     
    

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

  

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

My Project Hierarchy

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的成员。

2 个答案:

答案 0 :(得分: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();

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

  

' InternalEncapsulation'不包含' GetArea'的定义没有扩展方法' GetArea'接受类型' InternalEncapsulation'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

但您没有为InternalEncapsulation课程指定访问修饰符,因此它internal

  

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

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

  由于其保护级别

InternalEncapsulation无法访问

所以你需要公开它:

public class InternalEncapsulation

答案 1 :(得分:0)

2天前我遇到了一个简单的问题。我用Stackoverflow解决了我的问题。我想看看内部和公共访问说明符之间的区别。然后我创建了两个项目,以查看它们的不同之处。如果我可以调用公共方法并且无法从其他程序集调用内部方法,那么C#控制台应用程序将支持理论知识。我想这样做。但我无法看到其他项目的公众成员。然后我在这个How to use a Class from one C# project with another C# project教程中找到了解决方案。我应该在项目中添加右键单击引用。

  

解决方案步骤

     

1。 在'解决方案资源管理器中'树,扩大了       ' CallOtherAssemblyVariablesOrMethods'项目,然后右键单击       项目并选择“添加参考”'从菜单中。

     

2。 在' AddReference'对话框,选择' Projects'选项卡并选择您的       ' TutorialsPoint'项目

     

3。 如果您使用的是名称空间,那么您需要导入“CallOtherAssemblyVariablesOrMethods'”的名称空间。通过在“TutorialsPoint'”中为您的文件添加' 语句来添加类型。

非常感谢大家......