当我写:
string myString = "text";
我在C#中加载了string
类及其所有方法。是否可以在C#中仅加载string
类的一部分?例如,我从Compare
类加载方法Copy
或string
,我不需要它们。
我的问题是由于我需要提高效果,我认为如果可行的话可能会有所帮助。
我的程序在非常大的循环中创建了很多字符串,如果我让string
课程变得更快或更轻,我确信我的表现会有所改善。
答案 0 :(得分:5)
这不是对象/类的工作方式。每次实例化一个对象实例时,你只需为单个对象状态分配空间(在System.String
的情况下,那只是一个内部Char[]
数组) 。对于每个实例化的对象,类成员实现(它们的CIL /指令)不会在内存中加载和复制。
在OOP中,实例方法可以被认为与静态函数完全相同,除了隐藏的第一个参数:this
指针,它被传入。
所以这个:
class Foo {
private String _bar;
public Int32 Baz(String qux) {
return String.Concat( _bar, qux ).Length;
}
}
// Usage:
Foo foo = new Foo();
Console.WriteLine( foo.Baz("lulz") );
相当于:
class Foo {
String bar; // only data members ("state"), no methods/properties
}
// free-function: not a class member
Int32 Baz(Foo this, String qux) {
return String.Concat( this.bar, qux ).Length;
}
// Usage:
Foo foo = new Foo();
Console.WriteLine( Baz( foo, "lulz") );
(显然当你为重载方法添加像vtable这样的东西时,它会更复杂,但这说明了基本的想法)
公平地说,如果你来自Javascript背景并且习惯于通过扩展对象实例(而不是prototype
)来向对象添加方法,我可以看到这种混淆可能来自哪里,但是CLR(和C ++,Java等)并非如此。