如果我写:
SomeType simpleName = classWithLongName.otherLongName;
然后使用“simpleName”而不是“classWithLongName.otherLongName”,这会以任何方式更改程序(例如性能方面)吗?
编译器对此做了什么?它复制+粘贴“classWithLongName.otherLongName”,无论我在哪里使用“simpleName”。
答案 0 :(得分:2)
不,C#编译器不会将对“simpleName
”的调用转换为与复制和粘贴“classWithLongName.otherLongName
”相同。差异可能是深刻的或简单的语义,但您正在做的是将classWithLongName.otherLongName中的值分配给simpleName。类型是值类型还是引用类型将确切地确定发生了什么以及如果操纵该值将会发生什么,但是您没有创建函数指针或委托。
它是否会对性能产生影响确实不是可以在这里得到解决的问题,除了说它不会产生负面影响。我们不能说它是否会产生积极影响,因为这取决于你致电classWithLongName.otherLongName
时实际发生的事情。如果这是一个昂贵的操作,那么这可以使它更快,但缺点是,如果你在classWithLongName.otherLongName
中缓存了它的值,则后续调用simpleName
时的任何价值差异都不会反映出来。 / p>
答案 1 :(得分:1)
这取决于“otherLongName”实际上在做什么。如果它是属性,则区别在于执行属性多次或仅执行一次。这可能会也可能不会以显着的方式改变程序的行为,具体取决于它正在做什么。
答案 2 :(得分:0)
如果编译器知道该值不会在课程中发生变化,那么当您始终键入“classWithLongName.otherLongName
”时,只允许编译器缓存该值并重新使用它。但是,这种情况很少发生。
因此,如果“classWithLongName.otherLongName
”确实执行了一些计算,那么通常可以通过在建议的局部变量中手动缓存它来获得更好的性能。但是,请记住,您正在使用缓存值,并且原始值或属性中的更改不会反映在缓存值中。
然而,名称的长度只是元数据,对运行时性能没有任何影响,因为在编译期间名称已经解析为内部句柄。
答案 3 :(得分:0)
这是关于实例或类的问题吗?
例如
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 ();
答案 4 :(得分:0)
如果classWithLongName.otherLongName是属性,则对simpleName的更改不会更改classWithLongName.otherLongName。
如果classWithLongName.otherLongName是值类型的公共数据成员(字段),则对simpleName的更改不会更改classWithLongName.otherLongName。
如果classWithLongName.otherLongName是引用类型的公共数据成员(字段),则对simpleName的更改将更改classWithLongName.otherLongName。
答案 5 :(得分:0)
假设您的类型是对象(引用)类型,那么 simpleName 将最终包含对 classWithLongName.otherLongName 返回的对象的引用。如果您要对该对象上的属性进行大量调用,那么您可能会获得性能提升,尤其是当 otherLongName 是属性而不是字段时。
答案 6 :(得分:-1)
你可以随时使它成为一种功能。
SomeType simpleName() { return classWithLongName.otherLongName; }