是否可以在c#中仅加载一部分类?

时间:2015-02-26 18:51:29

标签: c# performance

当我写:

string myString = "text";

我在C#中加载了string类及其所有方法。是否可以在C#中仅加载string类的一部分?例如,我从Compare类加载方法Copystring,我不需要它们。

我的问题是由于我需要提高效果,我认为如果可行的话可能会有所帮助。

我的程序在非常大的循环中创建了很多字符串,如果我让string课程变得更快或更轻,我确信我的表现会有所改善。

1 个答案:

答案 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等)并非如此。