c#中几个知识点

363 阅读5分钟

在C#中,readonly和static都是关键字,它们的作用不同。readonly表示只读的意思,被标记为readonly的字段只能在声明或者构造函数中被赋值一次,并且不能更改。 而static则表示静态的意思,标记为static的字段或方法是属于类的,而不是属于该类的每个实例。

readonly static本质上是一个静态的只读字段,这意味着该字段是静态的,只能被分配一次,并且它的值将在整个应用程序中保持不变。

相比之下,如果您只想创建一个常量(无论是静态的还是实例化的),则可以使用const关键字。const关键字也会创建只读常量,但与readonly不同, 它们在编译时就会被解析并直接嵌入到IL代码中,因此可读性更强,但是也更加局限。

因此,static、readonly和const三者之间存在很大的区别,并且每种类型都有自己的使用场景。需要根据您的具体需求来选择适当的修饰符。

static 属于类,不是每个实例的,readonly是运行的时候确定,const是编译的时候确定

static修饰的成员属于类,而不属于该类的每个实例。这意味着无论创建多少个对象,这些成员都只有一个副本,它们共享相同的内存位置。因此,可以通过类名直接访问这些静态成员,而不需要先创建对象。

readonly修饰符确保只读字段在运行时被赋值,并且无法改变。它们可以在声明时或在构造函数中初始化,并且一旦被初始化,就不能再更改。因此,readonly字段的值是在运行时确定的。

const关键字用于声明常量,这些常量在编译时被解析为文本。它们在声明时必须进行初始化,且其值必须是编译时可确定的。因此,const字段的值是在编译时确定的。

综上所述,static、readonly和const这三个关键字的作用分别是:静态的共享成员,只读的运行时字段和编译时常量。

在C#中,静态方法是指可以直接从类上调用的方法。而静态类是指只包含静态成员的类,不能实例化该类的对象。因此,静态类只能包含静态成员,即静态方法和静态字段。

如果一个类有静态方法,但并不是静态类,则在该类的实例上也可以调用该静态方法。此时,该方法将使用所调用的实例的类型作为此方法的第一个参数,并且该实例将被忽略。 当然,也可以像静态类一样通过类名直接调用该静态方法。

静态类与非静态类中都可以定义静态方法,但是静态类不能包含实例成员,而非静态类可以包含实例成员(包括实例字段、实例属性和实例方法等)。因此,静态类相对于非静态类更加限制, 只适合表示一组相关的静态函数或常量。

另外需要注意的是,静态方法不能直接访问非静态成员,因为它们没有实例化的对象。如果要访问非静态成员,必须首先创建该类型的实例,然后使用该实例进行访问。

总之,尽管类中可以定义静态方法,但是类本身不必是静态的。静态类只包含静态成员,非静态类可以包含静态和实例成员。选择哪种方式取决于特定的需求和设计约束。

在一般情况下,类中的静态方法不会导致内存泄漏。静态方法只是将方法与类关联起来,而不是与实例关联。因此,即使您不使用该类的任何实例,也不会导致内存泄漏。

然而,如果您的静态方法涉及到处理大量数据或者使用了大量资源,而没有进行必要的释放,那么就有可能发生内存泄漏。例如,如果您的静态方法创建了大量的临时对象, 但未及时清理,那么这些对象将占用内存,从而导致内存泄漏。同样,如果您的静态方法打开了文件、网络连接或数据库连接等资源,但未及时关闭,那么这些资源也将被锁定,从而导致资源泄漏。 因此,在编写静态方法时,必须非常小心地管理资源,确保所有的资源在使用完后得到及时释放。另外,还可以使用一些工具和技术来检查内存泄漏,如内存分析器和代码审查等。

异步调用和多线程都是用于提高程序并发性和响应性的技术,但它们有不同的实现方式。

异步调用指的是在执行某个操作时,如果需要等待某个耗时的任务完成,不会阻塞当前线程,而是将任务提交给另一个线程或进程去执行。在任务执行的过程中,当前线程可以继续执行其他任务,当任务完成后再返回结果,从而提高了程序的响应性能。常见的异步调用方式包括回调函数、Promise对象和async/await语法。

多线程则是指在一个程序中同时运行多个线程,每个线程都可以独立执行,相互之间不会影响。多线程通常使用线程池技术来提高效率,例如在Web服务器中,使用线程池来处理客户端请求。多线程适用于需要同时执行多个任务的场景,但也容易出现线程安全问题,需要采取相应的措施进行保护。

总结来说,异步调用和多线程都是提高程序并发性和响应性的技术,但在实现上有所不同,异步调用适用于需要等待某些任务完成的场景,多线程适用于需要同时执行多个任务的场景,并且需要注意线程安全问题。