问题标签 [access-modifiers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
766 浏览

c# - 为什么要使用公共变量?

变量、方法和类可以接收各种安全级别。根据我的 C# 经验,有:

公共
内部
受保护 受
保护 内部
私有

现在,我了解了将方法和类设为私有、内部或受保护的用途,但变量呢?即使我将变量设为私有,我也可以使用属性从不同的类中调用它。

我一直认为属性是最佳实践。所以如果我可以使用它,我不需要直接通过实例调用变量。

有什么理由不将变量设为私有吗?

编辑:我看到有些人在谈论属性,好像它们只不过是美化的公共变量

快速提醒:公共变量只返回它们的值。有了属性,您可以做更多事情。例如:

看过我简介的人都知道我是一名学生。使用属性作为“美化的公共变量”是我看到很多同学做的事情。告诉他们可以这样做时,最常见的反应是:“允许吗?”

0 投票
1 回答
715 浏览

c# - 自动重构访问修饰符

是否有一种工具可以通过 Visual Studio 解决方案运行,并将访问修饰符调整为解决方案中未调用的任何内容,在适用的情况下转换为私有或内部?

我想我可以将所有内容更改为私有,然后使用编译器消息并手动完成...但这可能需要一段时间,如果有自动的东西,那就太棒了!

0 投票
2 回答
1498 浏览

c# - 由于访问修饰符,子控件无法访问

当我在 WPF 中创建用户控件时,似乎该控件的所有子控件都声明为内部控件?我无法验证这一点,也无法找到任何讨论此问题的资源。

我可以访问同一程序集中的控件,但不能访问引用用户控件所在程序集的项目。有没有办法覆盖 XAML 中子控件的默认访问修饰符,这样我就不必通过用户控件中的属性手动公开控件?

0 投票
6 回答
4375 浏览

c# - .NET - 如何创建一个只有一个其他特定类可以实例化它的类?

我想要以下设置:

从 XML 文件加载后,整个结构将是只读的。我想这样做,只有描述符类可以实例化一个参数。

一种方法是创建一个IParameter接口,然后Parameter在 Descriptor 类中将类设为私有,但在实际使用中,Parameter 将具有多个属性,我想避免重新定义它们两次。

这有可能吗?

0 投票
2 回答
4534 浏览

javascript - 如何使用 Prototype 库模拟 JavaScript 中的访问修饰符?

我已经使用原型库有一段时间了,偶尔发现自己希望我有多个访问级别(公共、私有和受保护)。到目前为止,我最接近的是以下内容:

由于以下几个原因,这不太理想:

  • 无保护级别
  • 我可以拥有可以访问私有成员的公共成员或可以覆盖的公共成员,但不能拥有可以访问私有成员并被覆盖的公共成员。
  • 我可以被覆盖的公共方法没有原型。

我进行了一些搜索,但没有发现任何表明我可以在不改变原型工作方式的情况下做得更好的东西。以下是一些更有趣的链接:

我已经看到它建议您可以通过执行以下操作为我的公共虚拟方法提供访问器:

这显然不会按预期工作。目标是只允许从对象外部打印和附加到消息。为使虚拟公共功能工作而提供的设置器还允许完全控制消息。可以将其更改为使虚拟方法更像是一个 shell,如下所示:

这个新版本确实限制了此类的公共访问,但有些多余。更不用说如果 appendToMessage 在子类中被覆盖,第三方仍然可以调用 _appendToMessage 来访问不好的原始方法。

我确实有一个非常肮脏的想法,可以让我靠近,但它是一罐我宁愿不打开的蠕虫。我可能会稍后发布它,但与此同时,是否有人对将两种类型的公共方法合并为一种有用的类型或如何实现受保护的成员提出建议。

编辑:我怀疑缺乏反馈(除了bobince的不要打扰评论)意味着我是正确的,因为你不能更进一步,但我想我会澄清一点以防万一。我认为不可能得到任何接近其他语言保护的东西。我更感兴趣的是知道限制在哪里,以及我对所涉及原则的理解有多准确。但是,我确实认为,如果我们能够使各种保护级别发挥作用,使非公共成员不会出现在 for...in 循环中(或 Prototypes Object.keys使用 for..in) 即使知道自己在做什么的人仍然可以通过修改我的原型之类的事情来打破规则。毕竟,它就像bobince说“除了他们自己,他们没有人可以责备”

现在评论bobince提出的问题:

即使您制作了真正的私有/受保护变量,它仍然无法为您提供有效安全边界所需的完整封装。JavaScript 能够修改您的方法将使用的内置类型的原型,从而使攻击者能够破坏这些方法。

这是我理解的一个限制,我可能应该在上面提到。但是,我并不是从保护我的代码免受试图“破解”它的人的角度来看这一点。但是,我确实有一些值得注意的事情(或者如果我错了需要纠正):

  • 只有我的公众成员会以这种方式受到攻击。
  • 如果我的公共虚拟方法以这种方式“妥协”,那么“妥协”方法仍然无法访问私有成员。
  • 如果我的公共(非虚拟)成员以这种方式“妥协”,那么,与该方法的原始版本不同,“妥协”版本将无法访问私人成员。
  • 据我所知,通过在初始化方法之外定义的方法访问私有成员的唯一方法是利用某些浏览器处理 eval 调用的方式中的错误。
0 投票
11 回答
1839 浏览

java - 匿名类中的私有变量/方法?

我创建了一个匿名类,在其中声明了一些变量和方法。我的java老师告诉我把这些设为私有。我看不出更改修饰符有什么不同,因为这些变量和方法无论如何都是匿名类的私有的,所以我更喜欢根本没有修饰符。谁是对的,什么更有意义?请参阅下面的示例代码,其中我没有为“map”和“convert”选择任何修饰符,而不是将它们设为私有。

0 投票
7 回答
5647 浏览

c# - C# 内部 getter,带内部类参数的受保护 setter

如this question中所述,我希望属性具有内部getter和受保护的setter的问题,我认为我通过执行以下操作解决了这个问题:

但是,我现在收到此错误:

可访问性不一致:参数类型“连接”比方法“setConnection(连接)”更难访问

这是因为我有internal class Connection. 我宁愿不创建Connection一个公共类,虽然Accessor 需要是公共的,那么如何在仍然保持内部 getter 和受保护的 setter 的同时解决这个错误?

0 投票
4 回答
19392 浏览

c++ - 在派生类中更改函数访问模式

考虑以下代码段:

这是合法的 C++ 吗?“This”正在改变派生类中虚函数的访问模式。

0 投票
2 回答
10802 浏览

asp.net - 资源文件禁用了 Visual Studio 的访问修饰符下拉选项

不确定为什么对资源文件禁用访问修饰符下拉菜单。

替代文字 http://img683.imageshack.us/img683/9157/accessmodifier.png

以下是文件属性:

替代文字 http://img199.imageshack.us/img199/3930/resxprop.png

0 投票
2 回答
141 浏览

iphone - iPhone + 其他类的访问控制

我有课:PropertyCalcViewController.m & .h

在 .h 我有

在 .m 文件中我有

现在我还有另一个类Manager.m 和 .h。

我想要做的是btnGoManager类中访问并将其从PropertyCalcViewController喜欢中删除

我怎样才能做到这一点?