[英]Question about c# optimizer
如果我写:
SomeType simpleName = classWithLongName.otherLongName;
然后使用“ simpleName”代替“ classWithLongName.otherLongName”,这会以任何方式(例如性能方面)更改程序吗?
编译器对此做了什么? 是否在我使用“ simpleName”的任何地方复制并粘贴“ classWithLongName.otherLongName”。
不,C#编译器不会simpleName
“ simpleName
”的调用转换为与复制和粘贴“ classWithLongName.otherLongName
”相同。 区别可能是深刻的,也可能只是语义上的区别,但是您正在做的是将classWithLongName.otherLongName中的值分配给simpleName。 该类型是值类型还是引用类型将确定操作该值时会发生什么以及将发生什么,但是在执行操作时您不会创建函数指针或委托。
除了说不会产生负面影响外,它是否会真正影响性能还不能在这里得到回答。 我们不能说它是否会产生积极的影响,因为这取决于您调用classWithLongName.otherLongName
时实际发生的情况。 如果这是一个昂贵的操作,则可以使其速度更快,但是缺点是,如果将其值缓存在simpleName
,则后续调用classWithLongName.otherLongName
任何差异都不会反映出来。
这取决于“ otherLongName”的实际作用。 如果是属性,则区别在于执行该属性几次或仅执行一次。 这可能会或可能不会在很大程度上改变程序的行为,具体取决于它在做什么。
仅当您始终键入“ classWithLongName.otherLongName
”时,如果编译器知道该值在过程中不会更改,则仅允许其缓存并重新使用它。 但是,这种情况很少。
因此,如果“ classWithLongName.otherLongName
”确实执行了一些计算,通常可以通过按建议将其手动缓存在局部变量中来获得更好的性能。 但是,请记住,您正在使用缓存的值,并且原始值或属性的更改不会反映在缓存的值上。
但是,该名称的长度仅是元数据,并且对运行时性能没有任何影响,因为该名称已在编译期间解析为内部句柄。
这是关于实例或类的问题吗?
例如
namespace MyCompany.MyApp.LongNamespaceName
{
public class MyClassWithALongName {
public SomeType AnInstanceProperty {get;set;}
public static SomeType AStaticProperty {get { ... }}
}
}
现在:
//this gets the static property
SomeType simpleName = MyClassWithALongName.AStaticProperty;
或者:
MyClassWithALongName anInstanceWithALongName = new MyClassWithALongName();
//this gets the instance property
SomeType simpleName = anInstanceWithALongName.AnInstanceProperty;
这些将以不同的方式表现。
不过,还有另一种情况,您可以为该类的实际名称创建别名:
using simpleName = MyCompany.MyApp.LongNamespaceName.MyClassWithALongName;
...
simpleName anInstance = new simpleName ();
如果classWithLongName.otherLongName是属性,则对simpleName的更改不会更改classWithLongName.otherLongName。
如果classWithLongName.otherLongName是值类型的公共数据成员(字段),则对simpleName的更改不会更改classWithLongName.otherLongName。
如果classWithLongName.otherLongName是引用类型的公共数据成员(字段),则更改为simpleName将更改classWithLongName.otherLongName。
假设您的类型是对象(引用)类型,那么simpleName将最终包含对classWithLongName.otherLongName返回的对象的引用 。 如果随后要对该对象的属性进行大量调用,则可能会提高性能,尤其是在otherLongName是属性而不是字段的情况下。
您始终可以使其成为功能。
SomeType simpleName() { return classWithLongName.otherLongName; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.