标签: public-fields

为什么公共领域比属性更快?

我在XNA中闲逛,发现其中的Vector3类是使用公共字段而不是属性.我尝试了一个快速的基准测试,并发现,struct差异非常大(将两个向量组合在一起,1亿次带有2.0s属性和1.4s带字段).对于参考类型,差异似乎并不大,但它存在.

那为什么呢?我知道属性被编译成get_Xset_X方法,这会导致方法调用开销.但是,这些简单的getter/setter是不是总是被JIT内联?我知道你无法保证JIT决定做什么,但肯定这在概率列表中相当高?还有什么将公共领域与机器级别的财产分开?

有一点我一直想知道:自动实现的属性(public int Foo { get; set; })比公共领域"更好"的OO设计?或者更好地说:那两个有什么不同?我知道用反射把它变成一个属性更容易,但其他什么呢?我打赌这两个问题的答案是一回事.

BTW:我使用.NET 3.5 SP1,我相信固定的问题,其中有结构的方法(或方法结构,我不知道)均未成行,所以这不是它.我认为我至少使用它,它肯定安装但是再次,我使用Vista 64位SP1应该有DX10.1,除了我没有DX10.1 ..

另外:是的,我一直在运行发布版本:)

编辑:我很欣赏的快速解答的家伙,但我指出,我知道,一个属性访问是一个方法调用,但我不知道为什么,大概是,在林立的方法比直接字段访问速度较慢.

编辑2:所以我创建了另一个struct使用显式GetX()方法(o我怎么不完全错过我的Java时间),并且无论我是否禁用内嵌(通过),都执行相同的操作[MethodImplAttribute(MethodImplOptions.NoInlining)],所以结论:非静态方法显然从未内联,甚至不在结构上.

我认为有异常,JIT可以选择虚拟方法调用.为什么不能在没有继承的结构上发生这种情况,因此方法调用只能指向一种可能的方法,对吧?或者是因为你可以在它上面实现一个接口?

这是一种耻辱,因为它真的会让我考虑在性能关键的东西上使用属性,但使用字段会让我觉得很脏,我不妨写下我在C中做的事情.

编辑3:我发现这篇文章的主题完全相同.他的最终结论是,财产电话确实被优化了.我也可以发誓我已经多次阅读过简单的getter/setter属性会被内联,尽管callvirt在IL中.我疯了吗?

编辑4:Reed Copsey在下面的评论中发布了答案:

Re:Edit3 - 看我更新的评论:我相信这是x86 JIT vs x64 JIT问题.x64中的JIT不够成熟.随着越来越多的64位系统每天上线,我希望MS能够迅速提高. - 里德·科普塞

我回答他的回答:

谢谢,这就是答案!我尝试强制x86构建,所有方法都同样快,并且比x64快得多.实际上这对我来说非常令人震惊,我不知道我是在64位操作系统上生活在石器时代.我会在你的答案中包含你的评论,以便更好. - 朱利安

感谢大家!

c# oop struct properties public-fields

38
推荐指数
2
解决办法
7736
查看次数

用c ++隐藏特定函数的方法

我有一个继承struct A : public B,我想隐藏B的个别功能,这可能吗?

我知道using BMethod在A声明中可以使用相反的方法.

干杯

c++ inheritance using private-members public-fields

21
推荐指数
5
解决办法
2万
查看次数

如何从Objective-C中的另一个类访问@public实例变量?

我知道用@public关键字定义公共实例变量是可能的.但是,Objective-C语法不允许访问其他类的变量.我应该从@public Ivar中得到什么功能?或者我如何访问其他类'Ivars?

objective-c public-fields

14
推荐指数
2
解决办法
2万
查看次数

为什么我们不能在C#中使用公共字段进行数据绑定?

我知道在字段上使用属性的优点,例如在将来需要时能够提供额外的逻辑.

但我真的很想知道为什么不可能使用公共字段进行数据绑定,甚至不能使用JavaScriptSerializer类等JSON序列化程序.

在这些情况下,是否有任何理由忽视公共领域?或者它只是某种惯例?或者只是强迫用户使用属性?

.net c# data-binding serialization public-fields

11
推荐指数
1
解决办法
1963
查看次数

Java辅助非公共类使用会产生错误"类型不可见",即使访问的方法在Main类中是公共的

我有一个Main.java文件:

public class Main{

  private EntityDrawer entityDrawer;

  public void setEntityDrawer(EntityDrawer entityDrawer) {
    this.entityDrawer = entityDrawer;
  }

  public EntityDrawer getEntityDrawer() {
    return entityDrawer;
  }
}

class EntityDrawer {

  private Empleado empleado;  

  public Empleado getEmpleado() {
    return empleado;
  }

  public void setEmpleado(Empleado empleado) {
    this.empleado = empleado;
  }

}
Run Code Online (Sandbox Code Playgroud)

如果我尝试从另一个文件访问,如果我只尝试访问entityManager它是有效的:

Main main = new Main();
main.getEntityDrawer(); // NO PROBLEM!
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试从entityManager访问其中一个属性(即使是公共的),它也不起作用:

Main main = new Main();
main.getEntityDrawer().getEmpleado(); // Gives error "The type EntityDrawer is not visible"
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么会发生这种情况,有人能给我一些关于这个问题的见解吗?...

java encapsulation class public-fields

6
推荐指数
2
解决办法
2万
查看次数

用于将C#公共字段重构为属性的工具

我有很多使用公共字段的C#代码,我想将它们转换为属性.

我有Resharper,它会一个接一个地做,但这将需要永远.

有谁知道一个可以帮助解决这个问题的自动重构工具?

.net c# refactoring public-fields automated-refactoring

5
推荐指数
2
解决办法
2625
查看次数

JavaScript中公共字段的可接受性

我只是想知道JavaScript中是否可以接受公共字段(即,那些不在构造函数的闭包内的范围)。虽然通常的口头禅是“不使用公共字段,使用访问器或属性”,但我注意到所有浏览器(IE)尚未广泛支持属性。

其他类似于JavaScript的“一切都是公共的”语言,例如Python,似乎不太在乎信息隐藏和公共字段,即使那些没有用属性修饰的语言也是如此。因此,可以在JavaScript中执行此操作吗?

“私人的”:

var Class = function()
{
    var field = null;
    this.getField = function() { return field; };
    this.setField = function(value) { field = value; };
};
Run Code Online (Sandbox Code Playgroud)

上市:

var Class = function()
{
    this.field = null;
};
Run Code Online (Sandbox Code Playgroud)

javascript oop public-fields

3
推荐指数
1
解决办法
1580
查看次数