Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我可以访问命名空间之外的内部方法?_C#_Abstraction_Access Modifiers - Fatal编程技术网

C# 为什么我可以访问命名空间之外的内部方法?

C# 为什么我可以访问命名空间之外的内部方法?,c#,abstraction,access-modifiers,C#,Abstraction,Access Modifiers,我试图理解访问修饰符,但对如何使用internal有点困惑 我的命名空间中有一个类,如下所示: namespace Grids { public abstract class Grid { internal abstract Vector2Int ToGrid(float worldX, float worldY); internal Vector2Int ToGrid(Vector3 worldPoint) => ToGrid(worldP

我试图理解访问修饰符,但对如何使用
internal
有点困惑

我的命名空间中有一个类,如下所示:

namespace Grids
{
    public abstract class Grid
    {
        internal abstract Vector2Int ToGrid(float worldX, float worldY);
        internal Vector2Int ToGrid(Vector3 worldPoint) => ToGrid(worldPoint.x, worldPoint.z);
        internal Vector2Int ToGrid(Vector2 worldPoint) => ToGrid(worldPoint.x, worldPoint.y);
    }
}
然后在继承的类中实现,如下所示:

namespace Grids
{
    public class RectGrid : Grid
    {
        public int Width;
        public int Height;
        public Grid(int w, int h)
        {
             Width = w;
             Height = h;
        }
        internal override Vector2Int ToGrid(float worldX, float worldY)
        {
            int col = Mathf.FloorToInt(worldX / Width);
            int row = Mathf.FloorToInt(worldY / Height);
            return new Vector2Int(col, row);
        }
    }
}
因此,我现在创建一个类来使用这个不属于名称空间的网格:

using Grids;
using UnityEngine;

public class MapGenerator : MonoBehaviour
{
    private RectGrid _rectGrid;
    
    void Awake() {
        _rectGrid = new RectGrid(1,1);   
        _rectGrid.ToGrid(Vector3.zero); // why do i have access to this function         
    }
}
但出于某种原因,我可以访问假定为内部的功能:

为什么会这样?我不想公开这个函数,我希望它只能被我的
Map
类访问,该类共享相同的
Grids
命名空间,并将控制我公开的内容。然而,我的
MapGenerator
类甚至不作为名称空间的一部分就可以访问吗

我是否误解了内部工作原理?

根据文档


只能在中的文件中访问内部类型或成员 相同的组件

根据你的评论

很难设计一种方法来隐藏这些功能,但仍能提供 访问特定类

标准的访问修饰符相当有限,您需要将调用代码放在同一程序集中才能使用
内部
。此外,除非您在运行时这样做,否则无法为调用类授予访问列表

但是,您可以使用一个。这不会完全限制访问,但它会使您需要显式地请求访问,并在任何其他时间隐藏访问

public interface IGrid
{
    Vector2Int ToGrid(...);
}

public abstract class Grid : IGrid
{
   Vector2Int IGrid.ToGrid(...) {}
}
用法

var rectGrid = new RectGrid();
((IGrid)rectGrid).ToGrid(); // you need to explicitly cast to the interface

内部类型或成员只能在同一程序集中的文件中访问。您读过吗?注意单词“assembly”,而不是“namespace”。我不知道这是什么意思。该死的,那太烦人了-很难设计一种方法来隐藏这些函数,但仍然可以访问特定的类。
很难设计一种方法来隐藏这些函数,但仍然可以访问特定的类。
可能是受保护的吗?我如何将受保护的映射暴露给
映射
类,该类不继承它,但具有
网格
?基本上我想要
Map
控制
Grid
类中公开哪些方法,
MapGenerator
将调用这些方法来生成Map。啊,我明白了,令人惊讶的是,C#从未实现过更多控制函数访问的方法,比如让控制器定义另一个类的公共或受保护的内容。使库的使用不那么混乱是非常有用的。