登录C#时,如何学习调用当前方法的方法的名称?我知道所有这些System.Reflection.MethodBase.GetCurrentMethod(),但我想在堆栈跟踪中向下迈出一步.我考虑过解析堆栈跟踪,但我希望找到一种更清晰,更明确的方法,比如Assembly.GetCallingAssembly()方法.
我希望类的私有成员变量可以被Tester类访问,而不会将它们暴露给其他类.
在C++中,我只是将Tester类声明为朋友,如何在C#中执行此操作?有人能举个例子吗?
前一段时间,面试官在接受采访时问我"你会用什么私人接口?".
我问他是否意味着他回答否的隐式与显式接口实现之间的区别.
所以我想知道:
我希望一个类中的特定方法只能由特定类访问.例如:
public class A
{
public void LimitedAccess() {}
public void FullAccess() {}
}
public class B
{
public void Func()
{
A a = new A();
a.LimitedAccess(); // want to be able to call this only from class B
}
}
public class C
{
public void Func()
{
A a = new A();
a.FullAccess(); // want to be able to call this method
a.LimitedAccess(); // but want this to fail compile
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可用于强制执行此操作的关键字或属性?
更新:
由于现有的系统复杂性和时间限制,我需要一个低影响力的解决方案.我想在编译时指出无法使用LimitedAccess().我相信Jon Skeet的答案正是我所要求的无法在C#中完成.
这个问题和乔恩的回答对那些可能会遇到这个问题的人有好处.事实上,这种设计气味可以让任何人选择这样的东西作为理想的解决方案. …
我们正在创建一个对象层次结构,其中每个项目都有一个其他项目的集合,每个项目也有一个Parent指向其父项目的属性.很标准的东西.我们还有一个ItemsCollection继承自的类,该类Collection<Item>本身具有Owner指向集合所属项的属性.再一次,没有什么有趣的.
当一个项目被添加到ItemsCollection类中时,我们希望它自动设置Item的父项(使用集合的Owner属性),当项目被删除时,我们想要清除父项.
这就是事情.我们只希望Parent设置器可用ItemsCollection,没有别的.这样,我们不仅可以知道项目的父项是谁,还可以通过检查现有值Parent,或者让某人随意将其更改为其他项目来确保项目不会添加到多个集合中.
我们知道如何做到的两种方式是:
将setter标记为private,然后将集合定义包含在项目本身的范围内.亲:全面保护.Con:嵌套类的丑陋代码.
ISetParent在仅ItemsCollection知道的Item上使用私有接口.亲:更清晰的代码,易于遵循.Con:从技术上讲,任何了解界面的人都可以投射Item并获得制定者.
现在技术上通过反思任何人都可以得到任何东西,但仍然......试图找到最好的方法来做到这一点.
现在我知道有C++中的功能,称为Friend什么,让你在一个类中指定的,否则私有成员为可用于另一这将是很好的方案,但我不知道在C#中的任何这样的事情.
在伪代码中(例如,所有属性都更改了通知,为了简洁而删除了这些通知,我只是在这里输入,而不是从代码中复制),我们有...
public class Item
{
public string Name{ get; set; }
public Item Parent{ get; private set; }
public ItemsCollection ChildItems;
public Item()
{
this.ChildItems = new ItemsCollection (this);
}
}
public class ItemsCollection : ObservableCollection<Item>
{
public ItemsCollection(Item owner)
{
this.Owner = owner;
}
public Item …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码模式:
// Each foo keeps a reference to its manager
class Foo
{
private FooManager m_manager;
}
// Manager keeps a list of all foos
class FooManager
{
private List<Foo> m_foos;
}
Run Code Online (Sandbox Code Playgroud)
问题:没有办法创建一个新的Foo并更新FooManager中的m_foos列表和新Foo实例中的m_manager引用,而不公开公开一些私有(并冒着某人用实际Foos取消列表的风险).
例如,可以在Foo中实现构造函数Foo(FooManager manager).它可以设置m_manager引用,但无法访问m_foos列表.或者您可以在管理器中实现CreateFoo()方法.它可以访问m_foos列表,但无法在Foo中设置m_manager.
在C++中,显然会声明FooManager是Foo的朋友来表达设计意图,但这在C#中是不可能的.我也知道我可以让Foo成为FooManager的内部类以获得访问权限,但这也不是一个解决方案(如果Foo可以属于多个经理类怎么办?)
顺便说一句.我知道.NET中的"内部"访问,但它要求Foo和FooManager独立存在于一个单独的程序集中,这是不可接受的.
没有公开私有东西的任何变通办法吗?
我是C#的新手,我有一个问题,在C++中我通常会使用friend标识符.现在我知道friendC#中不存在关键字,但我没有任何解决方法的经验(除了将所有类变量设为公共属性,如果可以的话我想避免使用).
我有以下场景:
public class A
{
public string Info { get; set; }
/* much more data */
}
public class B
{
private A m_instanceOfA;
public B(A a) { m_instanceOfA = a; }
public Info { get return A.info; set A.Info = value; }
/* And some more data of its own*/
}
public class C
{
private A m_instanceOfA;
// I need a constructor of C, which needs to set C.m_instanceOfA
// to the …Run Code Online (Sandbox Code Playgroud) 我的问题是:
现在lambda仿函数是C++的一部分,它们可以用来整理类的接口.lambda如何使用vs私有方法在C++中使用compare?unclutter类接口是否存在更好的替代方案?
在我的项目中,我经常想要一个私有的方法(或者你喜欢的函数),但是我也希望从其他类中访问它.这有可能吗?
为了澄清,这个方法可以从ClassA它自己的类访问,但不能从任何其他类访问.
因此,我有一个与此用例相似的用例,但还有一些其他细节,我认为值得提出一个新问题。(相关 问题,以供参考)
我正在写一个实现循环的数据结构。基本设计是这样的:
public class Cycle<T>
{
public Node<T> Origin { get; private set; }
public int Count { get; private set; }
}
public class Node<T>
{
public Cycle<T> Cycle { get; private set; }
public Node<T> Next { get; private set; }
public Node<T> Previous { get; private set; }
public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,我要实现以下所有行为:
Cycle(即Origin = null)创建一个新Node的Origin …我见过Friend修饰符的唯一地方是在WinForms设计器中,为什么修改器在Winforms中设置为Friend?和VB.NET:'朋友'修饰符有什么作用?.
朋友修饰符似乎是一个几乎任意宽的访问级别,是为解决VB中的一些历史性架构问题而创建的,我只是想知道是否有人有意义的继续使用它?
我有一些愿望只将方法暴露给给定的命名空间,以便将相关的对象集合的功能集合在一起并管理它们的任何非线程安全方法,同时将安全的公共方法暴露给更广泛的范围.同一个集会.朋友没有此访问级别.可能是一个必然的问题,那就是我对程序集和命名空间的使用与预期的不一致?
在许多情况下,由于程序集具有严格的层次结构,因此无法将功能分离到不同的程序集中,从而导致具有相互但不同的对象组,这些对象可以访问彼此不安全的方法.
编辑: 虽然我知道修饰符的功能,但我很好奇人们对它的实际目的,因为我没有遇到过这样一个合适的解决方案.
C# 中“受保护”和“私有受保护”访问修饰符有什么区别?有人可以举例说明吗?
提前致谢。