我正在创建几个NSView类,所有这些类都支持一个特殊的操作,我们称之为transmogrify。乍一看,这似乎是协议(protocol)的完美位置:protocolTransmogrifiableView{functransmogrify()}但是,此协议(protocol)不强制每个TransmogrifiableView也是一个NSView。这意味着我在TransmogrifiableView上调用的任何NSView方法都不会进行类型检查:letmyView:TransmogrifiableView=getTransmogrifiableView()lettheSuperView
我正在创建几个NSView类,所有这些类都支持一个特殊的操作,我们称之为transmogrify。乍一看,这似乎是协议(protocol)的完美位置:protocolTransmogrifiableView{functransmogrify()}但是,此协议(protocol)不强制每个TransmogrifiableView也是一个NSView。这意味着我在TransmogrifiableView上调用的任何NSView方法都不会进行类型检查:letmyView:TransmogrifiableView=getTransmogrifiableView()lettheSuperView
如果标题不是完全不言自明的,下面是令我困惑的代码:publicinterfaceIFoo{}publicclassMyClass:IFoo{privateclassNestedInMyClass{}}我很惊讶这个编译没有错误。感觉我在暴露一个private类型。这不应该是违法的吗?也许您的答案只是“没有反对的规则,那为什么不可以呢?”也许同样令人惊讶的是MyClass.NestedInMyClass甚至在“范围内”。如果我删除MyClass.资格,它不会编译。(如果我将IFoo更改为通用类,它应该成为MyClass的基类,这是非法的,因为基类型必须是至少与类型本身一样易于访问。)我用V
如果标题不是完全不言自明的,下面是令我困惑的代码:publicinterfaceIFoo{}publicclassMyClass:IFoo{privateclassNestedInMyClass{}}我很惊讶这个编译没有错误。感觉我在暴露一个private类型。这不应该是违法的吗?也许您的答案只是“没有反对的规则,那为什么不可以呢?”也许同样令人惊讶的是MyClass.NestedInMyClass甚至在“范围内”。如果我删除MyClass.资格,它不会编译。(如果我将IFoo更改为通用类,它应该成为MyClass的基类,这是非法的,因为基类型必须是至少与类型本身一样易于访问。)我用V
编辑:事实证明我遗漏了一些明显的东西,但我将保留这个问题以防其他人犯同样明显的错误。感谢那些指出它的人请参阅底部的解释。是否可以对覆盖接口(interface)属性的属性进行非公共(public)设置?也许我有一个愚蠢的时刻,但在我看来,在接口(interface)中定义一个属性隐含地要求没有派生类可以为所述属性提供任何非公共(public)集。例子:interfaceIField{boolIsValid{get;}}...并且由于接口(interface)属性可能没有可访问性修饰符意味着:classField:IField{publicoverrideboolIsValid{get;
编辑:事实证明我遗漏了一些明显的东西,但我将保留这个问题以防其他人犯同样明显的错误。感谢那些指出它的人请参阅底部的解释。是否可以对覆盖接口(interface)属性的属性进行非公共(public)设置?也许我有一个愚蠢的时刻,但在我看来,在接口(interface)中定义一个属性隐含地要求没有派生类可以为所述属性提供任何非公共(public)集。例子:interfaceIField{boolIsValid{get;}}...并且由于接口(interface)属性可能没有可访问性修饰符意味着:classField:IField{publicoverrideboolIsValid{get;
是否可以获取或设置私有(private)字段?我想要获取System.Guid.c。有没有办法访问它,或者我应该只从strut复制代码并将字段公开? 最佳答案 您可以按照QuanticProgramming的建议使用反射varguid=Guid.NewGuid();varfield=typeof(Guid).GetField("_c",BindingFlags.NonPublic|BindingFlags.GetField|BindingFlags.Instance);varvalue=field.GetValue(guid);尽管
是否可以获取或设置私有(private)字段?我想要获取System.Guid.c。有没有办法访问它,或者我应该只从strut复制代码并将字段公开? 最佳答案 您可以按照QuanticProgramming的建议使用反射varguid=Guid.NewGuid();varfield=typeof(Guid).GetField("_c",BindingFlags.NonPublic|BindingFlags.GetField|BindingFlags.Instance);varvalue=field.GetValue(guid);尽管
C#中为什么反射可以访问类的protected/private成员?这对类(class)来说不安全吗,为什么反射被赋予这样的权力?这是一个anti-pattern? 最佳答案 成员可访问性不是一项安全功能。它用于保护程序员免受他或她自己的伤害。它有助于实现封装,但绝不是安全功能。反射使用起来非常乏味,因此人们通常不会特意使用它来访问非公共(public)成员。它也很慢。反射通常只在特殊情况下使用。然而,没有什么可以完全防止人类的愚蠢,如果有人想滥用反射,他可以很容易地做到,但即使没有反射API,他们也可以实现同样的事情(如果他们在完
C#中为什么反射可以访问类的protected/private成员?这对类(class)来说不安全吗,为什么反射被赋予这样的权力?这是一个anti-pattern? 最佳答案 成员可访问性不是一项安全功能。它用于保护程序员免受他或她自己的伤害。它有助于实现封装,但绝不是安全功能。反射使用起来非常乏味,因此人们通常不会特意使用它来访问非公共(public)成员。它也很慢。反射通常只在特殊情况下使用。然而,没有什么可以完全防止人类的愚蠢,如果有人想滥用反射,他可以很容易地做到,但即使没有反射API,他们也可以实现同样的事情(如果他们在完