0

私は Tutorialspoint.com の C# カプセル化に取り組んでいます。そして私はこれを読みました

Public、Private、Protected、Nothing の違いは何ですか? 1
Stackoverflow からの質問です。私は答えを読み、テオリックのアクセス指定子を理解しました。今、私はビジュアル スタジオでこのテーマでコンソール アプリケーションを作成したいと考えています。

公衆

型またはメンバーには、同じアセンブリまたはそれを参照する別のアセンブリ内の他のコードからアクセスできます。

プライベート

型またはメンバーは、同じクラスまたは構造体のコードによってのみアクセスできます。

保護された

型またはメンバーは、同じクラスまたは構造体、または派生クラス内のコードによってのみアクセスできます。

内部

型またはメンバーは、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。

保護された内部

型またはメンバーには、同じアセンブリ内の任意のコード、または別のアセンブリ内の任意の派生クラスからアクセスできます。

public アクセス指定子を持つ変数またはメソッドは、同じアセンブリと別のアセンブリからアクセスされます。しかし、この駅は内部の説明が異なります。内部型の変数とメソッドは、同じアセンブリにのみアクセスできますが、C# の異なるアセンブリにはアクセスできません。このステーションを C# でテストしたいので、2 つのプロジェクトを作成し、相互にメソッドまたは変数を呼び出します。

私のプロジェクト階層

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 に答える