'friend' 在 C# 中的等价关键字是什么?
如何使用 'internal' 关键字?
我已经读到过在 C# 中 'internal' 关键字是 'friend' 的替代品。
我在我的 C# 项目中使用了一个 DLL,我拥有它的源代码,但我不想修改现有的代码。我继承了该类并可以按任何方式使用我的派生类。问题是父类中的大部分代码都有受保护的方法。使用 'friend' 关键字是否会使访问或调用这些受保护的方法变得可能?
'friend' 在 C# 中的等价关键字是什么?
如何使用 'internal' 关键字?
我已经读到过在 C# 中 'internal' 关键字是 'friend' 的替代品。
我在我的 C# 项目中使用了一个 DLL,我拥有它的源代码,但我不想修改现有的代码。我继承了该类并可以按任何方式使用我的派生类。问题是父类中的大部分代码都有受保护的方法。使用 'friend' 关键字是否会使访问或调用这些受保护的方法变得可能?
你可以使用关键字访问修饰符 internal
来将类型或类型成员声明为仅对同一程序集中的代码可访问。
你可以使用在System.Rutime.CompilerServices
定义的InternalsVisibleToAttribute
类,来将类型声明为仅对同一程序集或指定程序集中的代码可访问。
你使用第一个访问修饰符就像使用其他任何访问修饰符(如private
)一样。例如:
internal class MyClass {
...
}
你可以按照以下方式使用第二个:[assembly:InternalsVisibleTo("MyFriendAssembly", PublicKey="...")]
internal class MyVisibleClass {
...
}
这两者都可以被认为是C#中friend
的等价物。
protected
标识的方法已经可以被派生类访问。
不,"internal"和"C++的friend"并不相同。
"friend"表示该类仅可被一个特定类访问。
"internal"表示该类可以被程序集中的任何类访问。
internal
is the C# equivalent of the VB.NET friend
keyword, as you have guessed (as opposed to a replacement)
Usage is as follows
internal void Function() {}
internal Class Classname() {}
internal int myInt;
internal int MyProperty { get; set; }
It, basically, is an access modifier that stipulates that the accessibility of the class / function / variable / property marked as internal is as if it were public to the Assembly it is compiled in, and private to any other assemblies
friend
关键字行为的奇怪技巧。 据我所知,这仅适用于嵌套类。
protected
或private
接口,并在其中设置您想要通过属性访问的变量。using System;
using UnityEngine;
using UnityEngine.Assertions;
namespace TL7.Stats
{
[CreateAssetMenu(fileName = "Progression", menuName = "TL7/Stats/New Progression", order = 0)]
public class Progression : ScriptableObject
{
// Provides access to private members only to outer class Progression
protected interface IProgressionClassAccess
{
CharacterClass CharacterClass { get; set; }
}
[System.Serializable]
public struct ProgressionClass : IProgressionClassAccess
{
[Header("DO NOT EDIT THIS VALUE.")]
[SerializeField] private CharacterClass characterClass;
[Tooltip("Levels are 0 indexed.")]
[SerializeField] float[] healthOverLevels;
public float[] HealthOverLevels => healthOverLevels;
CharacterClass IProgressionClassAccess.CharacterClass
{
get => characterClass;
set => characterClass = value;
}
}
static readonly Array characterClasses = Enum.GetValues(typeof(CharacterClass));
[SerializeField] ProgressionClass[] classes = new ProgressionClass[characterClasses.Length];
public ProgressionClass this[in CharacterClass index] => classes[(int)index];
void Awake()
{
for (int i = 0; i < classes.Length; ++i)
{
// Needs to be cast to obtain access
(classes[i] as IProgressionClassAccess).CharacterClass = (CharacterClass)characterClasses.GetValue(i);
}
}
#if UNITY_EDITOR
public void AssertCorrectSetup()
{
for (int i = 0; i < characterClasses.Length; ++i)
{
CharacterClass characterClass = (CharacterClass)characterClasses.GetValue(i);
Assert.IsTrue(
(this[characterClass] as IProgressionClassAccess).CharacterClass == characterClass,
$"You messed with the class values in {GetType()} '{name}'. This won't do."
);
}
}
#endif
}
}
你的子类将能够访问你继承的类的受保护成员。
你想要将这些受保护成员授权给另一个类吗?
Internal 相当于 friend。受保护的方法仅在同一类或继承者中可用。如果您尝试从继承者公开受保护的方法,则可以将它们包装在公共方法中。